Open20

AWS CodeBuild now supports managed GitHub Action runners

k_ik_i

気になるのは

  • コスト
  • 実行時間のオーバーヘッド
  • 並列数
  • GitHub-hosted runnerと比較したときの制限
  • 一つのCodeBuildプロジェクトを複数のワークフローで使いまわす場合の注意点
k_ik_i

とりあえず手動で作ってみる

k_ik_i

検証アカウントの同時並列数の制限はデフォルトで5だった

k_ik_i

CodeBuildプロジェクト作成後にリポジトリにWebhooksの設定が追加される

k_ik_i

以下の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!"
k_ik_i
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: 
k_ik_i

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!"
k_ik_i

スペックは全環境最小
起動時のオーバーヘッドは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
k_ik_i

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

ワークフロー側で実行環境を指定することも可能

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!"
k_ik_i

プロダクトごとにGitHub Actions用のCodeBuildプロジェクトを用意する -> プロダクトの各AWSアカウントにCodeBuildプロジェクトを用意・メンテする必要がある、プロダクト単位で費用案分ができる

プロダクト間で共通で使用するCodeBuildプロジェクト環境を用意する -> 一つの環境を用意・メンテすれば良い、コストは一つのAWSアカウントに集約される

k_ik_i
  • コスト
    • CodeBuild使う方が安くなりそう
  • 実行時間のオーバーヘッド
    • 起動時に+50sくらい
  • 並列数
  • GitHub-hosted runnerと比較したときの制限
    • 詳しく調べるかある程度使わないと分からない
  • 一つのCodeBuildプロジェクトを複数のワークフローで使いまわす場合の注意点
    • CodeBuildの実行環境が使い回されることがあるなら前のジョブの認証情報が見える可能性があるなどの問題があるかも
k_ik_i

IAMの権限周りが大変だしIaCでテンプレート作っておいてプロダクト単位でCodeBuildプロジェクト作成して使う方式が結局いいのかな