Open20
AWS CodeBuild now supports managed GitHub Action runners
手順
気になるのは
- コスト
- 実行時間のオーバーヘッド
- 並列数
- GitHub-hosted runnerと比較したときの制限
- 一つのCodeBuildプロジェクトを複数のワークフローで使いまわす場合の注意点
とりあえず手動で作ってみる
検証アカウントの同時並列数の制限はデフォルトで5だった

この手順通りで動いた
CodeBuildプロジェクト作成後にリポジトリにWebhooksの設定が追加される

以下のworkflowで実行して成功
helloworld.yml
name: Hello World
on: workflow_dispatch
jobs:
Hello-World-Job:
runs-on: codebuild-codebuild-runner-manual-${{ github.run_id }}-${{ github.run_attempt }}
steps:
- run: echo "Hello World!"
CodeBuildのログ
Creating GHA self-hosted runner workspace folder: actions-runner
Downloading GHA self-hosted runner binary
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
1 179M 1 2172k 0 0 15.0M 0 0:00:11 --:--:-- 0:00:11 14.9M
23 179M 23 42.0M 0 0 36.7M 0 0:00:04 0:00:01 0:00:03 36.7M
48 179M 48 87.8M 0 0 41.0M 0 0:00:04 0:00:02 0:00:02 41.0M
77 179M 77 139M 0 0 43.6M 0 0:00:04 0:00:03 0:00:01 43.6M
100 179M 100 179M 0 0 46.0M 0 0:00:03 0:00:03 --:--:-- 46.0M
Configuring GHA self-hosted runner
--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
| | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| |
| | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ |
| \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ |
| |
| Self-hosted runner registration |
| |
--------------------------------------------------------------------------------
# Authentication
√ Connected to GitHub
# Runner Registration
√ Runner successfully added
√ Runner connection is good
# Runner settings
√ Settings Saved.
Running GHA self-hosted runner binary
√ Connected to GitHub
Current runner version: '2.315.0'
2024-05-01 06:52:01Z: Listening for Jobs
2024-05-01 06:52:05Z: Running job: Hello-World-Job
2024-05-01 06:52:13Z: Job Hello-World-Job completed with result: Succeeded
√ Removed .credentials
√ Removed .runner
Runner listener exit with 0 return code, stop the service, no retry needed.
Exiting runner...
[Container] 2024/05/01 06:52:13.989395 Phase complete: BUILD State: SUCCEEDED
[Container] 2024/05/01 06:52:13.989415 Phase context status code: Message:
[Container] 2024/05/01 06:52:14.026647 Entering phase POST_BUILD
[Container] 2024/05/01 06:52:14.028118 Phase complete: POST_BUILD State: SUCCEEDED
[Container] 2024/05/01 06:52:14.028135 Phase context status code: Message:
GitHub-hosted runnersを使用した場合と比較する
github_hosted_runner_helloworld.yml
name: Hello World GitHub Managed Runner
on: workflow_dispatch
jobs:
Hello-World-Job:
runs-on: ubuntu-22.04
steps:
- run: echo "Hello World!"
スペックは全環境最小
起動時のオーバーヘッドはEC2でもLambdaでも50秒前後くらい
CodeBuild(EC2, aws/codebuild/amazonlinux2-x86_64-standard:5.0, 3GB メモリ、2vCPU)
| No | Total duration | Run time |
|---|---|---|
| 1回目 | 53s | 4s |
| 2回目 | 54s | 4s |
| 3回目 | 47s | 4s |
| 4回目 | 50s | 4s |
| 5回目 | 46s | 4s |
| 平均 | 50s | 4s |
CodeBuild(Lambda, aws/codebuild/amazonlinux-aarch64-lambda-standard:python3.12 ,1GB メモリ)
| No | Total duration | Run time |
|---|---|---|
| 1回目 | 50s | 1s |
| 2回目 | 46s | 2s |
| 3回目 | 49s | 2s |
| 4回目 | 45s | 1s |
| 5回目 | 47s | 2s |
| 平均 | 47.4s | 1.6s |
GitHub-hosted runners(ubuntu-22.04)
| No | Total duration | Run time |
|---|---|---|
| 1回目 | 10s | 1s |
| 2回目 | 10s | 1s |
| 3回目 | 9s | 1s |
| 4回目 | 12s | 1s |
| 5回目 | 10s | 1s |
| 平均 | 10.2s | 1s |
ワークフロー側で実行環境を指定することも可能
runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-<image>-<image-version>-<instance-size>
name: Hello World
on: [push]
jobs:
Hello-World-Job:
runs-on: codebuild-myProject-${{ github.run_id }}-${{ github.run_attempt }}-${{ matrix.os }}
strategy:
matrix:
os: [arm-3.0-small, al2-5.0-large]
steps:
- run: echo "Hello World!"
プロダクトごとにGitHub Actions用のCodeBuildプロジェクトを用意する -> プロダクトの各AWSアカウントにCodeBuildプロジェクトを用意・メンテする必要がある、プロダクト単位で費用案分ができる
プロダクト間で共通で使用するCodeBuildプロジェクト環境を用意する -> 一つの環境を用意・メンテすれば良い、コストは一つのAWSアカウントに集約される
最小スペックでのコスト
| Type | Spec | Cost(/min) |
|---|---|---|
| arm1.small(EC2) | 3GB メモリ、2vCPU | 0.00425USD |
| lambda.arm.1GB(Lambda) | 1GB メモリ | 0.0006USD ※1sあたり0.00001USD |
| Linux(GitHub) | 2 コア | 0.008USD |
- コスト
- CodeBuild使う方が安くなりそう
- 実行時間のオーバーヘッド
- 起動時に+50sくらい
- 並列数
- CodeBuildの並列数による
- 引き上げ可能
- GitHub-hosted runnerと比較したときの制限
- 詳しく調べるかある程度使わないと分からない
- 一つのCodeBuildプロジェクトを複数のワークフローで使いまわす場合の注意点
- CodeBuildの実行環境が使い回されることがあるなら前のジョブの認証情報が見える可能性があるなどの問題があるかも
IAMの権限周りが大変だしIaCでテンプレート作っておいてプロダクト単位でCodeBuildプロジェクト作成して使う方式が結局いいのかな