端くれプログラマの備忘録 AWS [AWS] CloudWatchアラーム発生時にEC2上のシェルスクリプトを実行するには?

[AWS] CloudWatchアラーム発生時にEC2上のシェルスクリプトを実行するには?

Amazon CloudWatchアラートをトリガーとして、EC2インスタンス上でシェルスクリプトを実行することは可能です。その際には、CloudWatchアラートとEC2インスタンス間の中継として Amazon Simple Notification Service (SNS)AWS Systems Manager を使用します。

以下は、実現方法の一般的な手順です。

方法 1: SNS + AWS Lambda + EC2 インスタンス

  1. CloudWatchアラートを作成
    • 必要なメトリクス(例: CPU使用率、メモリ使用率、ディスクI/Oなど)に基づいてアラートを設定します。
    • アクションとしてSNSトピックを指定します。
  2. SNSトピックを作成
    • SNSトピックを作成し、CloudWatchアラートの通知先として設定します。
  3. AWS Lambda関数を作成
    • SNS通知をトリガーとして起動するLambda関数を作成します。
    • このLambda関数から AWS Systems Manager (SSM) Run Command を使用して、EC2インスタンス上のスクリプトを実行します。 Lambda関数の例(Python):
   import boto3

   def lambda_handler(event, context):
       ssm_client = boto3.client('ssm')
       instance_id = 'i-0123456789abcdef0'  # EC2インスタンスのIDを指定
       command = 'bash /path/to/your/script.sh'

       response = ssm_client.send_command(
           InstanceIds=[instance_id],
           DocumentName='AWS-RunShellScript',
           Parameters={'commands': [command]},
       )
       return response
  1. EC2インスタンスでSSMエージェントを有効化
    • EC2インスタンスに SSMエージェント をインストールし、有効化します(最新のAmazon LinuxやUbuntuでは通常プリインストールされています)。
    • インスタンスに適切なIAMロール(AmazonSSMManagedInstanceCore ポリシーが含まれる)をアタッチします。

方法 2: SNS + EC2インスタンス(直接通知)

  1. CloudWatchアラートを作成
    • 上記と同様に、SNSトピックを通知先として指定します。
  2. EC2上でSNSメッセージを受信
    • EC2インスタンス上に SNSサブスクライバ を設定します。
    • SNSメッセージを受信するHTTPエンドポイントを作成するか、ポーリングするスクリプトを実行します。 スクリプト例(SNSメッセージをポーリングする方法):
   #!/bin/bash

   while true; do
       aws sns receive-message --queue-url "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue" \
           | jq -r '.Messages[].Body' | while read message; do
           echo "SNS Message: $message"
           bash /path/to/your/script.sh
       done
       sleep 10
   done

方法 3: CloudWatchアラート + EventBridge + SSM

  1. CloudWatchアラートをEventBridgeルールに送信
    • CloudWatchアラートの通知先としてEventBridgeルールを作成します。
  2. EventBridgeルールでSSMをトリガー
    • EventBridgeのターゲットとして、AWS Systems ManagerのRun Commandを指定します。
    • コマンドにスクリプト実行を指定します。

推奨方法

  • AWS Systems Manager (SSM) を使用する方法(方法1または方法3)は、より安全かつシンプルです。これにより、直接インスタンスにSSH接続する必要がなくなり、セキュリティが向上します。
  • 必ずIAMロールのポリシーやセキュリティグループの設定を適切に構成してください。