追記(2015/06/18)
この記事はLambdaのトリガーにSNSを使えなかった時の記事です。
現在は可能ですので他の記事を参考にしてください。
Github
やりたかったこと
- CloudWatchのアラートをSlackに飛ばしたかったので作った
やりたくなかったこと
- 既存のやり方だとCloudWatch → 中継サーバ → Slackだった
- 中継サーバの管理面倒くさい
- そのためだけにサーバ立てるのも勿体無い
簡単なロジック説明
- LambdaでCron的なことをするために、自分自身でLambdaのトリガーを発生させる
- CloudWatchのalertを監視する
- アラートあったらSlackに通知
- 何度も飛ぶとうるさいのでファイルロック的なことをS3上でやる
ポイント
- Lambdaは60秒以上の処理はタイムアウトになるので60秒以内で処理は終わらせる
- 日本はまだLambda対応してないのでS3も海外に置く必要がある
- 全部のアラート監視してしまうとAutoScalingとかも反応してしまうのでSNSのActionでフィルタリングした
- これでCloudWatchのNotificationに指定したSNSのものしか飛ばない
- プレビューなので動かなくなっても自己責任で!
設定項目
config.js
module.exports = {
bucket : '', // S3バケット
s3_region : '', // S3のリージョン
cloudwatch_region : '', // cloudwatchのリージョン
sns_arn : '', // Slack通知用のsns
alert_key_prefix : '', // alert用ファイルの置き場所
alert_trigger_file : '', // Lambdaループ用のファイル
trigger_write_delay : 30000, // Cronっぽいことのループ間隔、目安時間なので状況によって +5秒前後する
slack_url : '', // Incoming WebHooksのURL
slack_username : '', // Slackの通知ユーザー名
slack_icon_url : '' // SlackのアイコンURL
}
作ってみて思ったこと
node.js書いたことないので結構辛かった。
callback地獄になってpromise使ってみたけど結局汚くなってしまった。
あとエラー処理結構適当なので途中で止まっちゃうかも?(再帰処理してるけどテストしてない)
Github