GitHub Actionsのself-hosted RunnerとしてCodeBuildを使用

# はじめに

GitHub Actionsのself-hosted runnerとしてCodeBuildを用います。

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

# CodeBuildをGitHubリポジトリに接続

まだ接続していなければ、下記記事を参考に接続します。
私はOAuthで接続しました。

https://qiita.com/suzuki-navi/items/9b69a39668826f28b85c

## CodeBuild側のDOWNLOAD_SOURCEフェーズで4xxエラーになる場合

ここの接続が上手くいっていない場合、CodeBuild側のDOWNLOAD_SOURCEフェーズで4xxエラーになります。
私が当たったのは下記エラーになります。

```
CLIENT_ERROR Message: Error while fetching Github runner token: error code 400: Runner token unavailable: POST https://api.github.com/repos/OWNER/REPOSITORY/actions/runners/registration-token: 404 Not Found
```

設定が合っていること前提で、この時の解決方法として2パターンありました。

### 1.CodeBuild側と接続しているアカウントがGitHub Organizationにいなかった

アカウントがOrganizationにいるか、権限が十分に与えられているかを確認しましょう。

### 2.アカウントがGitHub Organizationに属しており、CodeBuild側からの動作では問題なくGitHubのリポジトリを取得できるが、GitHub ActionsからのCodeBuild実行だとDOWNLOAD_SOURCEフェーズで躓く

GitHub側のアカウントを見直します。CodeBuildの接続は推奨通りに作成しているのであれば、secret managerに保存されています。
GitHub側のトークンと合わせて見直します。

- OAuthで作成されている場合
  - https://docs.github.com/ja/apps/oauth-apps/using-oauth-apps/reviewing-your-authorized-oauth-apps
- トークンで作られている場合
  - https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens

最終手段ですが、 `Use override credentials for this project only` で該当CodeBuildだけ別のトークンで上書きます。

![スクリーンショット 2025-03-08 17.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/abdb97cf-d097-4c57-b59c-52fe396ff5d7.png)

# CodeBuildの設定

あとは画像のように設定します。
特に指定はしませんが、私はCodeBuildのコンピューティングリソースは下記にしました。(他デフォルト・最新)

- コンピューティング: EC2
- OS: Ubuntu

![スクリーンショット 2025-03-08 17.06.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/0e42f8ea-fd6a-4726-8c69-9fb0406e107b.png)

![スクリーンショット 2025-03-08 17.06.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/898fb6a8-1f25-40ae-b219-ebaf4a8b0c64.png)

Project typeでRunner projectを選んだ時点で、ついているので問題ないかと思いますが、フィルタグループが `WORKFLOW_JOB_QUEUED` になっているかを確認しましょう。

![スクリーンショット 2025-03-08 17.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/6d019186-5f09-42e7-8b81-10138bb94161.png)

# GitHub側を設定

CodeBuildが作成できたらGitHub側の確認をします。

リポジトリのSettings > Webhooksを見に行きますと、下記webhookが出来上がっています。

![スクリーンショット 2025-03-08 17.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/951c9b1c-f834-4341-a20a-97ebcc1fccc4.png)

対象Webhookを開いて、下記の通りに設定します。

- Content typeが `application/json`
- `Which events would you like to trigger this webhook?` が `Let me select individual events.` で、下記2つにチェックをつける
    - Workflow jobs
    - Workflow runs

# 動かすActionsを設定

ここからは各々やりたいことがあると思いますが、私はPythonのコードを動かしてみます。
[workflow_dispatch](https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_dispatch)で入力されたポケモンの図鑑No.を[pokeAPI](https://pokeapi.co/)に通してレスポンスを表示するようにします。

## Pythonのコード

```py
import os

import requests


def main():
    picture_book_number = os.environ['PICTURE_BOOK_NUMBER']
    response = requests.get(f'https://pokeapi.co/api/v2/pokemon/{picture_book_number}')
    contents = response.json()
    print(contents)


if __name__ == '__main__':
    main()
```

### requirements.txt

```
requests
```

## ワークフローYML

`runs-on` を [GitHub Actions ワークフロー YAML を更新](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/action-runner.html#sample-github-action-runners-update-yaml)にある通り、codebuildを指定します。
CodeBuildの設定編集画面からここの値を取得できます。

![スクリーンショット 2025-03-08 18.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/30eea378-0348-4346-aa42-30e4513bd194.png)

あとはやりたいように書きます。

```yml
name: test

on:
  workflow_dispatch:
    inputs:
      picture_book_number:
        type: number
        required: true

jobs:
  testtest:
    runs-on: codebuild-test-github-actions-self-hosted-runner-codebuild-${{ github.run_id }}-${{ github.run_attempt }}

    steps:
      - name: checkout repository
        uses: actions/checkout@v4

      - name: apt update
        run: sudo apt update

      - name: install python
        run: sudo apt install -y python3 python3-pip

      - name: install requirements.txt
        run: pip install -r requirements.txt

      - name: run main.py
        run: python main.py
        env:
          PICTURE_BOOK_NUMBER: ${{ github.event.inputs.picture_book_number }}

```

# 動かしてみる

動かしてみましょう。

発火！

![スクリーンショット 2025-03-08 18.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/4f0cb773-3a0b-45fb-a828-d56c5f603c2c.png)

CodeBuild側が動いています！

![スクリーンショット 2025-03-08 18.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/510a0181-171c-4fc6-9586-1f410ae02dee.png)

成功！

![スクリーンショット 2025-03-08 18.26.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/7bf73f4f-2d89-4ab2-bfaf-650a3b588c6c.png)

取得もできています！やったー！

![スクリーンショット 2025-03-08 18.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299962/ac7a9541-3e81-4c75-a2a7-a9869d49cc88.png)

# おわりに

GitHubとの接続周りで5億年つまりました。