Amazon CloudWatchアラートをトリガーとして、EC2インスタンス上でシェルスクリプトを実行することは可能です。その際には、CloudWatchアラートとEC2インスタンス間の中継として Amazon Simple Notification Service (SNS) や AWS Systems Manager を使用します。
以下は、実現方法の一般的な手順です。
方法 1: SNS + AWS Lambda + EC2 インスタンス
- CloudWatchアラートを作成
- 必要なメトリクス(例: CPU使用率、メモリ使用率、ディスクI/Oなど)に基づいてアラートを設定します。
- アクションとしてSNSトピックを指定します。
- SNSトピックを作成
- SNSトピックを作成し、CloudWatchアラートの通知先として設定します。
- 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
- EC2インスタンスでSSMエージェントを有効化
- EC2インスタンスに SSMエージェント をインストールし、有効化します(最新のAmazon LinuxやUbuntuでは通常プリインストールされています)。
- インスタンスに適切なIAMロール(
AmazonSSMManagedInstanceCore
ポリシーが含まれる)をアタッチします。
方法 2: SNS + EC2インスタンス(直接通知)
- CloudWatchアラートを作成
- 上記と同様に、SNSトピックを通知先として指定します。
- 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
- CloudWatchアラートをEventBridgeルールに送信
- CloudWatchアラートの通知先としてEventBridgeルールを作成します。
- EventBridgeルールでSSMをトリガー
- EventBridgeのターゲットとして、AWS Systems ManagerのRun Commandを指定します。
- コマンドにスクリプト実行を指定します。
推奨方法
- AWS Systems Manager (SSM) を使用する方法(方法1または方法3)は、より安全かつシンプルです。これにより、直接インスタンスにSSH接続する必要がなくなり、セキュリティが向上します。
- 必ずIAMロールのポリシーやセキュリティグループの設定を適切に構成してください。