チュートリアル: アプリケーションの依存関係の更新、インスタンスへのパッチ適用、およびアプリケーション固有のヘルスチェックの実行 - AWS Systems Manager

チュートリアル: アプリケーションの依存関係の更新、インスタンスへのパッチ適用、およびアプリケーション固有のヘルスチェックの実行

多くの場合、マネージドインスタンスは、最新のソフトウェア更新プログラムでパッチを適用した後に再起動する必要があります。ただし、安全対策を講じずに本番環境でインスタンスを再起動すると、アラームのトリガー、不正なメトリクスデータの記録、データ同期の中断など、いくつかの問題が発生する可能性があります。

このチュートリアルでは、Systems Manager ドキュメント AWS-RunPatchBaselineWithHooks を使用して、このような問題を回避する方法を学習します。これにより、複雑なマルチステップのパッチ適用オペレーションを実現し、以下のことを達成できます。

  1. アプリケーションへの新しい接続を防止

  2. オペレーティングシステムの更新のインストール

  3. アプリケーションのパッケージの依存関係の更新

  4. システムの再起動

  5. アプリケーション固有のヘルスチェックの実行

この例では、インフラストラクチャを次のようにセットアップしました。

  • 対象の仮想マシンは、マネージドインスタンスとして Systems Manager に登録されます。

  • Iptables はローカルファイアウォールとして使用されます。

  • インスタンスでホストされているアプリケーションは、ポート 443 で実行されています。

  • インスタンスでホストされるアプリケーションは nodeJS アプリケーションです。

  • インスタンスでホストされるアプリケーションは、pm2 プロセスマネージャーによって管理されます。

  • アプリケーションには、指定したヘルスチェックエンドポイントが既に存在します。

  • アプリケーションのヘルスチェックエンドポイントは、エンドユーザー認証を必要としません。エンドポイントにより、可用性を確立する際に組織の要件を満たすヘルスチェックを行うことが可能になります。(お使いの環境では、nodeJS アプリケーションが実行中であり、リクエストをリッスンできることを確認するだけで十分です。それ以外の場合は、キャッシュレイヤーまたはデータベースレイヤーへの接続が既に確立されていることを確認することもできます)。

このチュートリアルの例は、デモンストレーションのみを目的としており、本番環境にそのまま実装することを意図していません。また、AWS-RunPatchBaselineWithHooks ドキュメントを使用した Patch Manager のライフサイクルフック機能は、他の数多くのシナリオをサポートできることに留意してください。ここにいくつか例を挙げます。

  • インスタンスの再起動後にパッチを適用して再起動する前に、メトリクスレポートエージェントを停止します。

  • パッチを適用する前に、CRM または PCS クラスターからインスタンスをデタッチし、インスタンスの再起動後に再アタッチします。

  • オペレーティングシステム (OS) の更新が適用された後、インスタンスが再起動する前に、Windows Server マシン上のサードパーティーソフトウェア (Java、Tomcat、Adobe アプリケーションなど) を更新します。

アプリケーションの依存関係を更新し、インスタンスにパッチを適用し、アプリケーション固有のヘルスチェックを実行するには

  1. preinstallation スクリプトの Systems Manager ドキュメント (SSM ドキュメント) を次の内容で作成し、NodeJSAppPrePatch と名前を付けます。your_application をアプリケーションの名前に置き換えます。

    このスクリプトは、新しい受信リクエストを直ちにブロックし、既にアクティブなリクエストが完了するまで 5 秒間待ってからパッチ適用操作を開始します。sleep オプションでは、受信リクエストが完了するのに通常かかる秒数よりも長い秒数を指定します。

    # exit on error set -e # set up rule to block incoming traffic iptables -I INPUT -j DROP -p tcp --syn --destination-port 443 || exit 1 # wait for current connections to end. Set timeout appropriate to your application's latency sleep 5 # Stop your application pm2 stop your_application

    SSM ドキュメントの作成の詳細については、「Systems Manager ドキュメントの作成」を参照してください。

  2. postinstall スクリプト用に次の内容を含む別の SSM ドキュメントを作成し、アプリケーションの依存関係を更新し、NodeJSAppPostPatch と名前を付けます。/your/application/path をお使いのアプリケーションへのパスに置き換えます。

    cd /your/application/path npm update # you can use npm-check-updates if you want to upgrade major versions
  3. アプリケーションをバックアップし、ヘルスチェックを実行するには、onExit スクリプト用に次の内容を含む別の SSM ドキュメントを作成します。この SSM ドキュメント NodeJSAppOnExitPatch の名前を指定します。your_application をアプリケーションの名前に置き換えます。

    # exit on error set -e # restart nodeJs application pm2 start your_application # sleep while your application starts and to allow for a crash sleep 10 # check with pm2 to see if your application is running pm2 pid your_application # re-enable incoming connections iptables -D INPUT -j DROP -p tcp --syn --destination-port # perform health check /usr/bin/curl -m 10 -vk -A "" http://localhost:443/health-check || exit 1
  4. 以下の手順を実行して、オペレーションを発行する ステートマネージャー との関連付けを作成します。

    1. https://console.aws.amazon.com/systems-manager/ で AWS Systems Manager コンソールを開きます。

    2. ナビゲーションペインで、[ステートマネージャー] を選択し、[Create association (関連付けの作成)] を選択します。

    3. [Name (名前)] に、関連付けの目的を特定するのに役立つ名前を指定します。

    4. [Document (ドキュメント)] リストで、[AWS-RunPatchBaselineWithHooks] を選択します。

    5. [Operation (オペレーション)] で、[Install (インストール)] を選択します。

    6. (オプション) [Snapshot Id] では、GUID を指定します。これは、オペレーションの高速化と一貫性の確保のために生成します。この GUID は 00000000-0000-0000-0000-111122223333 と同じくらいシンプルです。

    7. [Pre Install Hook Doc Name (インストール前のフックドキュメント名)] に、「NodeJSAppPrePatch」と入力します。

    8. [Post Install Hook Doc Name (インストール後のフックドキュメント名)] に、「NodeJSAppPostPatch」と入力します。

    9. [On ExitHook Doc Name (ExitHook ドキュメント名)] に、「NodeJSAppOnExitPatch」と入力します。

  5. [Targets (ターゲット)] では、インスタンスタグを指定するか、手動でインスタンスを選択するか、リソースグループを選択するか、またはすべてのインスタンスを選択することで、インスタンスを特定します。

  6. [Specify schedule (スケジュールの指定)] では、関連付けを実行する頻度を指定します。例えば、パッチ適用では、週に 1 回が一般的な頻度です。

  7. [レート制御] セクションで、複数のインスタンスでの関連付けの実行方法を制御するオプションを選択します。一度に更新されるのは一部のインスタンスであることを確認します。そうしないと、フリートのすべてまたはほとんどを同時にオフラインにすることになってしまいます。レート制御については、「ステートマネージャー 関連付けのターゲットとレート制御について」を参照してください。

  8. (オプション) [出力オプション] で、コマンド出力をファイルに保存するには、[S3 への出力の書き込みを有効にします] ボックスをオンにします。ボックスにバケット名とプレフィックス (フォルダ) 名を入力します。

    注記

    S3 バケットにデータを書き込む機能を許可する S3 アクセス許可は、このタスクを実行する IAM ユーザーのものではなく、インスタンスに割り当てられたインスタンスプロファイルのものです。詳細については、「Systems Manager の IAM インスタンスプロファイルを作成する」を参照してください。さらに、指定された S3 バケットが別の AWS アカウントにある場合は、インスタンスに関連付けられたインスタンスプロファイルに、そのバケットへの書き込みに必要なアクセス許可があることを確認してください。

  9. [関連付けの作成] を選択します。