Secret Staircase

CodePipelineの開始と終了時にSlackに通知する

Aug 18, 2019

CodePipeline の開始と終了時に Slack に通知する機能を Rust と Terraform で作りました。この手の話はググるとたくさん出てきますが、Rust で Lambda 関数を試してみたかったので作ってみました。

GitHub のリポジトリはこちらです。 akr4/codepipeline-slack

Terraform のモジュールになっているので比較的簡単に再利用できるかと思います。詳しい使い方は GitHub の README.md を見てください。

CodePipeline のビルド開始時、成功時、失敗時(正確にはステータス変更時)にこんな感じで Slack に通知されます。

screenshot

仕組みとしては CloudWatch Events で CodePipeline のステータス変更イベントをサブスクライブして Slack に通知する Lambda を実行しています。

overview

Rust での Lambda について

awslabs/aws-lambda-rust-runtimeを使うことで簡単に Rust で Lambda 関数を作ることができます。

Lambda 用バイナリのクロスビルド環境を用意してもよいですが、softprops/lambda-rustを使えば Docker だけ用意すればよいので簡単です。また擬似 Lambda 環境を Docker コンテナとして提供しているlambci/docker-lambdaを使えばローカル環境でテストすることもできます。

これらのおかげで開発は結構楽でした。ただいざ AWS 環境にデプロイして CloudWatch Event を発火させてみると、Lambda 関数に渡させるイベントに予想と異なる部分がありハマりました。aws-lambda-rust-runtimeは serde を使ってイベントをデシリアライズした後で自分で書いたハンドラー関数を呼ぶので、自分で定義したイベント型が実際の json と異なっていると自分のハンドラー関数に制御がくる前にエラーになります。エラーメッセージもあまり役に立たないし困りました。

とにかく Rust を使えることで自分にとっては Lambda 関数を書きやすくなるし、全体としては良い体験でした。