@see
https://qiita.com/taquaki-satwo/items/c9c196c1642cad626661
もくじ
AWS SNSの作成
Amazon SNS -> トピック -> トピックの作成
- 名前
hoge-cloudwatch-alarm - 表示名
hoge CloudWatch alarm
サブスクリプションの作成
トピック -> 作成したトピックを選択 -> サブスクリプションの作成
プロトコル | Eメール |
エンドポイント | <通知したいメールアドレス> |
-> サブスクリプションの作成
確認メールの Confirm subscription をクリック
テスト配信
トピック -> 作成したトピックを選択 -> メッセージの発行
項目 | 設定 |
---|---|
件名 | SNS-test-message |
メッセージ本文 | テスト配信です |
-> メッセージの発行
AWS Cliのインストール
$ brew install awscli
$ aws --version aws-cli/1.16.261 Python/2.7.10 Darwin/18.7.0 botocore/1.12.251
$ aws configure --profile kanehiro-cloudwatch AWS Access Key ID [None]: xxxxxxxxxx AWS Secret Access Key [None]: yyyyyyyyy Default region name [None]: ap-northeast-1 Default output format [None]: json
確認
$ aws configure list --profile kanehiro-cloudwatch Name Value Type Location ---- ----- ---- -------- profile kanehiro-cloudwatch manual --profile access_key ****************xxx shared-credentials-file secret_key ****************yyy shared-credentials-file region ap-northeast-1 config-file ~/.aws/config
アラーム作成
CloudWatch -> アラーム -> アラーム作成
- メトリクス
項目 | 設定 |
---|---|
インスタンス名 | <任意のRDSインスタンス> |
メトリクス名 | CPUUtilization |
-> 次へ
- 条件
次の項目はお好みで。
項目 | 設定 |
---|---|
よりも | 70 |
アラームを実行するデータポイント | 3/3 |
-> 次へ
アラーム名
hoge-DB-CPUUtilization-check
アラームの説明 – オプション
DBインスタンスのCPU使用率が70%を超えました
テスト
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を コピーしておく
Lambda
関数の作成
設計図の使用 -> cloudwatch-alarm-to-slack-python
トリガーにSNSのトピック名「hoge-cloudwatch-alarm」を指定する
EC2用Lambda
import boto3 import json import logging import os from base64 import b64decode from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError # The base-64 encoded, encrypted key (CiphertextBlob) stored in the kmsEncryptedHookUrl environment variable # ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl'] # The Slack channel to send a message to stored in the slackChannel environment variable SLACK_CHANNEL = os.environ['slackChannel'] HOOK_URL = os.environ['hookUrl'] logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info("Event: " + str(event)) message = json.loads(event['Records'][0]['Sns']['Message']) logger.info("Message: " + str(message)) instanceid = message['Trigger']['Dimensions'][0]['value'] alarm_name = message['AlarmName'] new_state = message['NewStateValue'] reason = message['NewStateReason'] alarm_description = message['AlarmDescription'] slack_message = { 'channel': SLACK_CHANNEL, 'text': "<!channel> \nアラーム名: %s\nステータス: %s\nアラーム理由: %s\n説明: %s\nインスタンス: %s" % (alarm_name, new_state, reason, alarm_description, instanceid) } req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8')) try: response = urlopen(req) response.read() logger.info("Message posted to %s", slack_message['channel']) except HTTPError as e: logger.error("Request failed: %d %s", e.code, e.reason) except URLError as e: logger.error("Server connection failed: %s", e.reason)
タイムアウトは10秒
環境変数の
- slackChannel
通知したいスラックチャンネル名 // #は含まない - hookUrl
Slackのwebhook URL
テスト
$ aws cloudwatch set-alarm-state --alarm-name "ec2-CPUUtilization-check" --state-value ALARM --state-reason "alarm-test" --profile <事前準備で設定したProfile名>
SES用Lamda関数
import boto3 import json import logging import os from base64 import b64decode from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError # The base-64 encoded, encrypted key (CiphertextBlob) stored in the kmsEncryptedHookUrl environment variable # ENCRYPTED_HOOK_URL = os.environ['kmsEncryptedHookUrl'] # The Slack channel to send a message to stored in the slackChannel environment variable SLACK_CHANNEL = os.environ['slackChannel'] HOOK_URL = os.environ['hookUrl'] logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info("Event: " + str(event)) message = json.loads(event['Records'][0]['Sns']['Message']) logger.info("Message: " + str(message)) alarm_name = message['AlarmName'] new_state = message['NewStateValue'] reason = message['NewStateReason'] alarm_description = message['AlarmDescription'] slack_message = { 'channel': SLACK_CHANNEL, 'text': "<!channel> \nアラーム名: %s\nステータス: %s\nアラーム理由: %s\n説明: %s\n" % (alarm_name, new_state, reason, alarm_description) } req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8')) try: response = urlopen(req) response.read() logger.info("Message posted to %s", slack_message['channel']) except HTTPError as e: logger.error("Request failed: %d %s", e.code, e.reason) except URLError as e: logger.error("Server connection failed: %s", e.reason)
タイムアウトは10秒
環境変数の
- slackChannel
通知したいスラックチャンネル名 // #は含まない - hookUrl
Slackのwebhook URL
Lambda関数のデバッグ
アラームの閾値を下げて、Lambdaを発火させてCloudWachのログを見てください。
def lambda_handler(event, context): logger.info("Event: " + str(event)) message = json.loads(event['Records'][0]['Sns']['Message']) logger.info("Message: " + str(message)) + print(message)
print(message)とかやってCloudWatchのログを見る
自己責任で外部サイトなどでJSONの整形して見るとコーディングしやすい。下記サイトはシングルクォートでも整形してくれる。
https://www.en-pc.jp/tech/jsonformat.php#result