michimani.net

AWS CodeBuild から送信されるイベント情報を SNS 経由で Slack に通知してみた

2019-11-12

先日新たなサービスが発表され、 AWS の Code シリーズ (CodeCommit, CodeBuild, CodeDeploy, CodePipeline) のそれぞれから Amazon SNS と AWS Chatbot (beta) に対して通知を送ることができるようになりました。今回はこれらの中から、実際に CodeBuild から SNS 経由で Slack に通知を送ってみたという話です。

追記 2020/02/26

CodeCommit の通知についても書きました。

追記 2020/04/23

AWS Chatbot が一般利用可能 (GA) になりました。CLoudWatch Aram を Slack に通知してみた記事を書いたのでこちらも参考にしてみてください。

目次

概要

冒頭にも書きましたが、 AWS の Code シリーズ (CodeCommit, CodeBuild, CodeDeploy, CodePipeline) の各サービスから、 Amazon SNS および現在パブリックベータ版として公開されている AWS Chatbot に対して通知を送ることができるようになりました。

これまで Code シリーズからの通知は、 CodePipeline 内に Lambda を挟んだり、各サービス内で発生するイベントに対して CloudWatch Events を設定したりする必要がありましたが、この通知サービスの誕生によってその手間がなくなり、より簡単に Code シリーズからの通知を発信することができるようになります。

この通知サービスに関する詳しい内容は、上記の AWS 公式ページのほか、下記のクラスメソッドさんのブログを参照してみてください。

CodeBuild から Slack に通知してみる

それでは早速この通知サービスを使って CodeBuild から SNS 経由で Slack に通知を飛ばしてみます。

そもそも何が嬉しいのか

やってみる前に、 CodeBuild から通知が飛ばせるようになったことで何が嬉しいのでしょうか。
この通知サービスの存在を知ってまず思ったのが、 ますます CodeBuild だけでできることが増えた!やったー! ということです。

実際のプロジェクトで CodeBuild だけを使うということはないと思いますが、個人で軽く動かしているような自動化フローでは、 AWS 料金節約のために CodeBuild だけで諸々やっている場合もあると思います。僕だけかもしれませんが。
これに関しては以前にブログで書きました。

このブログ内では、 GitHub への push をトリガーに CodeBuild で Vue プロジェクトのビルドを開始し、 S3 に配置、 CloudFront に invalidation 発行、さらにビルドが完了したことを Slack に通知するために curl コマンド を実行しています。
curl コマンドは buildspec.yml に書かれているため、動的な内容を含みづらいです。そのため、 Slack に通知される内容は、あくまでもビルドが終わったことだけで、それが成功したのか失敗したのか、それすらもわかりません。

ただ個人で動かしている自動化なので、とりあえず通知だけ来ればいいや、とブログ内では納得させていました。

しかし、今回の通知サービスによって CodeBuild 自体から通知を飛ばすことができるようになったことで、ビルドに関する詳細な情報を SNS および Chatbot に外出しできるようになりました。 SNS のトピックに情報を渡せるということは Lambda にも情報を渡せるので、そこでゴニョゴニョすればよりリッチな通知を Slack に送れるようになるというわけです。

この通知サービス自体に料金は発生しませんし、 Code シリーズからの通知という性質からも SNS や Lambda で異常な料金が発生するということも考えにくいです。

ということで、以前のブログで節約のために削ったリッチさを補完できる、というかさらに良いものにできるようになるわけですね。

CodeBuild で通知の設定

前置きが長くなりましたが、ここからは実際に通知の設定をしていきます。といっても非常に簡単です。

SNS トピックを作成

まずは CodeBuild からの通知を受け取る SNS トピックを作成しておきます。もちろん既存の SNS トピックを使用しても OK です。
今回は CodeBuildNotification という SNS トピックを作成しました。

作成する際の注意点としては、 AWS の他のリソースから SNS トピックに対する権限をアクセスポリシーで設定する点です。具体的には、下記のような設定が必要になります。

{
  "Sid": "AWSCodeStarNotifications_publish",
  "Effect": "Allow",
  "Principal": {
    "Service": "codestar-notifications.amazonaws.com"
  },
  "Action": [
    "SNS:Subscribe",
    "SNS:Receive"
  ],
  "Resource": "arn:aws:sns:ap-northeast-1:999999999999:CodeBuildNotification"
}

詳しくは下記の公式ページを参照してください。

CodeBuild で通知ルールを作成

続いて CodeBuild で通知ルールを作成します。
通知はビルドプロジェクト単位で設定可能なので、ビルドプロジェクトのトップにある 通知 のプルダウンから 通知ルールの作成 と進んで通知ルールを作成します。

CodeBuild Notification start creating notification rule

設定項目は

です。全て既存の選択肢から選ぶ感じなので、数分で作成できます。

通知ルールの名前と詳細タイプの設定します。

CodeBuild Notification name and detail type

通知をトリガーするイベントを洗濯します。
CodeBuild では Build stateBuild phase のそれぞれにトリガーできるイベントが用意されています。 Build state はビルド単位のイベントを、 Build phase はビルド内の phase 単位のイベントをトリガーとします。 phase 単位のイベントを拾っていると通知欄が荒ぶってしまうので、ここでは state のイベントのみをトリガーとするようにしておきます。

CodeBuild Notification event trigger

ターゲットを選択します。
ここでは、先ほど作成した SNS トピック CodeBuildNotification を指定します。複数のターゲットを指定することもできます。

CodeBuild Notification target

以上で通知ルールの作成が完了です。
正常に作成できていれば、ビルドプロジェクトの設定にて作成した通知ルールを確認することができます。

CodeBuild Notification notification rule

Slack 通知用の Lambda を作成

上記の設定でとりあえず CodeBuild からの通知を SNS に投げるところまではできるようになったので、その先は SNS に適当なサブスクリプションを設定して通知を受け取れば OK となります。
今回は CodeBuild からの通知内容をいい感じに整形して Slack に通知するために、それ用の Lambda を作ってサブスクリプションに設定します。

実際に CodeBuild から SNS 経由で Lambda に渡されるイベント情報と、それを良い感じに整形して Slack に通知する Lambda は gist に置いていますので、そちらを参照ください。(長くなってしまうので)

サンプルで置いているイベントの情報は、ステータス SUCCEEDED でビルドが完了したときのイベントです。
Build state のイベントとしては Succeeded, Stopped, Failed, In-progress がありますが、 In-progress 以外はこの構造をしています。
In-progress は何が違うかというと、 detail.additional-information.phasesdetail.additionail-information.logs 内の group-name および stream-name が存在しません。まあ In-progress はビルド開始時のイベントなので納得ですね。

実際にビルドしてみる

準備が整ったので、実際にビルドを実行してみます。

ちなみに curl コマンドを叩いていた時の通知はこんな感じでした。

old Slack notification

一応 attachment でそれっぽくしてはいますが、完全に固定のメッセージで味気ないですし。完全にただの “通知” です。


それが今回の一連の設定でこんな感じになります。

CodeBuild Notification Slack SUCCEEDED

良い感じですね。
ちなみにステータスが FAILED のときは赤色、 STOPPED のときは黄色になったりします。
さらに phase レベルで SUCCEEDED になっていないものがあればその内容も付与するようになっています。

CodeBuild Notification Slack FAILED

そして、先日の Developers.IO のセッション内で、通知に CloudWatch Logs へのリンクを貼っておくと色々捗るよという話があったので、それも付与するようにしています。

まとめ

AWS CodeBuild からのイベント通知を SNS 経由で Slack に通知してみた話でした。
今回は CodeBuild で全部やるという 節約のためにやってみた内容になりましたが、この通知サービスは実際の開発フローでも非常に便利なサービスだと思います。
各 Code シリーズからの詳細な情報を得ることができるようになるため、各イベントをトリガーとした動作をより詳細に組み合わせることができそうです。

AWS の Code シリーズで開発フローをリッチにしたい、通知周りをより簡単に設定したいという方は試してみてはどうでしょうか。


comments powered by Disqus