AWS CodeBuild で GitHub Actions を利用してみる



# 内容

https://aws.amazon.com/jp/about-aws/whats-new/2023/07/aws-codebuild-github-actions/

## 使い方

- CodeBuild の `buildspec` に `steps` を追加する。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/action-runner-buildspec.html

## 利用できる Actions 

- [GitHub Marketplace](https://github.com/marketplace?type=actions) の　Actions　が利用可能。

## ソースプロバイダ

- [GitHub](https://github.co.jp/) に接続する必要がある。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/access-tokens.html#access-tokens-github-console

- GitHub 以外のソースプロバイダーを使用することも可能だが、GitHub Actions を使用するには、GitHub　に接続する必要がある。

## 費用

- 追加費用なしでサポート

## リージョン

- CodeBuild が使用可能なリージョンで利用可能。

## 制限事項

https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html#action-runner-limitations

# やってみる

ドキュメントにサンプルがありましたので、試してみました。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/action-runner-samples.html

## 1. GitHub に接続する

GitHub　に接続する必要があるとのことですので、上記の「ソースプロバイダ」の項目にあるドキュメントを参考に接続します。

## 2. ソースプロバイダを指定する

GitHub 以外のソースプロバイダも利用することが可能とのことですので、CodeCommit を指定してみました。
![スクリーンショット 2023-09-16 17.54.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c832d25d-643b-6824-1961-bcbbf0dfb3cf.png)

## 3. 制限事項

上記の「制限事項」にも書かれていますが、ビルドプロジェクトで特権モードを有効にして、デフォルトの Docker ユーザー (root) で実行する必要があります。
![スクリーンショット 2023-09-16 18.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/fd08b870-9850-eb86-3e56-738d8fef3e7e.png)

特権モードを有効を有効にしていない場合は、次のドキュメントに記載のあるようなエラーとなり失敗となります。

`Error: "Cannot connect to the Docker daemon" when running a build (ビルドの実行時に「Docker デーモンに接続できません」)`

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/troubleshooting.html#troubleshooting-cannot-connect-to-docker-daemon

## 4. buildspec.yaml を作成する

上記の「使い方」を参考に `steps` を追加します。
GitHub Action を既に利用している方はご存じかと思いますが、基本的には同じ感じの記載です。

```buildspec.yaml
version: 0.2
phases:
  build:
    steps:
      - name: Super-Linter
        uses: super-linter/super-linter@v5.3.0
        env:
          VALIDATE_ALL_CODEBASE: true
```

ここでは、super-linter を利用しています。
Super-Linter アクションは、その名の通り Linter です。
また、env で　明示的に VALIDATE_ALL_CODEBASE を明示的 true にしています。（デフォルト値ですが。。。）
このあたりの、変数は公開されている内容を確認します。
VALIDATE_ALL_CODEBASE はリポジトリ全体を解析し、すべてのタイプで検証するすべてのファイルを検索します。false に設定すると、新しいファイルまたは編集されたファイルのみが検証のために解析されます。

https://github.com/marketplace/actions/super-linter

## 5. 実行する

今回は特に CodePipeline は利用していないので、CodeBuild から手動で実行します。

まず、以下のファイルはわざと失敗させるように作成しています。

```python
import boto3

def lambda_handler(event, context):
    greeting = hello
    print(greeting)
```

ログが長いので省きますが、Python3 では、　pylint / flake8 / black / isort　が実行されいずれも　ERROR　になっていることがわかります。

```
[Container] 2023/09/16 09:30:37 2023-09-16 09:30:37 [ERROR]   ERRORS FOUND in PYTHON_BLACK:[1]
[Container] 2023/09/16 09:30:37 2023-09-16 09:30:37 [ERROR]   ERRORS FOUND in PYTHON_PYLINT:[1]
[Container] 2023/09/16 09:30:37 2023-09-16 09:30:37 [ERROR]   ERRORS FOUND in PYTHON_FLAKE8:[1]
[Container] 2023/09/16 09:30:37 2023-09-16 09:30:37 [ERROR]   ERRORS FOUND in PYTHON_ISORT:[1]
[Container] 2023/09/16 09:30:37 2023-09-16 09:30:37 [FATAL]   Exiting with errors found!

[Container] 2023/09/16 09:30:37 Command failed with exit status 2
[Container] 2023/09/16 09:30:37 Phase complete: BUILD State: FAILED
[Container] 2023/09/16 09:30:37 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: - name: Super-Linter
  uses: super-linter/super-linter@v5.3.0
  env:
    VALIDATE_ALL_CODEBASE: "true"
. Reason: exit status 2
```

コードを修正して再度、CodeBuild　から手動で実行します。

```python
def lambda_handler(event, context):
    greeting = "hello"
    print(greeting)
```

修正後は、すべてのファイルが正常に　Linte され、ERROR　は消えたことが確認できました。

```
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   ----------------------------------------------
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   ----------------------------------------------
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   The script has completed
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   ----------------------------------------------
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   ----------------------------------------------
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [NOTICE]   All file(s) linted successfully with no errors detected
[Container] 2023/09/16 09:44:35 2023-09-16 09:44:35 [INFO]   ----------------------------------------------
```