CodeBuild のビルド通知サンプル - AWS CodeBuild

CodeBuild のビルド通知サンプル

Amazon CloudWatch Events には、AWS CodeBuild のサポートが組み込まれています。CloudWatch イベント は、AWS リソースの変更を説明するシステムイベントのストリームです。CloudWatch イベント では、宣言型のルールを書き込んで、目的のイベントを自動アクションに関連付けます。このサンプルでは、Amazon CloudWatch Events と Amazon Simple Notification Service (Amazon SNS) を使用して、ビルドの成功、失敗、各ビルドフェーズへの移行、またはこれらのイベントの組み合わせを行うたびに、ビルド通知をサブスクライバーに送信します。

重要

このサンプルを実行すると、AWS アカウントに課金される場合があります。これには、CodeBuild および Amazon CloudWatch、Amazon SNS に関連する AWS リソースおよびアクションの料金が含まれます。詳細については、「CodeBuild 料金表」、「Amazon CloudWatch 料金表」、「Amazon SNS 料金表」を参照してください。

サンプルの実行

このサンプルを実行するには

  1. このサンプルで使用するトピックをすでに設定して Amazon SNS で購読している場合は、ステップ 4 に進みます。それ以外の場合は、IAMルートアカウントまたは管理者 AWS ユーザーの代わりに IAM ユーザーを使用して Amazon SNS を操作する場合は、次のステートメントを追加します ( の間に ### BEGIN ADDING STATEMENT HERE ### および ### END ADDING STATEMENT HERE ###) を、 ユーザー (またはユーザーが属する IAM グループ) に変更します。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 ユーザーガイド。

  2. Amazon SNS でトピックを作成または特定します。AWS CodeBuild は、CloudWatch イベント を使用して、このトピックに Amazon SNS 経由でビルド通知を送信します。

    トピックを作成するには:

    1. https://console.aws.amazon.com/sns で Amazon SNS コンソールを開きます。

    2. [Create topic (トピックの作成)] を選択します。

    3. [新しいトピックの作成] で、[トピック名] にトピックの名前 (CodeBuildDemoTopic など) を入力します。(別の名前を選択する場合は、このサンプル全体でそれを置き換えてください。)

    4. [Create topic (トピックの作成)] を選択します。

    5. トピックの詳細: CodeBuildDemoTopicページで、トピックの ARN 値をコピーします。この値は次のステップで必要になります。

    詳細については、 開発者ガイドの「トピックAmazon SNSの作成」を参照してください

  3. 1 つかそれ以上の受信者にトピックをサブスクライブさせ、E メール通知を受け取ります。

    受信者にトピックをサブスクライブさせるには:

    1. 前の手順で Amazon SNS コンソールを開き、ナビゲーションペインで、[Subscriptions (サブスクリプション)] を選択してから、[Create subscription (サブスクリプションの作成)] を選択します。

    2. [サブスクリプションの作成] の [トピック ARN] に、前のステップからコピーしたトピック ARN を貼り付けます。

    3. [Protocol] で [Email] を選択します。

    4. [エンドポイント] に、受信者の完全な E メールアドレスを入力します。

    5. [Create Subscription] を選択します。

    6. Amazon SNS は受信者にサブスクリプション確認の E メールを送信します。E メール通知の受信を開始するには、受信者は受信登録確認メールで [Confirm subscription] リンクを選択する必要があります。受信者がリンクをクリックした後、正常にサブスクライブされたら、Amazon SNS により受信者のウェブブラウザに確認メッセージが表示されます。

    詳細については、 開発者ガイドの「トピックへのAmazon SNSサブスクライブ」を参照してください

  4. IAMルートアカウントまたは管理者 AWS ユーザーの代わりに ユーザーを使用して IAM を操作する場合は、次のステートメントを追加します ( の間にCloudWatch イベント ### BEGIN ADDING STATEMENT HERE ### および ### END ADDING STATEMENT HERE ###) を、 ユーザー (またはユーザーに関連付けられているIAMグループ) に返します。AWS ルートアカウントは使用しないでください。このステートメントは、CloudWatch イベント の使用をユーザーに許可するために使用します。省略記号 (...) は、簡潔にするために使用され、ステートメントを追加する場所の特定に役立ちます。ステートメントを削除しないでください、また、これらの省略記号を既存のポリシーに入力しないでください。

    { "Statement": [ ### BEGIN ADDING STATEMENT HERE ### { "Action": [ "events:*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }, ### END ADDING STATEMENT HERE ### ... ], "Version": "2012-10-17" }
    注記

    このポリシーを変更する IAM エンティティは、ポリシーを変更するために IAM のアクセス権限を持っている必要があります。

    詳細については、 の「インラインポリシーの使用 (コンソール)」の「カスタマー管理ポリシーの編集」または「グループ、ユーザー、ロールのインラインポリシーを編集または削除するには」セクションを参照してくださいhttps://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html#AddingPermissions_Console。IAM ユーザーガイド

  5. CloudWatch イベント にルールを作成する これを行うには、https://console.aws.amazon.com/ cloudwatch で、CloudWatch コンソールを開きます。

  6. ナビゲーションペインの [Events] で、[Rules] を選択してから、[Create rule] を選択します。

  7. ステップ 1: ルールの作成ページ、[イベントパターン]、および [サービス別のイベントに一致するイベントパターンの構築] がすでに選択されています。

  8. [サービス名] として [CodeBuild] を選びます。[イベントタイプ] で、[すべてのイベント] が選択済みであることを確認します。

  9. [イベントパターンのプレビュー] には、次のコードが表示されます。

    { "source": [ "aws.codebuild" ] }

    結果を比較する:

  10. [編集] を選択し、[イベントパターンのプレビュー] のコードを、次の 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 配列を完全に削除します。

    • ビルドが完了したときにのみイベントをトリガーするには、build-status 配列から IN_PROGRESS を削除します。

    • ビルドの開始時にのみイベントをトリガーするには、build-status 配列から IN_PROGRESS を除くすべての値を削除します。

    • すべてのビルドプロジェクトのイベントをトリガーするには、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] を選択します。

  11. [Targets] で、[Add target] を選択します。

  12. ターゲットのリストで、[SNS トピック] を選択します。

  13. [Topic] で、以前に指定した、または作成したトピックを選択します。

  14. [入力の設定] を展開して、[インプットトランスフォーマー] を閉じます。

  15. [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"}

    他のタイプの情報を取得するには、「ビルド通知の入力形式に関するリファレンス」を参照してください。

  16. [入力テンプレート] ボックスに、次のいずれかの入力テンプレートを入力します。

    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>'."

    これまでの結果を、次に示す、detail-type の値を CodeBuild Build State Change とするルールと比較します。

  17. [詳細の設定] を選択します。

  18. ステップ 2: ルールの詳細ページを設定して、名前とオプションの説明を入力します。[状態] は、[有効] のままとします。

    これまでの結果を以下のスクリーンショットと比較します。

  19. [Create rule] を選択します。

  20. CodeBuild の直接実行」の手順に従って、ビルドプロジェクトを作成して、ビルドを実行し、ビルド情報を表示します。

  21. CodeBuild がビルド通知を現在正常に送信していることを確認します。たとえば、ビルド通知 E メールが受信トレイにあるかどうかを確認します。

ルールの動作を変更するには、CloudWatch コンソールで変更するルールを選択し、[アクション]、[編集] の順に選択します。ルールを編集し、[設定の詳細]、[ルールの更新] の順に選択します。

ルールを使用したビルド通知の送信を停止するには、CloudWatch コンソールで、使用を停止するルールを選択し、[アクション]、[無効化] の順に選択します。

ルールを完全に削除するには、CloudWatch コンソールで、削除するルールを選択し、[アクション]、[削除] の順に選択します。

関連リソース

ビルド通知の入力形式に関するリファレンス

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" } }