Blog

Amplifyのビルド通知をSlackに送る機能をIaCで作る

はじめに

こんにちは、最近はCDKを触る機会がやや多く、Terraformとどっちを使うのが良いのかやや悩み気味な宮本です。

今回の記事はAWS Amplifyのビルド通知についてです。

Amplifyのビルド通知

※以下の内容は全て2024/02/26現在の情報を元にしています

簡単にサイトを立ち上げることのできるAmplifyですが、ビルドする際の通知が貧弱という問題があります。

  • デフォルトで用意されているのはEメールによる通知のみ
  • Eメールで送ることのできる通知内容が物足りない
  • Eメール通知もCDKやTerraformのようなIaCで管理する方法が公式で説明されていない

通知内容が物足りないという点ですが、実際に送られてくるのは以下のようなメールです。

Build notification from the AWS Amplify Console for app: https://<ブランチ名>.<app id>.amplifyapp.com/. Your build status is <ビルドステータス>. Go to https://console.aws.amazon.com/amplify/home?region=<リージョン>#<app id>/<ブランチ名>/<ビルド番号> to view details on your build.

Amplifyのビルド結果メール通知の例

メールに含まれている内容はapp idとブランチのみで、ぱっと見でどの環境かまではわかりません。複数のAmplifyによるアプリケーションを管理している場合は、もはや何がなんだかわかりません。URLがついているのでアクセスすればわかりますが、同じアプリの別ブランチの差であれば瞬時に見抜くのは難しいです。他にも、ビルドに失敗した場合であればコンソールのエラー内容も欲しいかもしれません。

Amplifyのビルド通知をSlackに送る

※重ねて注意。以下の内容は公式ドキュメントになく、仕様が変更される可能性は十分にあるのでご注意ください。

先に結論

  • Amplifyのコンソールから設定できるEメールによるビルド通知はEventBridge+SNSで実装されている
    • コンソールで通知を作成した場合は必要なリソースが自動で作成される
  • EventBridgeを用意すれば、そのまま直でLambda経由でSlackに通知することができる
    • IaCで通知リソースを管理することもできる
    • アプリ名などAmplifyの作成するイベントに含まれないデータは、Lambda内で別途データを取得する必要がある

Amplifyのビルド通知

デフォルトだとAmplifyのビルド通知はコンソールからのみ作成できます。その際にAmplify自体に通知機能があるわけではなく、別のAWSサービスを利用してビルド通知を実現しているようです。なので、Amplify自体のTerraformやCDKに通知周りの設定がないんですね。

ビルド通知を設定した際に自動で作成されるリソースは次のようなものです。

  • Amazon EventBridge ルール: amplify-<app_id>-<branch名>-branch-notification
    • ブランチ指定しない場合: amplify-<app_id>-AMPLIBRANCHSENTINEL-branch-notification
  • Amazon SNS トピック: amplify-<app_id>_<branch名>
    • ブランチ指定しない場合: amplify-<app_id>_AMPLIBRANCHSENTINEL

EventBridgeのドキュメントにも記載はないのですが、どうもAmplifyのビルド時にEventBridgeで引っ掛けることのできるイベントが配信されているようです。作成されるEventBridgeのルールを見ると、以下のようなイベントパターンを指定しています。ブランチを指定しない場合は、detailのbranchNameの項目自体がありません。

この条件で引っ掛けたイベントを元に入力トランスフォーマーを使ってメール文面を作成し、SNS経由で送っています。

なお、引っ掛けているイベントの全体像は以下のようになっています。残念ながら、Amplifyのアプリ名までは入っていません。そのため、アプリ名を入れたい場合はLambdaを挟んでそこで別途データを取得する必要があります。

Amplifyのビルド通知をSlackに送るために必要なリソースのCDK

さて、Amplifyのビルド通知の仕組みがEventBridgeが元になっていると分かればこっちのものです。以下はCDKの場合ですが、このようなEventBridgeのリソースを作成することでイベントをLambdaに送ることができます。ビルド開始時の通知が不要な場合はパスパターンから STARTED を省くなど、工夫のしがいがあります。(なおlambdaのコード周り含めたリソース定義をここで書くと長くなるので省略します。)

Slackに通知を送るLambda

EventBridgeから叩かれた際、Lambdaはハンドラーの第一引数に入るeventとしてAmplifyから発行されたイベントがそのまま辞書形式で入ってきます。前述の通りAmplifyのアプリ名まではイベントに入っていないため、必要な場合はLambdaでアプリの情報を取得しなければいけません。

以下は、SlackのWebhook経由でビルド通知を送るLambdaの一例です。この例のメッセージ周りはだいぶ簡素なので、ビルドステータスによって必要な情報を増やしたり(e.g. 失敗した時のみコンソールへのURLを追加する)、通知文自体も見やすいようにカスタマイズしていくとわかりやすくなると思います。

通知のサンプル

おわりに

今回はAmplifyのビルド通知をSlackに流す方法について紹介しました。いくつか似たような方法を紹介していた記事はあったのですが、基本的にAWSのリソースは全てIaC管理しておきたい病にかかっているので、CDKで管理できるようにしました。リソース的にはEventBridgeとLambdaおよびそれに必要なIAM Roleを用意しているだけなので、Terraformでも問題ありません。

また、今回はLambdaを使いましたが、もともと出力されるイベントに含まれる内容自体で十分であれば、EventBridgeから直にchatbotに送ることもできるようです。Lambdaを挟むとどうしてもランタイムのEOLによる継続的なメンテが必要になったりするので、不要であれば省きたいです。しかし、利用できるデータがどうしても限られてしまう点は現時点では解消できないため、細かくカスタマイズするのであればLambdaはまだ必要そうです。

他にも失敗したい場合はエラーログなども出せるとありがたいのですが、そもそもAmplifyのビルド時のログはCloudWatchにすら吐き出されないため現状打つ手が無さそうです。

参考

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!