しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Elastic Beanstalk からの通知を Lambda を使っていい感じに Slack に送信する

Elastic Beanstalk のヘルスやデプロイ完了などの通知は、作成時にメールアドレスを入力しておくと SNS を経由して送信されてきますが、デプロイ通知をメールで送られても見ないので Slack に流します。

一応 SNS を手動で作成して設定しておけば、JSON として内容を取得することが出来ます。

しかし、含まれているメッセージはメールで送信される前提となっているので、単純に環境情報などを取得することが出来ないのが欠点です。なので正規表現を使ってサクッとばらします。

個人的な趣味で C# を使った Lambda Function を実装しました。ソースは GitHub で公開済みです。

Lambda にデプロイして通知したい Beanstalk に SNS Topic を追加しておきます。SNS Topic の設定はマネジメントコンソールからは行えないので、AWS CLI を使います。

地味に Elastic Beanstalk を使う場合には AWS CLI が必要な気がします。

aws elasticbeanstalk update-environment --environment-id e-xxxxx \
    --option-settings Namespace=aws:elasticbeanstalk:sns:topics,OptionName="Notification Topic ARN",Value=arn:aws:sns:ap-northeast-1:xxxxx:xxxxx

設定後に適当に Beanstalk にアプリケーションをデプロイすると、完了後に Slack に以下のような通知が飛んでくるはずです。Application のリンクはマネジメントコンソールに飛べるようにしてます。

Environment は名前が含まれていないのでリンクに出来なかったですが、Lambda のロール設定と AWS SDK を使えば API 経由で取れる気がしてます。この辺りはアイディア勝負感あります。

f:id:shiba-yan:20170710163355p:plain

適当に存在しないヘルスチェック URL を指定してみると、ステータスが変化していくのを Slack で確認することが出来ます。もうちょっと情報を含めたい感じはします。

f:id:shiba-yan:20170710164042p:plain

AWS SDK を使えばもうちょっと情報が取れると思うので、イベントの情報とかも流してみるのは良さそうな気がしました。特に WARN 以上のログは結構気になるものが多いです。

他にも SNS からのイベントをクラスにマッピングするようにしてるので、通知元の Beanstalk によって別々の Slack Channel に流すことなども出来ます。