CloudWatch カスタムメトリクスを色々監視する
にてカスタムメトリクスを導入しました。
これでアラートを設定すると登録したメールアドレスに対して通知が来ます。
これでは、見落としがちなので、今回はSlackに通知するようにしたいと思います。
CloudWatch → Lambda → Slack
の流れでSlackに通知します。
CloudWatchのアラートをLambdaで受けてSlackに流す形です。
#アラーム設定
まずはアラームを設定します。
####監視したいメトリクスにチェックを入れる
####グラフ化したメトリクスタブを開く
ベールマークをクリックする。
####アラーム登録
通知メールは受信可能なメールアドレスを登録します。
通知は、状態が切り替わった時に一回だけされます。
そのため、OKと警告の通知はセットで登録しておくことをおすすめします(+不足も登録しておいてもいいです)。不足状態は、アラーム設定対象のメトリクスが計測不可能な状態になった時になります。
例)
OK→警告 警告の通知が来ます。
警告→OK OKの通知が来ます。
これで、設定したメールアドレスに対してアラートの通知が来ます。
#Slackの準備
https://slack.com/apps
から、「Incoming WebHooks」を「Add Configuration」を押して、追加します。
通知するチャンネルを選択します(cloudwatchチャンネルを選択しました)。
登録すると、以下の「Webhook URL」が発行されるので記憶しておく。
#Lambdaの設定
一応料金確認。まあアラームだけでそんなにいかないので無料枠で全然いけます。
https://aws.amazon.com/jp/lambda/pricing/
無料利用枠
1,000,000 件のリクエスト
USD/月
400 GB-秒
1 か月あたりのコンピューティング時間.Lambda の無料利用枠は、12 か月間の AWS 無料利用枠の期間が終了しても自動的に期限切れになることはありません。既存および新規の AWS のお客様は、無期限にご利用いただけます。
###IAMのKMSで暗号キーでWebhookURLを暗号化
※無料枠で使いたい方はここをすっ飛ばして「関数作成」に移ってください。以下の感じで料金がかかります。
Lambdaのcloudwatch-alarm-to-slackで無料と思ってKMS暗号化キーを使ったら2円かかったので関数修正した
IAM > 暗号化キー > キーの作成 から暗号化キーを作成します。
名前は「cloudwatch-alarm-to-slack」にしました。
タグ名は適当に。
キーの管理および使用許可を設定します。今回はどっちも「admin」にしました。
以下のようにできました。
EC2へログインし、以下コマンドを実行します(aws configureしていない場合はしてください)。
$ aws kms encrypt --key-id alias/cloudwatch-alarm-to-slack --plaintext "hooks.slack.com/services/************************"
うまくいくと以下のように暗号化されたWebhookURLが取得できます。
「CiphertextBlob」がそうです。
{
"KeyId": "arn:aws:kms:ap-northeast-1:395:key/**************",
"CiphertextBlob": "*********************************"
}
※以下のようにnot foundと言われる時は暗号化キーのリージョンを確認してみてください。
$ aws kms encrypt --key-id alias/cloudwatch-alarm-to-slack --plaintext "hooks.slack.com/services/************************"
An error occurred (NotFoundException) when calling the Encrypt operation: Alias arn:aws:kms:ap-northeast-1:*********:alias/cloudwatch-alarm-to-slack is not found.
###関数作成
「cloudwatch-alarm-to-slack」にします(node.jsです)。
「slackChannel」は流したいチャンネル。
「kmsEncryptedHookUrl」は暗号化したWebhookURLを設定する。
登録するとSlackにアラートが通知されるようになります。
###コード修正
processEvent()のslackMessageを編集することで通知メッセージをいじることができます。
以下のように設定しました。
function processEvent(event, callback) {
const message = JSON.parse(event.Records[0].Sns.Message);
const alarmName = message.AlarmName;
//var oldState = message.OldStateValue;
const newState = message.NewStateValue;
const reason = message.NewStateReason;
var stamp;
if (newState === "ALARM") {
stamp = ":warning:";
} else {
stamp = ":ok_woman:";
}
const slackMessage = {
channel: slackChannel,
text: `*${stamp} ${newState}: ${alarmName} ${stamp}*\n${reason}`,
};
さらに、KMSキーで暗号化しない(無料枠で使う)場合は、Lambdaのcloudwatch-alarm-to-slackで無料と思ってKMS暗号化キーを使ったら2円かかったので関数修正したの通りLambdaの関数を修正するとOKです。
###確認
わざとNG、OKとなるようにいじってslackに届くか確認します。
以上です。