CodeBuildのあれこれ

CodePipeline, CodeBuildに関して、自分なりの疑問を実際に試してみたメモ

この記事で使っている CodePipeline, CodeBuild は [codepipeline\-cdk](https://github.com/HeRoMo/codepipeline-cdk)で構築した。

## 環境変数

CodeBuildの実行環境で定義されている環境変数について
公式ドキュメント[ビルド環境の環境変数 \- AWS CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)にも記載はされている。

ただ、実際にはドキュメント以外にも環境変数は定義されている。

### 独立したCodeBuildの場合

実行環境にDocker イメージ`aws/codebuild/standard:4.0`を選択した場合の結果。
ドキュメントに記載さている環境変数の他に各種言語、ツールのバージョンの環境変数が定義されていることがわかる。

Githubから直接ソースを取ってくるのでそのリポジトリを示す `CODEBUILD_SOURCE_REPO_URL` が定義されている。

```bash
ANDROID_HOME=/usr/local/android-sdk-linux
ANDROID_SDK_BUILD_TOOLS=build-tools;29.0.2
ANDROID_SDK_BUILD_TOOLS_28=build-tools;28.0.3
ANDROID_SDK_EXTRAS=extras;android;m2repository extras;google;m2repository extras;google;google_play_services
ANDROID_SDK_MANAGER_SHA256=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
ANDROID_SDK_MANAGER_VER=4333796
ANDROID_SDK_PLATFORM_TOOLS=platforms;android-29
ANDROID_SDK_PLATFORM_TOOLS_28=platforms;android-28
ANT_DOWNLOAD_SHA512=c1a9694c3018e248000ff6f46d48af85f537ef3935e0d5256543c58a240084c0aff5289fd9e94cbc40d5442f3cc43592398047f2548fded40d9882be2b40750d
ANT_VERSION=1.10.6
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
AWS_DEFAULT_REGION=ap-northeast-1
AWS_EXECUTION_ENV=AWS_ECS_EC2
AWS_REGION=ap-northeast-1
CODEBUILD_AGENT_ENDPOINT=http://127.0.0.1:7831
CODEBUILD_AUTH_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CODEBUILD_BMR_URL=https://CODEBUILD_AGENT:3000
CODEBUILD_BUILD_ARN=arn:aws:codebuild:ap-northeast-1:999999999999:build/CodePiplineLessonStandaloneCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
CODEBUILD_BUILD_ID=CodePiplineLessonStandaloneCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz # CodeBuildのの実行毎のユニークID
CODEBUILD_BUILD_IMAGE=aws/codebuild/standard:4.0
CODEBUILD_BUILD_NUMBER=1
CODEBUILD_BUILD_SUCCEEDING=1
CODEBUILD_BUILD_URL=https://ap-northeast-1.console.aws.amazon.com/codebuild/home?region=ap-northeast-1#/builds/CodePiplineLessonStandaloneCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz/view/new
CODEBUILD_CI=true
CODEBUILD_CONTAINER_NAME=default
CODEBUILD_EXECUTION_ROLE_BUILD=
CODEBUILD_FE_REPORT_ENDPOINT=https://codebuild.ap-northeast-1.amazonaws.com/
CODEBUILD_GOPATH=/codebuild/output/src999999999
CODEBUILD_INITIATOR=<User Name> # CodeBuildの実行をトリガーしたユーザ名
CODEBUILD_KMS_KEY_ID=arn:aws:kms:ap-northeast-1:999999999999:alias/aws/s3
CODEBUILD_LAST_EXIT=0
CODEBUILD_LOG_PATH=zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
CODEBUILD_PROJECT_UUID=caeae6e9-3d75-4e6e-a254-9a126137a28b
CODEBUILD_RESOLVED_SOURCE_VERSION=5a51d95717f4eeec8f5dc2b201ab1f95fa52441c # GITHUBのCOMMMITID
CODEBUILD_SOURCE_REPO_URL=https://github.com/HeRoMo/codepipeline-cdk.git
CODEBUILD_SOURCE_VERSION=master
CODEBUILD_SRC_DIR=/codebuild/output/src993565028/src/github.com/HeRoMo/codepipeline-cdk
CODEBUILD_START_TIME=1587915912569
CODEBUILD_VPC_AZ=ap-northeast-1a
CTS_LINK_LOCAL_ADDR=169.254.170.3
DEBIAN_FRONTEND=noninteractive
DIND_COMMIT=3b5fac462d21ca164b3778647420016315289034
DOCKER_BUCKET=download.docker.com
DOCKER_CHANNEL=stable
DOCKER_COMPOSE_VERSION=1.24.0
DOCKER_SHA256=c3c8833e227b61fe6ce0bc5c17f97fa547035bef4ef17cf6601f30b0f20f4ce5
DOCKER_VERSION=19.03.3
DOTNET_31_SDK_VERSION=3.1.102
ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/e0e98a69-af53-46e6-a48c-3c564f39ce6f
FE_REPORT_LINK_LOCAL_ADDR=169.254.170.8
GITVERSION_VERSION=5.1.2
GOENV_DISABLE_GOPATH=1
GOLANG_12_VERSION=1.12.17
GOLANG_13_VERSION=1.13.8
GOLANG_14_VERSION=1.14.0
GOPATH=/go:/codebuild/output/src993565028
GRADLE_DOWNLOADS_SHA256=14cd15fc8cc8705bd69dcfa3c8fefb27eb7027f5de4b47a8b279218f76895a91 5.4.1\n336b6898b491f6334502d8074a6b8c2d73ed83b92123106bd4bf837f04111043 4.10.3
GRADLE_PATH=/usr/src/gradle
GRADLE_VERSION=5.4.1
HOME=/root
HOSTNAME=ip-10-0-60-214.ap-northeast-1.compute.internal
INSTALLED_GRADLE_VERSIONS=4.10.3 5.4.1
JAVA_11_HOME=/opt/jvm/amazon-corretto-11
JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto
JAVA_HOME=/opt/jvm/amazon-corretto-11
JDK_11_HOME=/opt/jvm/amazon-corretto-11
JDK_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto
JDK_DOWNLOAD_SHA256=4cc9e65e6e3d036b18cfd5fd6c7843d48244e44a60350f7e45036f4825bd3812
JDK_DOWNLOAD_TAR=java-11-amazon-corretto-jdk.tar
JDK_HOME=/opt/jvm/amazon-corretto-11
JRE_11_HOME=/opt/jvm/amazon-corretto-11
JRE_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto/jre
JRE_HOME=/opt/jvm/amazon-corretto-11
MAVEN_DOWNLOAD_SHA512=c35a1803a6e70a126e80b2b3ae33eed961f83ed74d18fcd16909b2d44d7dada3203f1ffe726c17ef8dcca2dcaa9fca676987befeadc9b9f759967a8cb77181c0
MAVEN_HOME=/opt/maven
MAVEN_OPTS=-Dmaven.wagon.httpconnectionManager.maxPerRoute=2
MAVEN_VERSION=3.6.3
NODE_10_VERSION=10.19.0
NODE_12_VERSION=12.16.1
NUGET_XMLDOC_MODE=skip
N_SRC_DIR=/usr/src/n
OLDPWD=/codebuild/readonly
PATH=/root/.phpenv/shims:/root/.phpenv/bin:/root/.goenv/shims:/root/.goenv/bin:/go/bin:/root/.phpenv/shims:/root/.phpenv/bin:/root/.pyenv/shims:/root/.pyenv/bin:/root/.rbenv/shims:/usr/local/rbenv/bin:/usr/local/rbenv/shims:/root/.dotnet/:/root/.dotnet/tools/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tools:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/tools/bin:/usr/local/android-sdk-linux/platform-tools:/codebuild/user/bin
PHP_73_VERSION=7.3.13
PHP_74_VERSION=7.4.1
POWERSHELL_DOWNLOAD_SHA=E8287687C99162BF70FEFCC2E492F3B54F80BE880D86B9A0EC92C71B05C40013
POWERSHELL_DOWNLOAD_URL=https://github.com/PowerShell/PowerShell/releases/download/v6.2.1/powershell-6.2.1-linux-x64.tar.gz
POWERSHELL_VERSION=6.2.1
PWD=/codebuild/output/src993565028/src/github.com/HeRoMo/codepipeline-cdk
PYTHON_37_VERSION=3.7.6
PYTHON_38_VERSION=3.8.1
PYTHON_PIP_VERSION=19.3.1
RBENV_SRC_DIR=/usr/local/rbenv
RUBY_26_VERSION=2.6.5
RUBY_27_VERSION=2.7.0
RUBY_BUILD_SRC_DIR=/usr/local/rbenv/plugins/ruby-build
SBT_VERSION=1.2.8
SRC_DIR=/usr/src
```

### CodePipelineから実行した場合

CodePipelineに組み込まれたCodeBuildではソースはCodePipelineからアーティファクト経由で渡されるので`CODEBUILD_SOURCE_REPO_URL`は定義されていない。
また、`CODEBUILD_INITIATOR`の値がトリガーしたCodePipelineの名前になっている。

```bash
[Container] 2020/04/26 09:28:42 Running command env | sort
ANDROID_HOME=/usr/local/android-sdk-linux
ANDROID_SDK_BUILD_TOOLS=build-tools;29.0.2
ANDROID_SDK_BUILD_TOOLS_28=build-tools;28.0.3
ANDROID_SDK_EXTRAS=extras;android;m2repository extras;google;m2repository extras;google;google_play_services
ANDROID_SDK_MANAGER_SHA256=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
ANDROID_SDK_MANAGER_VER=4333796
ANDROID_SDK_PLATFORM_TOOLS=platforms;android-29
ANDROID_SDK_PLATFORM_TOOLS_28=platforms;android-28
ANT_DOWNLOAD_SHA512=c1a9694c3018e248000ff6f46d48af85f537ef3935e0d5256543c58a240084c0aff5289fd9e94cbc40d5442f3cc43592398047f2548fded40d9882be2b40750d
ANT_VERSION=1.10.6
AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
AWS_DEFAULT_REGION=ap-northeast-1
AWS_EXECUTION_ENV=AWS_ECS_EC2
AWS_REGION=ap-northeast-1
CODEBUILD_AGENT_ENDPOINT=http://127.0.0.1:7831
CODEBUILD_AUTH_TOKEN=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CODEBUILD_BMR_URL=https://CODEBUILD_AGENT:3000
CODEBUILD_BUILD_ARN=arn:aws:codebuild:ap-northeast-1:999999999999:build/CodePiplineLessonCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
CODEBUILD_BUILD_ID=CodePiplineLessonCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz # CodeBuildのの実行毎のユニークID
CODEBUILD_BUILD_IMAGE=aws/codebuild/standard:4.0
CODEBUILD_BUILD_NUMBER=2
CODEBUILD_BUILD_SUCCEEDING=1
CODEBUILD_BUILD_URL=https://ap-northeast-1.console.aws.amazon.com/codebuild/home?region=ap-northeast-1#/builds/CodePiplineLessonCodeBuild:zzzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz/view/new
CODEBUILD_CI=true
CODEBUILD_CONTAINER_NAME=default
CODEBUILD_EXECUTION_ROLE_BUILD=
CODEBUILD_FE_REPORT_ENDPOINT=https://codebuild.ap-northeast-1.amazonaws.com/
CODEBUILD_GOPATH=/codebuild/output/src027937492
CODEBUILD_INITIATOR=codepipeline/CodePiplineLessonPipeline # CodeBuildの実行をトリガーしたCodePipeline名
CODEBUILD_KMS_KEY_ID=arn:aws:kms:ap-northeast-1:999999999999:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CODEBUILD_LAST_EXIT=0
CODEBUILD_LOG_PATH=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CODEBUILD_PROJECT_UUID=e1e0e8b5-47bd-4ffa-9cbc-afbf596a692f
CODEBUILD_RESOLVED_SOURCE_VERSION=5a51d95717f4eeec8f5dc2b201ab1f95fa52441c # GITHUBのCOMMMITID
CODEBUILD_SOURCE_VERSION=arn:aws:s3:::codepiplinelessoncodepip-pipelineartifactsbucket2-xxxxxxxxxxxx/CodePiplineLessonPip/Artifact_S/uTIFICC.zip
CODEBUILD_SRC_DIR=/codebuild/output/src999999999/src
CODEBUILD_START_TIME=1587915912569
CODEBUILD_VPC_AZ=ap-northeast-1a
CTS_LINK_LOCAL_ADDR=169.254.170.3
DEBIAN_FRONTEND=noninteractive
DIND_COMMIT=3b5fac462d21ca164b3778647420016315289034
DOCKER_BUCKET=download.docker.com
DOCKER_CHANNEL=stable
DOCKER_COMPOSE_VERSION=1.24.0
DOCKER_SHA256=c3c8833e227b61fe6ce0bc5c17f97fa547035bef4ef17cf6601f30b0f20f4ce5
DOCKER_VERSION=19.03.3
DOTNET_31_SDK_VERSION=3.1.102
ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/7cc1646f-f02f-4461-8b0f-a60ded412bef
FE_REPORT_LINK_LOCAL_ADDR=169.254.170.8
GITVERSION_VERSION=5.1.2
GOENV_DISABLE_GOPATH=1
GOLANG_12_VERSION=1.12.17
GOLANG_13_VERSION=1.13.8
GOLANG_14_VERSION=1.14.0
GOPATH=/go:/codebuild/output/src027937492
GRADLE_DOWNLOADS_SHA256=14cd15fc8cc8705bd69dcfa3c8fefb27eb7027f5de4b47a8b279218f76895a91 5.4.1\n336b6898b491f6334502d8074a6b8c2d73ed83b92123106bd4bf837f04111043 4.10.3
GRADLE_PATH=/usr/src/gradle
GRADLE_VERSION=5.4.1
HOME=/root
HOSTNAME=ip-10-0-84-104.ap-northeast-1.compute.internal
INSTALLED_GRADLE_VERSIONS=4.10.3 5.4.1
JAVA_11_HOME=/opt/jvm/amazon-corretto-11
JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto
JAVA_HOME=/opt/jvm/amazon-corretto-11
JDK_11_HOME=/opt/jvm/amazon-corretto-11
JDK_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto
JDK_DOWNLOAD_SHA256=4cc9e65e6e3d036b18cfd5fd6c7843d48244e44a60350f7e45036f4825bd3812
JDK_DOWNLOAD_TAR=java-11-amazon-corretto-jdk.tar
JDK_HOME=/opt/jvm/amazon-corretto-11
JRE_11_HOME=/opt/jvm/amazon-corretto-11
JRE_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto/jre
JRE_HOME=/opt/jvm/amazon-corretto-11
MAVEN_DOWNLOAD_SHA512=c35a1803a6e70a126e80b2b3ae33eed961f83ed74d18fcd16909b2d44d7dada3203f1ffe726c17ef8dcca2dcaa9fca676987befeadc9b9f759967a8cb77181c0
MAVEN_HOME=/opt/maven
MAVEN_OPTS=-Dmaven.wagon.httpconnectionManager.maxPerRoute=2
MAVEN_VERSION=3.6.3
NODE_10_VERSION=10.19.0
NODE_12_VERSION=12.16.1
NUGET_XMLDOC_MODE=skip
N_SRC_DIR=/usr/src/n
OLDPWD=/codebuild/readonly
PATH=/root/.phpenv/shims:/root/.phpenv/bin:/root/.goenv/shims:/root/.goenv/bin:/go/bin:/root/.phpenv/shims:/root/.phpenv/bin:/root/.pyenv/shims:/root/.pyenv/bin:/root/.rbenv/shims:/usr/local/rbenv/bin:/usr/local/rbenv/shims:/root/.dotnet/:/root/.dotnet/tools/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tools:/usr/local/android-sdk-linux/tools:/usr/local/android-sdk-linux/tools/bin:/usr/local/android-sdk-linux/platform-tools:/codebuild/user/bin
PHP_73_VERSION=7.3.13
PHP_74_VERSION=7.4.1
POWERSHELL_DOWNLOAD_SHA=E8287687C99162BF70FEFCC2E492F3B54F80BE880D86B9A0EC92C71B05C40013
POWERSHELL_DOWNLOAD_URL=https://github.com/PowerShell/PowerShell/releases/download/v6.2.1/powershell-6.2.1-linux-x64.tar.gz
POWERSHELL_VERSION=6.2.1
PWD=/codebuild/output/src027937492/src
PYTHON_37_VERSION=3.7.6
PYTHON_38_VERSION=3.8.1
PYTHON_PIP_VERSION=19.3.1
RBENV_SRC_DIR=/usr/local/rbenv
RUBY_26_VERSION=2.6.5
RUBY_27_VERSION=2.7.0
RUBY_BUILD_SRC_DIR=/usr/local/rbenv/plugins/ruby-build
SBT_VERSION=1.2.8
SRC_DIR=/usr/src
```

この場合も基本的にCodeBuild内で設定されている環境変数は変わらない。

## NatGatewayの利用

CodeBuildからインターネット側にアクセスする際にIPアドレスを固定できるのか？
接続先のサーバがIP接続元のIPアドレスで制限をかけている場合には必要となると思う。

VPC内に作り、プライベートなサブネットに入れる場合、デフォルトルートがNatGatewayになっていれば、そこからインターネット側に出ていくようだ。

## ビルド結果のフェーズ詳細について

フェーズ詳細には  *buildspec.yaml* で定義してなくても *CodeBuild*の仕様として定義されているフェーズがすべて出力される

例えば、次のように `build`フェーズのみ定義した*buildspec.yaml*を実行する。

```yaml
version: 0.2

phases:
  build:
    commands:
      - echo Build started on `date`
      - env | sort
      - curl 'https://api.ipify.org?format=json'

```

その結果は次の様になり、*buildspec.yaml*にないフェーズについても出力されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/8f305273-9830-5f38-578c-5ddf514ab280.png)

## ビルドトリガーからの環境変数追加

CDKのコードで示すと次の様に `RuleTargetInput` で `environmentVariablesOverride` を渡してやると環境変数をビルドのトリガーから追加してやることができる。

```typescript:cdk
    // add Scheduled Event Trigger
    const codeBuildTarget = new CodeBuildProject(project, {
      event: RuleTargetInput.fromObject({
        environmentVariablesOverride: [
          { name: 'ADDITIONAL_ENV_VARIABLE', value: 'from Event' }, // 追加する環境変数
        ],
      }),
    });
    new Rule(this, 'ScheduleRule', {
      schedule: Schedule.cron({
        hour: '15',
        minute: '57',
      }),
      targets: [codeBuildTarget],
    });
```

上記のコードの結果、次の様なCloudwatch Eventが追加される。おそらくこの通りWebConsoleから作ってもできるのであろう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/336a146e-2ee1-0c30-1efd-24faea63d687.png)

このトリガーで次の様な *buildspec.yaml* を実行する。

```yaml:buildspec.yaml
version: 0.2

phases:
  build:
    commands:
      - echo Build started on `date`
      - env | sort
```

結果は次の通り。トリガーから追加した環境変数が出力されている。

```bash
[Container] 2020/04/29 15:59:05 Running command env | sort 
ADDITIONAL_ENV_VARIABLE=from Event   # <= 追加されている
ANDROID_HOME=/usr/local/android-sdk-linux
ANDROID_SDK_BUILD_TOOLS=build-tools;29.0.2
ANDROID_SDK_BUILD_TOOLS_28=build-tools;28.0.3
```

試してはないが、[AWS CodeBuild でのビルドの実行 \- AWS CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/run-build.html#run-build-cli-auto-start)で示されているパラメータは同様に上書きや設定が可能だと思われる。

## CloudWatch Events に通知される CodeBuildのイベント

### *CodeBuild Build State Change* イベント

CodeBuild Build State Change イベントを例えばLambdaで受けると次のイベントオブエジェクトがハンドラーの引数として渡される。

```json
{
    "version": "0",
    "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "detail-type": "CodeBuild Build State Change",
    "source": "aws.codebuild",
    "account": "xxxxxxxxxxxxxx",
    "time": "2020-10-24T01:11:35Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:codebuild:ap-northeast-1:xxxxxxxxxxxxxx:build/codebuild-project-name:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    ],
    "detail": {
        "build-status": "IN_PROGRESS",
        "project-name": "codebuild-project-name",
        "build-id": "arn:aws:codebuild:ap-northeast-1:xxxxxxxxxxxx:build/codebuild-project-name:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "additional-information": {
            "cache": {
                "type": "NO_CACHE"
            },
            "timeout-in-minutes": 60,
            "build-complete": false,
            "initiator": "morishita",
            "build-start-time": "Oct 24, 2020 1:11:35 AM",
            "source": {
                "report-build-status": true,
                "buildspec": "buildspec.yml",
                "location": "https://github.com/owner/reppo.git",
                "git-clone-depth": 1,
                "type": "GITHUB"
            },
            "source-version": "master",
            "artifact": {
                "location": "arn:aws:s3:::bucket-name/path/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/artifact-name"
            },
            "environment": {
                "image": "aws/codebuild/standard:4.0",
                "privileged-mode": true,
                "image-pull-credentials-type": "CODEBUILD",
                "compute-type": "BUILD_GENERAL1_LARGE",
                "type": "LINUX_CONTAINER",
                "environment-variables": [
                    {
                        "name": "SOME_ENV",
                        "type": "PLAINTEXT",
                        "value": "SOME VALUE"
                    }
                ]
            },
            "logs": {
                "deep-link": "https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logEvent:group=null;stream=null"
            },
            "queued-timeout-in-minutes": 480
        },
        "current-phase": "SUBMITTED",
        "current-phase-context": "[]",
        "version": "1"
    }
}
```

Cloudwatch イベントでこのイベントを受けるルール設定をするときにCodeBuildプロジェクトを特定する方法ではCodeBuild プロジェクトの名前を指定する(detail.project-name で設定)する。
resourcesという項目があり、 CodeBuildプロジェクトのARNを指定するのかと思いきや、どうやら個々のビルド実行に付与されるARNっぽい。
しかし、実行のたびに毎回変わるARNをどうやって設定するのがわからない。ビルド実行の固有値の部分を`*`にしてみたがダメだった。 

## AWS Chatbotとの連携

つぎの記事を読んで、Slackに通知できそうなのでやってみた。

- [AWS Chatbot を利用して AWS 開発者用ツールの通知を Slack で受け取る方法 \| Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/receive-aws-developer-tools-notifications-over-slack-using-aws-chatbot/)
- [Slack での AWS CodeBuild、AWS CodeCommit、AWS CodeDeploy、AWS CodePipeline の通知受け取りが開始に](https://aws.amazon.com/jp/about-aws/whats-new/2020/04/receive-notifications-for-aws-codebuild-codecommit-codedeploy-codepipeline-in-slack/)

フルフルに出力する設定にすると次の通り通知が来る。*buildspec.yaml*に定義していないPhaseのものも通知される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/f1276493-5125-a688-d49b-bb3dcc231e04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/4ba70f79-35d0-febe-84b4-810a63eda000.png)


通知の内容をカスタマイズできないのが不便。でもまあ、最低限の通知はできる。

### Codebuildの通知設定

CodeBuildやCodePipelineで通知を設定すると Cloudwatch Eventに `awscodestarnotifications-rule`という名前のルールが作成される。
次のイベントパータンを受けるようになっていて、ターゲットは `codestar-notifications` となっている。

```json
{
  "source": [
    "aws.codebuild",
    "aws.codecommit",
    "aws.codedeploy",
    "aws.codepipeline"
  ]
}
```

通知先としてはSNSトピックとChatbotを選択できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/3931dc0c-6e6e-79d2-2e5b-1ab301266dbb.png)

Chatbotを選択しても、結局SNSトピックが自動で作られるので、どちらも結局同じかと思ったが、
直接SNSトピックを通知先に選択して、そのトピックをChatbotに関連付けてもSlackに通知は届かなかった。
Cloudwatch LogsにChatbotのログを出力して確認すると、`Event received is not supported (see https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html ):`というログが出ている。

一方、Chatbotを指定した場合には [CloudWatch Event]->[Notifications]->[SNS]->[Chatbot]という連携になるようだ。
CloudWatch Eventを受ける [Notifications]というのがイベントを調整してくれるようだ。