AWS CodeBuild をローカル環境で実行テストする方法

# 概要
AWS CodeBuild の処理内容を記載した buildspec.yml のファイルをローカルで動作検証する方法をまとめてみました。
今回は、Amazonlinux2（aws/codebuild/amazonlinux2-x86_64-standard:3.0）を利用してビルドします。

# 作業

## イメージ取得

まずは実行イメージとビルドイメージをpullしてきます。

```shell
$ docker pull public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:3.0
$ docker pull public.ecr.aws/codebuild/local-builds:latest
```

## 実行エージェントの取得

実行用のスクリプトをダウンロードし、権限を付与します。
```shell
$ wget https://raw.githubusercontent.com/aws/aws-codebuild-docker-images/master/local_builds/codebuild_build.sh
$ chmod +x codebuild_build.sh
```

## 各種設定ファイルの準備


buildspec.ymlのサンプルファイルを準備います。

```yaml:buildspec.yml
Version: 0.2
phases:
 build:
   commands:
     - echo '==================================='
     - echo $INPUT_TEXT1
     - echo $INPUT_TEXT2
     - echo '==================================='
```

テスト用の環境変数を設定します。

```shell:codebuild_local.env
INPUT_TEXT1=build_test1!!!
INPUT_TEXT2=build_test2!!!!
```

ファイル構成は以下のようになります。

```
.
├── buildspec.yml
├── codebuild_build.sh
└── codebuild_local.env
```


## 実行（サンプル）

```
./codebuild_build.sh -c　-i public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:3.0 -s `pwd` -a ./artifacts -e codebuild_local.env -p [your aws profile]
```
※ 注）上記コマンドをコピーすると `-c　-i` の間のスペースが全角になる場合があります。コマンド実行でエラーが発生する場合はスペースの確認をしてみてください。 

**必須**
`-i` 実行イメージを指定します。
`-a` outputの場所を指定します。

**オプション**
`-c` ローカルのaws認証情報を利用する場合は指定します。（例えばaws cliを利用して何か処理をするときは指定が必要です。）
`-s` ソースコード実行したい `buildspec.yml` のファイルがあるディレクトリを指定してください。指定がない場合はカレンとディレクトリが参照されます。
`-e` 環境変数を記述したファイルを指定できます。
`-p` aws profileの指定ができます。

### 参考

https://github.com/aws/aws-codebuild-docker-images/tree/master/local_builds

## 実行結果

```shell
Removing agent-resources_build_1 ... done
Removing agent-resources_agent_1 ... done
Removing network agent-resources_default
Removing volume agent-resources_source_volume
Removing volume agent-resources_user_volume
Creating network "agent-resources_default" with the default driver
Creating volume "agent-resources_source_volume" with local driver
Creating volume "agent-resources_user_volume" with local driver
Creating agent-resources_agent_1 ... done
Creating agent-resources_build_1 ... done
Attaching to agent-resources_agent_1, agent-resources_build_1
agent_1  | [Container] 2022/03/03 23:48:57 Waiting for agent ping
agent_1  | [Container] 2022/03/03 23:48:59 Waiting for DOWNLOAD_SOURCE
agent_1  | [Container] 2022/03/03 23:49:00 Phase is DOWNLOAD_SOURCE
agent_1  | [Container] 2022/03/03 23:49:00 CODEBUILD_SRC_DIR=/codebuild/output/src665470603/src
agent_1  | [Container] 2022/03/03 23:49:00 YAML location is /codebuild/output/srcDownload/src/buildspec.yml
agent_1  | [Container] 2022/03/03 23:49:00 Processing environment variables
agent_1  | [Container] 2022/03/03 23:49:00 Moving to directory /codebuild/output/src665470603/src
agent_1  | [Container] 2022/03/03 23:49:00 Registering with agent
agent_1  | [Container] 2022/03/03 23:49:00 Phases found in YAML: 1
agent_1  | [Container] 2022/03/03 23:49:00  BUILD: 4 commands
agent_1  | [Container] 2022/03/03 23:49:00 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
agent_1  | [Container] 2022/03/03 23:49:00 Phase context status code:  Message: 
agent_1  | [Container] 2022/03/03 23:49:00 Entering phase INSTALL
agent_1  | [Container] 2022/03/03 23:49:00 Phase complete: INSTALL State: SUCCEEDED
agent_1  | [Container] 2022/03/03 23:49:00 Phase context status code:  Message: 
agent_1  | [Container] 2022/03/03 23:49:00 Entering phase PRE_BUILD
agent_1  | [Container] 2022/03/03 23:49:00 Phase complete: PRE_BUILD State: SUCCEEDED
agent_1  | [Container] 2022/03/03 23:49:00 Phase context status code:  Message: 
agent_1  | [Container] 2022/03/03 23:49:00 Entering phase BUILD
agent_1  | [Container] 2022/03/03 23:49:00 Running command echo '==================================='
agent_1  | ===================================
agent_1  | 
agent_1  | [Container] 2022/03/03 23:49:00 Running command echo $INPUT_TEXT1
agent_1  | build_test1!!!
agent_1  | 
agent_1  | [Container] 2022/03/03 23:49:00 Running command echo $INPUT_TEXT2
agent_1  | build_test2!!!!
agent_1  | 
agent_1  | [Container] 2022/03/03 23:49:00 Running command echo '==================================='
agent_1  | ===================================
agent_1  | 
agent_1  | [Container] 2022/03/03 23:49:00 Phase complete: BUILD State: SUCCEEDED
agent_1  | [Container] 2022/03/03 23:49:00 Phase context status code:  Message: 
agent_1  | [Container] 2022/03/03 23:49:00 Entering phase POST_BUILD
agent_1  | [Container] 2022/03/03 23:49:00 Phase complete: POST_BUILD State: SUCCEEDED
agent_1  | [Container] 2022/03/03 23:49:00 Phase context status code:  Message: 
agent-resources_agent_1 exited with code 0
Stopping agent-resources_build_1 ... done
Aborting on container exit...
```

`buildspec.yml` 記述した通りの出力になってれば成功です！

# 参考サイト

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/use-codebuild-agent.html

https://dev.classmethod.jp/articles/codebuild-exec-on-local/

https://note.com/ryoma_0923/n/n9ec63d67607f