CodeBuild のビルド通知サンプル
Amazon CloudWatch Events には AWS CodeBuild のサポートが組み込まれています。CloudWatch Events は、AWS リソースの変更を説明するシステムイベントのストリームです。CloudWatch Events では、宣言型のルールを書き込んで、目的のイベントを自動アクションに関連付けます。このサンプルでは、Amazon CloudWatch Events と Amazon Simple Notification Service (Amazon SNS) を使用して、ビルドの成功、失敗、各ビルドフェーズへの移行、またはこれらのイベントの組み合わせを行うたびに、ビルド通知をサブスクライバーに送信します。
このサンプルを実行すると、AWS アカウントに課金される場合があります。これには、CodeBuild と、Amazon CloudWatch および Amazon SNS に関連する AWS リソースおよびアクションに対する料金が含まれます。詳細については、「CodeBuild 料金表
サンプルの実行
このサンプルを実行するには
-
このサンプルで使用するトピックをすでに設定して Amazon SNS で購読している場合は、ステップ 4 に進みます。それ以外の場合は、AWS ルートアカウントまたは管理者ユーザーの代わりに IAM ユーザーを使用して Amazon SNS を操作するには、ユーザー (またはユーザーが関連付けられている IAM グループ) に次のステートメントを (
### BEGIN ADDING STATEMENT HERE ###
と### END ADDING STATEMENT HERE ###
の間に) 追加します。AWS ルートアカウントは使用しないでください。このステートメントにより、Amazon SNS のトピックへの通知の表示、作成、サブスクライブ、および送信テストができます。省略記号 (...
) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号を既存のポリシーに入力しないでください。{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "sns:CreateTopic", "sns:GetTopicAttributes", "sns:List*", "sns:Publish", "sns:SetTopicAttributes", "sns:Subscribe" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }注記 このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。
詳細については、「カスタマー管理ポリシーの編集」または、「IAM ユーザーガイド」の「インラインポリシーの使用 (コンソール)」の「グループ、ユーザー、ロールのインラインポリシーを編集または削除するには」セクションを参照してください。
-
Amazon SNS でトピックを作成または識別します。AWS CodeBuild は、CloudWatch Events を使用して、Amazon SNS を介してこのトピックにビルド通知を送信します。
トピックを作成するには:
-
Amazon SNS コンソール(https://console.aws.amazon.com/sns
)を開きます。 -
[トピックの作成] を選択します。
-
[新しいトピックの作成] で、[トピック名] にトピックの名前 (
CodeBuildDemoTopic
など) を入力します。(別の名前を選択する場合は、このサンプル全体でそれを置き換えてください。) -
[トピックの作成] を選択します。
-
[トピックの詳細: CodeBuildDemoTopic] ページで、[トピック ARN] の値をコピーします。この値は次のステップで必要になります。
詳細については、Amazon SNS デベロッパーガイドの「トピックの作成」を参照してください。
-
-
1 つかそれ以上の受信者にトピックをサブスクライブさせ、E メール通知を受け取ります。
受信者にトピックをサブスクライブさせるには:
-
前のステップで Amazon SNS コンソールを開いた状態のまま、ナビゲーションペインで、[Subscriptions] (サブスクリプション) を選択してから、[Create subscription] (サブスクリプションの作成) を選択します。
-
[サブスクリプションの作成] の [トピック ARN] に、前のステップからコピーしたトピック ARN を貼り付けます。
-
[Protocol] で [Email] を選択します。
-
[エンドポイント] に、受信者の完全な E メールアドレスを入力します。
-
[Create Subscription] を選択します。
-
Amazon SNS は受信者にサブスクリプション確認の E メールを送信します。E メール通知の受信を開始するには、受信者は受信登録確認メールで [Confirm subscription] リンクを選択する必要があります。受信者がリンクをクリックした後、正常にサブスクライブされたら、Amazon SNS により受信者のウェブブラウザに確認メッセージが表示されます。
詳細については、Amazon SNS 開発者ガイドの「トピックのサブスクライブ」を参照してください。
-
-
AWS ルートアカウントまたは管理者ユーザーの代わりにユーザーを使用して CloudWatch Events を操作する場合は、ユーザー (またはユーザーが関連付けられている IAM グループ) に次のステートメントを (
### BEGIN ADDING STATEMENT HERE ###
と### END ADDING STATEMENT HERE ###
の間に) 追加します。AWS ルートアカウントは使用しないでください。このステートメントは、CloudWatch Events の使用をユーザーに許可するために使用します。省略記号 (...
) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号を既存のポリシーに入力しないでください。{ "Statement": [
### BEGIN ADDING STATEMENT HERE ###
{ "Action": [ "events:*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" },### END ADDING STATEMENT HERE ###
... ], "Version": "2012-10-17" }注記 このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス許可を持っている必要があります。
詳細については、「カスタマー管理ポリシーの編集」または、「IAM ユーザーガイド」の「インラインポリシーの使用 (コンソール)」の「グループ、ユーザー、ロールのインラインポリシーを編集または削除するには」セクションを参照してください。
-
CloudWatch Events ルールを作成します。これを行うために、CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/
) を開きます。 -
ナビゲーションペインの [Events] で、[Rules] を選択してから、[Create rule] を選択します。
-
[ステップ 1: ルールの作成] ページで、[イベントパターン] と [サービス別のイベントに一致するイベントパターンの構築] が選択済みであることを確認します。
-
[サービス名] で、[CodeBuild] を選択します。[イベントタイプ] で、[すべてのイベント] が選択済みであることを確認します。
-
[イベントパターンのプレビュー] には、次のコードが表示されます。
{ "source": [ "aws.codebuild" ] }
-
[編集] を選択し、[イベントパターンのプレビュー] のコードを、次の 2 つのルールパターンのいずれかに置き換えます。
この最初のルールパターンは、AWS CodeBuild で指定されたビルドプロジェクトのビルドが開始または完了すると、イベントをトリガーします。
{ "source": [ "aws.codebuild" ], "detail-type": [ "CodeBuild Build State Change" ], "detail": { "build-status": [ "IN_PROGRESS", "SUCCEEDED", "FAILED", "STOPPED" ], "project-name": [ "
my-demo-project-1
", "my-demo-project-2
" ] } }前述のルールで、必要に応じて次のコードを変更します。
-
ビルドが開始または完了したときにイベントをトリガーするには、
build-status
配列に表示されているすべての値をそのままにするか、build-status
配列を完全に削除します。 -
ビルドが完了したときにのみイベントをトリガーするには、
IN_PROGRESS
配列からbuild-status
を削除します。 -
ビルドの開始時にのみイベントをトリガーするには、
IN_PROGRESS
配列からbuild-status
を除くすべての値を削除します。 -
すべてのビルドプロジェクトのイベントをトリガーするには、
project-name
配列を完全に削除します。 -
個々のビルドプロジェクトのイベントのみをトリガーするには、
project-name
配列に各ビルドプロジェクトの名前を指定します。
この 2 番目のルールパターンでは、AWS CodeBuild で指定されたビルドプロジェクトのビルドフェーズが別のビルドフェーズに移動するたびに、イベントをトリガーします。
{ "source": [ "aws.codebuild" ], "detail-type": [ "CodeBuild Build Phase Change" ], "detail": { "completed-phase": [ "SUBMITTED", "PROVISIONING", "DOWNLOAD_SOURCE", "INSTALL", "PRE_BUILD", "BUILD", "POST_BUILD", "UPLOAD_ARTIFACTS", "FINALIZING" ], "completed-phase-status": [ "TIMED_OUT", "STOPPED", "FAILED", "SUCCEEDED", "FAULT", "CLIENT_ERROR" ], "project-name": [ "
my-demo-project-1
", "my-demo-project-2
" ] } }前述のルールで、必要に応じて次のコードを変更します。
-
ビルドフェーズの変更 (各ビルドで送信される通知は最大 9 個) ごとにイベントをトリガーするには、
completed-phase
配列に表示されているすべての値をそのままにするか、completed-phase
配列を完全に削除します。 -
個々のビルドフェーズの変更に対してのみイベントをトリガーするには、イベントをトリガーしない
completed-phase
配列の各ビルドフェーズの名前を削除します。 -
各ビルドフェーズステータスが変更するたびにイベントをトリガーするには、
completed-phase-status
配列に示すように、すべて値をそのままにするか、completed-phase-status
配列を完全に削除します。 -
個々のビルドフェーズステータスの変更に対してのみイベントをトリガーするには、イベントをトリガーしない
completed-phase-status
配列の各ビルドフェーズステータスの名前を削除します。 -
すべてのビルドプロジェクトのイベントをトリガーするには、
project-name
配列を削除します。 -
個々のビルドプロジェクトのイベントをトリガーするには、
project-name
配列に各ビルドプロジェクトの名前を指定します。
イベントパターンの詳細については、Amazon EventBridge ユーザーガイドの「イベントパターン」を参照してください。
イベントパターンを用いたフィルタリングの詳細については、Amazon EventBridge ユーザーガイドの「イベントパターンを使用したコンテンツベースのフィルタリング」を参照してください。
注記 ビルド状態の変更とビルドフェーズの変更の両方に応じてイベントをトリガーする場合は、ビルド状態の変更用とビルドフェーズの変更用に 2 つの別個のルールを作成する必要があります。両方のルールを 1 つのルールに結合すると、結合したルールは予期しない結果を引き起こすか、まったく動作しなくなる可能性があります。
コードの置換を完了したら、[Save] を選択します。
-
-
[Targets] で、[Add target] を選択します。
-
ターゲットのリストで、[SNS トピック] を選択します。
-
[Topic] で、以前に指定した、または作成したトピックを選択します。
-
[入力の設定] を展開して、[インプットトランスフォーマー] を閉じます。
-
[Input Path] ボックスに、次のいずれかの入力パスを入力します。
detail-type
の値がCodeBuild Build State Change
であるルールの場合は、次のように入力します。{"build-id":"$.detail.build-id","project-name":"$.detail.project-name","build-status":"$.detail.build-status"}
detail-type
の値がCodeBuild Build Phase Change
であるルールの場合は、次のように入力します。{"build-id":"$.detail.build-id","project-name":"$.detail.project-name","completed-phase":"$.detail.completed-phase","completed-phase-status":"$.detail.completed-phase-status"}
他のタイプの情報を取得するには、「ビルド通知の入力形式に関するリファレンス」を参照してください。
-
[入力テンプレート] ボックスに、次のいずれかの入力テンプレートを入力します。
detail-type
の値がCodeBuild Build State Change
であるルールの場合は、次のように入力します。"Build '<build-id>' for build project '<project-name>' has reached the build status of '<build-status>'."
detail-type
の値がCodeBuild Build Phase Change
であるルールの場合は、次のように入力します。"Build '<build-id>' for build project '<project-name>' has completed the build phase of '<completed-phase>' with a status of '<completed-phase-status>'."
-
[設定の詳細] を選択します。
-
[ステップ 2: ルールの詳細を設定する] ページで、名前と説明 (オプション) を入力します。[状態] は、[有効] のままとします。
-
[Create rule] を選択します。
-
「CodeBuild の直接実行」の手順に従って、ビルドプロジェクトを作成して、ビルドを実行し、ビルド情報を表示します。
-
CodeBuild がビルド通知を現在正常に送信していることを確認します。たとえば、ビルド通知 E メールが受信トレイにあるかどうかを確認します。
ルールの動作を変更するには、CloudWatch コンソールで変更するルールを選択し、[アクション]、[編集] の順に選択します。ルールを編集し、[設定の詳細]、[ルールの更新] の順に選択します。
ルールを使用したビルド通知の送信を停止するには、CloudWatch コンソールで、使用を停止するルールを選択し、[アクション]、[無効化] の順に選択します。
ルールを完全に削除するには、CloudWatch コンソールで、削除するルールを選択し、[アクション]、[削除] の順に選択します。
関連リソース
AWS CodeBuild の開始方法については、「コンソールを使用した AWS CodeBuild の開始方法」を参照してください。
CodeBuild の問題のトラブルシューティングについては、「AWS CodeBuild のトラブルシューティング」を参照してください。
CodeBuild のクォータについては、「AWS CodeBuild のクォータ」を参照してください。
ビルド通知の入力形式に関するリファレンス
CloudWatch では、JSON 形式で通知が送信されます。
ビルド状態変更通知は次の形式を使用します。
{ "version": "0", "id": "c030038d-8c4d-6141-9545-00ff7b7153EX", "detail-type": "CodeBuild Build State Change", "source": "aws.codebuild", "account": "123456789012", "time": "2017-09-01T16:14:28Z", "region": "us-west-2", "resources":[ "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX" ], "detail":{ "build-status": "SUCCEEDED", "project-name": "my-sample-project", "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", "additional-information": { "artifact": { "md5sum": "da9c44c8a9a3cd4b443126e823168fEX", "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip" }, "environment": { "image": "aws/codebuild/standard:4.0", "privileged-mode": false, "compute-type": "BUILD_GENERAL1_SMALL", "type": "LINUX_CONTAINER", "environment-variables": [] }, "timeout-in-minutes": 60, "build-complete": true, "initiator": "MyCodeBuildDemoUser", "build-start-time": "Sep 1, 2017 4:12:29 PM", "source": { "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip", "type": "S3" }, "logs": { "group-name": "/aws/codebuild/my-sample-project", "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX", "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX" }, "phases": [ { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:12:29 PM", "duration-in-seconds": 0, "phase-type": "SUBMITTED", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:13:05 PM", "duration-in-seconds": 36, "phase-type": "PROVISIONING", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:05 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 4, "phase-type": "DOWNLOAD_SOURCE", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "INSTALL", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "PRE_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 70, "phase-type": "BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "POST_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "UPLOAD_ARTIFACTS", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:26 PM", "duration-in-seconds": 4, "phase-type": "FINALIZING", "phase-status": "SUCCEEDED" }, { "start-time": "Sep 1, 2017 4:14:26 PM", "phase-type": "COMPLETED" } ] }, "current-phase": "COMPLETED", "current-phase-context": "[]", "version": "1" } }
ビルドフェーズ変更通知は次の形式を使用します。
{ "version": "0", "id": "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX", "detail-type": "CodeBuild Build Phase Change", "source": "aws.codebuild", "account": "123456789012", "time": "2017-09-01T16:14:21Z", "region": "us-west-2", "resources":[ "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX" ], "detail":{ "completed-phase": "COMPLETED", "project-name": "my-sample-project", "build-id": "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", "completed-phase-context": "[]", "additional-information": { "artifact": { "md5sum": "da9c44c8a9a3cd4b443126e823168fEX", "sha256sum": "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", "location": "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip" }, "environment": { "image": "aws/codebuild/standard:4.0", "privileged-mode": false, "compute-type": "BUILD_GENERAL1_SMALL", "type": "LINUX_CONTAINER", "environment-variables": [] }, "timeout-in-minutes": 60, "build-complete": true, "initiator": "MyCodeBuildDemoUser", "build-start-time": "Sep 1, 2017 4:12:29 PM", "source": { "location": "codebuild-123456789012-input-bucket/my-input-artifact.zip", "type": "S3" }, "logs": { "group-name": "/aws/codebuild/my-sample-project", "stream-name": "8745a7a9-c340-456a-9166-edf953571bEX", "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX" }, "phases": [ { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:12:29 PM", "duration-in-seconds": 0, "phase-type": "SUBMITTED", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:12:29 PM", "end-time": "Sep 1, 2017 4:13:05 PM", "duration-in-seconds": 36, "phase-type": "PROVISIONING", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:05 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 4, "phase-type": "DOWNLOAD_SOURCE", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "INSTALL", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:13:10 PM", "duration-in-seconds": 0, "phase-type": "PRE_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:13:10 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 70, "phase-type": "BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "POST_BUILD", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:21 PM", "duration-in-seconds": 0, "phase-type": "UPLOAD_ARTIFACTS", "phase-status": "SUCCEEDED" }, { "phase-context": [], "start-time": "Sep 1, 2017 4:14:21 PM", "end-time": "Sep 1, 2017 4:14:26 PM", "duration-in-seconds": 4, "phase-type": "FINALIZING", "phase-status": "SUCCEEDED" }, { "start-time": "Sep 1, 2017 4:14:26 PM", "phase-type": "COMPLETED" } ] }, "completed-phase-status": "SUCCEEDED", "completed-phase-duration-seconds": 4, "version": "1", "completed-phase-start": "Sep 1, 2017 4:14:21 PM", "completed-phase-end": "Sep 1, 2017 4:14:26 PM" } }