TL;DR
- CloudWatch EventsでECS Cluster内のStatusをwatchする
- Eventsトリガーで、Lambda(Go)を発火しSlackに通知する
- それらをTerraformで管理する
- (弊社はFargateオンリーなのでnamespaceにfargateってつけてます)
どんな感じに通知されるの?
※検証時のexit 0でも通知させたときの画像です
Architecture
Code
https://github.com/sioncojp/playground/tree/master/terraform/fargate-non-exit-0-notify
実装時のポイント
事前にSlackのappを作る
- https://api.slack.com/apps/
- からアプリを作りましょう
- おそらく下記権限が必要かと思います(OAuth & Permissions -> Scope -> Bot Token Scopes)
- channels:read
- chat:write
シークレット情報はLambdaのEnvironmentに設定できない
- environmentに設定するとコンソールから丸見えになってしまうので、
- コード側でParameterStoreから対象のデータを引っ張る形にしてます
terraformからGoで書かれたlambdaをdeployするのが難しい
- applyする前に
GOOS=linux GOARCH=amd64
のバイナリをbuildする必要があります。- もしバイナリがなかったらこけるだけ
- なので一旦ドキュメントでカバーすることにしました。(いい方法あったら教えてください)
Goがインストールされてなくてもbuild, go get -uできるようにした
- Makefileを見てもらうとわかるのですが、
- makeを実行
.go-version
のバージョンのGoをダウンロードし、bin/go
として展開- それを元にbuild -これでどの環境でもbuildできるようにしました
exit 143と0
- docker stopはコンテナにSIGTERM(exit 143)を送信する
- なので基本的に143が返ってくることが多い
- が、tiniやdumb_initでマッピングしてる場合があるのでexit 0も返ってくる可能性がある
- ので両方正常系という扱いをした実装になってます