EC2インスタンスのCPU使用率が決められた値以上になったらAWS CloudWatchからSlackへ通知を行う。
その設定をしたときの覚書。
手順
- SNSの設定
- CloudWatchの設定
- Incoming WebHooksの設定
- KMSの設定
- Lambdaの設定
- IAMロールの修正
以下特に記述がないものはデフォルト設定。
1. SNS設定
トピック作成
Amazon SNS -> トピック -> トピックの作成
項目 | 設定 |
---|---|
名前 | cloudwatch-alarm |
表示名 | CloudWatch アラーム |
-> トピックの作成
サブスクリプション作成
トピック -> 作成したトピックを選択 -> サブスクリプションの作成
項目 | 設定 |
---|---|
プロトコル | Eメール |
エンドポイント | <通知したいメールアドレス> |
-> サブスクリプションの作成
確認メールの Confirm subscription をクリック
テスト配信
トピック -> 作成したトピックを選択 -> メッセージの発行
項目 | 設定 |
---|---|
件名 | SNS-test-message |
メッセージ本文 | テスト配信です |
-> メッセージの発行
2. CloudWatchの設定
事前準備
事前に以下の設定をしておく。
- AWS CLIのインストール
- IAMでアクセスキーの作成
- AWS CLI configure に Profile を設定
アラーム作成
CloudWatch -> アラーム -> アラーム作成
- メトリクス
項目 | 設定 |
---|---|
インスタンス名 | <任意のEC2インスタンス> |
メトリクス名 | CPUUtilization |
-> 次へ
- 条件
次の項目はお好みで。
項目 | 設定 |
---|---|
よりも | 60 |
アラームを実行するデータポイント | 3/3 |
-> 次へ
- 通知
項目 | 設定 |
---|---|
通知の送信先 | cloudwatch-alarm |
-> 次へ
- 名前と説明
項目 | 設定 |
---|---|
一意の名前を定義 | ec2-CPUUtilization-check |
アラームの説明 | EC2インスタンスのCPU使用率が60%を超えました |
-> 次へ -> アラームの作成
アラームのテスト
aws cloudwatch set-alarm-state --alarm-name "ec2-CPUUtilization-check" --state-value ALARM --state-reason "alarm-test" --profile <事前準備で設定したProfile名>
コマンドオプション
オプション | 説明 |
---|---|
--alarm-name | アラーム名 |
--state-value | ステータス |
--state-reason | アラームの説明 |
3. Incoming WebHooksの設定
https://slack.com/apps/A0F7XDUAZ--incoming-webhook- -> Add to Slack
項目 | 設定 |
---|---|
Post to Channel | <#通知したいSlackチャンネル> |
Customize Name | CloudWatch アラーム |
-> Webhook URLを コピーしておく
4. KMSの設定
KMS -> カスタマー管理型のキー -> キーの作成
項目 | 設定 |
---|---|
エイリアス | cloudwatch-alerm-to-slack |
説明 | Slack App Incoming WebHooks の Webhook URL を暗号化するために使用します |
キーの管理者 | 任意 |
このアカウント | 任意 |
-> 完了 -> ARN をコピーしておく
5. Lambdaの設定
関数の作成
Lambda -> 関数 -> 関数の作成
項目 | 設定 |
---|---|
設計図 | cloudwatch-alarm-to-slack-python |
Function name | cloudwatch-alerm-to-slack |
Execution role | AWS ポリシーテンプレートから新しいロールを作成 |
Role name | cloudwatch-alerm-to-slack |
SNS トピック | cloudwatch-alarm |
トリガーの有効化 | チェックを入れる |
Encryption configuration | Enable helpers for encryption in transit をチェック |
slackChannel | <#通知したいSlackチャンネル> |
kmsEncryptedHookUrl | 3の Webhook URL を入力 -> Encrypt |
AWS KMS key to encrypt in transit | cloudwatch-alerm-to-slack |
-> Encrypt -> 関数の作成
コードの修正
- HOOK_URL = "https://" + boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL))['Plaintext'].decode('utf-8')
+ HOOK_URL = boto3.client('kms').decrypt(CiphertextBlob=b64decode(ENCRYPTED_HOOK_URL))['Plaintext'].decode('utf-8')
alarm_name = message['AlarmName']
#old_state = message['OldStateValue']
new_state = message['NewStateValue']
reason = message['NewStateReason']
+ alarm_description = message['AlarmDescription']
- 'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
+ 'text': "<!here> \nアラーム名: %s\nステータス: %s\nアラーム理由: %s\n説明: %s" % (alarm_name, new_state, reason, alarm_description)
6. IAMロールの修正
IAM -> ロール -> cloudwatch-alerm-to-slack -> AWSLambdaKMSExecutionRole-********-****-****-****-************ -> ポリシーの編集 -> JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1443036478000",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": [
"<4でコピーした ARN>"
]
}
]
}
-> ポリシーの確認 -> 変更の保存
通知テスト
aws cloudwatch set-alarm-state --alarm-name "ec2-CPUUtilization-check" --state-value ALARM --state-reason "alarm-test" --profile <Profile名>
参考
以下の記事を参考にさせていただきました。ありがとうございます