Amazon Web Services ブログ
AWS Organizations 全体でマネージドノードの AWS Systems Manager エージェントのステータスを集中監視およびアラート通知する方法
このブログは AWS のクラウドサポートエンジニア Charles Adebayo と Suhail Fouzan によって執筆された内容を⽇本語化したものです。原⽂はこちらを参照して下さい。
オンプレミスまたは Amazon Elastic Compute Cloud (Amazon EC2) 上の重要なサーバーで実行されている AWS Systems Manager エージェント (SSM エージェント) が、何らかの理由で AWS Systems Manager (SSM) との正常な接続を失った際に、プロアクティブな通知を受けたいと思ったことはありませんか? SSM エージェントのステータスの可視性を高め、ダッシュボードで監視したいと思ったことはありませんか?このブログ記事では、これらの目的を達成するための自動化された仕組みについて説明します。
この投稿では、AWS Organizations 内の重要なマネージドノードで実行されている SSM エージェントのステータスを中央管理用の Amazon CloudWatch ダッシュボードでモニタリングする方法と、SSM エージェントが AWS Systems Manager との正常な接続を失ったときに、指定した Amazon Notification Service (SNS) トピックにメッセージを送信するように Amazon CloudWatch アラームを設定する方法を示します。E メールまたは携帯電話番号を SNS トピックに登録すると、Amazon CloudWatch アラームがアクティブになるたびにアラートを受け取ることができます。 監視対象の重要なマネージドノード (Amazon EC2 インスタンスでもオンプレミスノードでもかまいません) は、これらのリソースに適用した特定のタグ (env: prod や ssmMonitoring: True など) を使用して、他のノードと区別することができます。
ソリューション概要
このソリューションは以下のサービスによって実現されます:
- AWS CloudFormation
- AWS Lambda function
- AWS Identity and Access Management (IAM)
- AWS Systems Manager (SSM)
- Amazon CloudWatch
- Amazon Simple Notification Service (SNS)
- AWS Organizations
- Amazon EventBridge
図 1: ソリューション図
このソリューションでは、AWS Lambda 関数が特定のタグとリージョンによって識別された AWS Organizations 内の重要なマネージドノード上の SSM エージェントの接続状態をチェックし、その結果を PingStatus メトリクスとして中央管理用の Amazon CloudWatch ダッシュボードへレポートします。マネージドノードが Systems Manager に正常に接続されている場合、 DescribeInstanceInformation API の PingStatus は Online
となります。Lambda 関数は Amazon CloudWatch に PingStatus メトリクスを作成します。これにより、PingStatus が Online
のときはメトリクス値が 0 になり、それ以外の場合は 1 になります。 また、Lambda 関数は重要なマネージドノードに対応する Amazon CloudWatch アラームを作成し、アラームがアクティブになった際に所定の SNS トピックへメッセージを送信するように設定します。この Lambda 関数は Amazon EventBridge カスタムルールによって定期的に呼び出されます。Lambda 関数を呼び出す頻度は Amazon EventBridge ルールで定義できます。
作成するアーキテクチャのワークフローは以下のとおりです:
- ターゲットアカウントの Lambda 関数 IAM ロールを引き受けます。
- AWS EventBridge ルールは、スケジュールに従って (例えば 15 分ごとに) Lambda 関数を呼び出します。
- AWS Lambda 関数は、指定した特定のタグを持つマネージドノードの SSM エージェントの正常性ステータスをチェックし、Amazon CloudWatch のカスタムメトリクス PingStatus にデータポイントを Publish します。この Lambda 関数は、マネージドノードが追加された際には 他の CloudWatch API も呼び出して PingStatus メトリクスに対応する CloudWatch アラームを設定し、必要に応じてターゲットとなる Amazon SNS トピックを設定し、さらに Amazon CloudWatch ダッシュボードを作成または更新します。
- タグ付けされた実行中のインスタンスが Systems Manager に表示されないか PingStatus が
Online
以外の場合、CloudWatch の PingStatus メトリクス値を 1 に設定します。 Systems Manager 上の PingStatus がOnline
の場合、CloudWatch のメトリクス値を 0 に設定します。 - いずれかのマネージドノードの PingStatus メトリクスが 1 に変わるとアラームがアクティブになり、Amazon SNS トピックのサブスクライバーに通知が送信されます。
- ソリューションによって監視されていたインスタンスが終了するかモニタリングタグが削除された場合、次回 Lambda 関数が呼び出されて CloudWatch ダッシュボードが更新されるときに、対応するアラームが削除されます。
前提条件
このチュートリアルでは、次の要素が揃っている必要があります:
- AWS アカウントまたは AWS アカウントのリストまたは AWS Organizations
- オンプレミスまたは Amazon EC2 の AWS SSM マネージドノード
- マネージドノードに適用されるタグ (例: SSMMonitoring: True)
- 中央管理ダッシュボードと同じリージョンの Amazon SNS トピック。SNS トピックのサブスクライバーは E メール、SMS などでもかまいません。
ウォークスルー
このソリューション用にデプロイする CloudFormation テンプレートは 2 つあります:
- AWS Organizations のすべてのアカウントまたは特定の AWS アカウントに IAM ロールを作成します。 これらの IAM ロールは、次のステップで作成される SSMPingStatus Lambda 関数に引き継がれます。
- 提供されている CloudFormation テンプレートを使用して、任意の中央管理ダッシュボードリージョンとアカウントで CloudFormation スタックを起動し、SSMPingStatus モニタリングソリューションをデプロイします。 この CloudFormation テンプレートは、必要なコンポーネント (AWS Lambda 関数、CloudWatch アラーム (オプション)、Amazon EventBridge ルール、AWS CloudWatch ダッシュボード) を作成します。
ステップ 1: CloudFormation テンプレートと CloudFormation StackSets を使用して IAM ロールをデプロイします。
- CloudFormation テンプレートをダウンロードします。
- Organizations の管理アカウントまたは CloudFormation 委任管理者の AWS CloudFormation コンソールに移動します。
- ナビゲーションペインから StackSets を選択します。
- StackSets ページの右上にある StackSet を作成 を選択します。
- 前提条件 – テンプレートの準備 で テンプレートの準備完了 を選択します。
- テンプレートの指定 で テンプレートファイルのアップロード を選択し、 ファイルの選択 からステップ 1 でダウンロードしたファイルを選択して、 次へ を選択します。
- StackSet の詳細を指定 ページで、次の手順を実行します:
- StackSet 名 とStackSet の説明 欄に SSMPingStatus-IAMRole を入力します。
- パラメータ の CentralAccount に、ソリューションをホストするモニタリングアカウントのアカウント ID を入力します。
- AWSSSMPingStatusCrossAccountRoleName にはデフォルト値の AWS-Lambda-SSMPingStatus-Cross-Account-Role のままにするか、Lambda が中央管理アカウントから引き継ぐ IAM ロールのカスタム名を入力します。
- 次へ をクリックします。
図 2: CloudFormation StackSet のパラメーター
- StackSet オプションの設定 ページで必要に応じてタグを指定し、AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します をチェックして 次へ を選択します。
- デプロイオプションの設定 ページの リージョンを指定 で、目的のリージョン(us-east-1 など)を選択します。今回作成するのはグローバルリソースである IAM リソースだけなので、1 つのリージョンのみを選択して 次へ をクリックします。
- すべての情報を確認して 送信 をクリックします。
- ページを更新すると StackSet のステータスが RUNNING になっているはずです。 ステータスが SUCCEEDED に変わったら、次のセクションに進んでください。 図 3 に示すように、CloudFormation StackSet コンソールの スタックインスタンス タブで個々のスタックインスタンスの結果を確認できます。
注: ドキュメントによると、CloudFormation StackSets は、管理アカウントが組織内または組織内の OU にあっても、スタックインスタンスを組織の管理アカウントにデプロイしません。 したがって、管理アカウントまたは委任管理者アカウントをこの監視ソリューションの対象として含める場合は、管理アカウントまたは委任管理者アカウントのスタックとして IAM ロール SSMAgent_IAM_role.yml を作成する必要があります。
図 3: CloudFormation StackSets のターゲットアカウントのステータス
ステップ 2: CloudFormation テンプレートを使用して SSMPingStatus ソリューションをデプロイする
- CloudFormation テンプレートをダウンロードします。
- SSM エージェントのステータスをモニタリングする AWS アカウントの CloudFormation コンソールに移動します。
- スタックの作成 で 新しいリソースを使用 (標準) を選択します。
- テンプレートソース で テンプレートファイルのアップロード を選択します。 ファイルの選択 から、ステップ 1 でダウンロードしたテンプレートを指定します。
- 次へ をクリックします。
- スタック名として SSMPingStatus と入力します。
- パラメータ で、以下の通り AWS CloudFormation スタックのパラメータを指定します:
- Target では、AWS Organizations 内のすべてのアカウントをターゲットにする場合は AWS Organization を、特定のアカウントをターゲットにする場合は Accounts を選択します。注:Target パラメータが AWS Organization の場合、このスタックは管理アカウントまたは AWS サービスの委任管理者のいずれかにデプロイする必要があります。 ただし、Target パラメータが Accounts の場合は、AWS Organizasions のどのアカウントでもこのソリューションを起動できます。
- (オプション) TargetAccounts では、上記 7.1 のステップで Accounts を選択した場合は監視対象のマネージドノードをホストしているアカウントのリストをカンマで区切って入力します (例:1111111111,222222222,333333333)。 それ以外の場合は空白のままにしてください。
- TargetRegionIds では、監視対象のマネージドノードをホストするリージョンのリストをカンマで区切って入力します (例:us-east-1,us-east-2,eu-west-2)。
- Tag では、 CloudWatch でモニタリングする特定のマネージドノードのタグの key:value のペアを入力します (例: SSMMonitoring:true)。
- EventBridgeSchedule では、モニタリングソリューションの実行頻度を cron 形式で入力します。 例えば、 cron(0/15 * * * ? *) は 15 分間隔のスケジュールです。この設定により、マネージドノードのステータスをトラックするために Lambda 関数が呼び出される頻度が決まります。使用されるタイムゾーンは UTC です。詳細については、Amazon EventBridge schedule を参照してください。
- CrossAccountExecutionRoleName では、ステップ 1 でターゲットとなる全 AWS アカウントで作成した Lambda が使用するロールの名前を入力します (例:AWS-Lambda-SSMPingStatus-Cross-Account-Role)。
- CloudwatchCentralDashboardRegion では、アカウントやリージョンをまたいでマネージドノードをトラックするために Amazon CloudWatch ダッシュボードを作成するリージョンの名前を入力します (例:us-east-1)。
- CreateCloudWatchAlarm では、監視対象のマネージドノードごとにアラームを作成する場合は true を、それ以外の場合は false を入力します。
- (オプション) SNSTopicArn では、CreateCloudWatchAlarm パラメータが true の場合に CloudWatch アラームのターゲットとして使用される SNS トピックの Amazon リソースネーム (ARN) を入力します。
- RetainCloudWatchResourcesOnDelete では、スタック削除操作時に CloudWatch アラームとダッシュボードを保持したい場合は true を入力し、それ以外の場合は false のままにします。
図 4: CloudFormation テンプレートのパラメーター
- スタックオプションの設定 ページで必要に応じてタグを指定し、AWS CloudFormation によって IAM リソースが作成される場合があることを承認します をチェックして 次へ を選択します。
- 確認して作成 ページですべての情報を確認して 送信 をクリックします。
テンプレートがデプロイされたら、出力 タブを選択し、図 5 に示すように次の値を書き留めます:
- AWSLambdaSSMPingStatusRoleName
- EventBridgeRule
- SSMPingStatusLambdaFunctionName
図 5: CloudFormation の出力タブ
モニタリングダッシュボードの表示
- Amazon CloudWatch コンソールに移動します。
- 左上のメニューで ダッシュボード を選択します。
- カスタムダッシュボード で AWSOrganization-SSMAgentPingStatus を選択します。
図 6: 特定のタグが付与されたマネージドノード用の Amazon CloudWatch ダッシュボード
注: 上のスクリーンショットの 4 つのウィジェットはそれぞれ、CloudFormation スタックのデプロイ時に指定されたタグによって監視対象と識別されたマネージドノードを表しています。 マネージドノードが見つからない場合、グラフ化されたウィジェットは表示されません。
インスタンスウィジェットの 1 つをクリックして拡大することもできます:
図 7: 特定のマネージドノードの PingStatus の値が 1 であることを示す CloudWatch ダッシュボード
作成された CloudWatch アラームの表示
マネージドノードの PingStatus メトリクスが 1.0 になると CloudWatch アラームがアクティブになり、SNS トピックのサブスクライバーに通知が送信されます (CloudFormation テンプレートのパラメータでアラーム設定が有効になっている場合)。 これをシミュレートするには、インスタンスにログオンして SSM エージェントサービスを停止するか、マネージドインスタンスをシャットダウンして EventBridge ルールによる Lambda 関数の次の呼び出しを待ちます。アラームは以下の手順で表示します:
- Amazon CloudWatch コンソールに移動します。
- 左上のメニューで アラーム を選択します。
- アラーム状態 を選択すると、図 8 に示すように、現在アラーム状態になっているすべてのインスタンスが表示されます。
図 8: アラームがアクティブ化された特定のマネージドノードを示す CloudWatch Alarm ダッシュボード
- 図 9 に示すように、ソリューションで提供されている SNS トピックに E メール通知が送信されます。
図 9: アラームがアクティブになったときの電子メール通知
マネージドノードとして報告されない、または ConnectionLost のステータスが報告されるサーバーを修正するにはこのガイドを参照してください。 ソリューションの導入コストは、マネージドインスタンスが 50 個の場合、概算で 1 か月あたり 20 ドル ~ 25 ドルです。
クリーンアップ
今後料金が発生しないようにするには、 CloudFormation スタックとスタックセットを削除してリソースを削除してください。 CloudFormation によって作成されたリソースをクリーンアップするには以下の手順を実施します:
- 子アカウントの SSMPingStatus-IAMRole を作成するために使用した Organizations の管理アカウントまたは CloudFormation 委任管理者の AWS CloudFormation コンソールに移動します。
- モニタリングアカウントに移動し、モニタリングアカウントのソリューション作成のために使用した SSMPingStatus という名前の CloudFormation スタックを削除します。
- AWS CloudFormation コンソールを開き、ナビゲーションペインで スタック を選択します。
- SSMPingStatus という名前の CloudFormation スタックを選択し、削除 を選択し、スタックの削除 を選択します。
まとめ
このソリューションをデプロイし、Amazon CloudWatch ダッシュボードと CloudWatch アラームを利用して SSM エージェントの状態を監視することで、AWS Organizations 内のマネージドノード全体で SSM エージェントのオブザーバビリティが向上しました。 これにより、応答時間が短縮され、フリート内の重要なサーバー全体で SSM エージェントの問題が解決され、SSM エージェントの障害による全体的なダウンタイムが短縮されます。 このソリューションをさらに拡張して、マネージドノード用に作成された CloudWatch アラームがアクティブになるたびに AWS Systems Manager Incident Manager のインシデントを作成することもできます。 さらに、Amazon EventBridge ルールを使用して CloudWatch アラームを監視し、カスタム修復/プレイブックをルールのターゲットとして定義することもできます。