Sionの技術ブログ

SREとして日々の学習を書いて行きます。twitterは@sion_cojp

Fargateで異常終了したコンテナをLambda(Go)でslackに通知する仕組みをTerraformで管理する

f:id:sion_cojp:20211126184642p:plain:w0:h0

TL;DR

  • CloudWatch EventsでECS Cluster内のStatusをwatchする
  • Eventsトリガーで、Lambda(Go)を発火しSlackに通知する
  • それらをTerraformで管理する
  • (弊社はFargateオンリーなのでnamespaceにfargateってつけてます)

どんな感じに通知されるの?

f:id:sion_cojp:20211126165614p:plain

※検証時のexit 0でも通知させたときの画像です

Architecture

https://raw.githubusercontent.com/sioncojp/playground/master/terraform/fargate-non-exit-0-notify/docs/fargate-non-exit-0-notify_architecture.png

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も返ってくる可能性がある
  • ので両方正常系という扱いをした実装になってます