
@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


