2024年4月24日に AWS CodeBuild で GitHub Actions ランナーがサポートされた❗️そして,2023年11月には AWS CodeBuild の実行環境として AWS Lambda を選択できるようになっているため,今回は個人的な検証として GitHub Actions x AWS CodeBuild (AWS Lambda) の組み合わせを試してみた \( 'ω')/
セットアップ
以下のドキュメントを参考に AWS CodeBuild プロジェクトをセットアップする.ポイントとしては Wehbook の Filter Group に WORKFLOW_JOB_QUEUED
を選択するところ💡ちなみに WORKFLOW_JOB_QUEUED
を選択する場合は Buildspec は設定できず,コンソールだと Buildspec will be ignored when you use CodeBuild to run GitHub Actions workflow jobs. Instead, CodeBuild will override it to use commands that will setup the self-hosted runner.
という警告が出ていた💨
あと実行環境として AWS Lambda を選択する場合はランタイムも選択する必要があるため,今回は Python 3.12 (aws/codebuild/amazonlinux-x86_64-lambda-standard:python3.12)
にした.
ちなみに AWS CDK で AWS CodeBuild プロジェクトをセットアップしようと思ったけど,現時点では aws_codebuild.EventAction
で WORKFLOW_JOB_QUEUED
を設定できなかった.L1 Construct の CfnProject
なら設定できそう.今回はコンソールを使って設定することにした.
GitHub Actions ワークフロー
今回は以下のように実装してみた😀
ポイントは runs-on
で,普段は ubuntu-latest
を設定したりするけど,ここに決まったフォーマットを指定することで AWS CodeBuild プロジェクトと紐付けられる.ドキュメントに載っていた runs-on: codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}
というフォーマットをそのまま使った.今回検証で使う AWS CodeBuild プロジェクト名は sandbox
にしてある.
name: GitHub Actions runners in CodeBuild on: workflow_dispatch: push: branches: - master pull_request: branches: - master jobs: build: runs-on: codebuild-sandbox-${{ github.run_id }}-${{ github.run_attempt }} steps: - uses: actions/checkout@v4 - run: python src/app.py - run: env | grep LAMBDA
そして GitHub Actions ワークフローのステップでは,以下の Python コード src/app.py
を実行しつつ,AWS Lambda に関係する環境変数を取得するスクリプトを設定してみた💡
import platform print(platform.python_version())
実行結果
GitHub Actions を実行すると,すぐに AWS CodeBuild でビルドが実行されていた❗️AWS CodeBuild 側のログには GHA self-hosted runner
と表示されていた.
Configuring GHA self-hosted runner -------------------------------------------------------------------------------- | ____ _ _ _ _ _ _ _ _ | | / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ | | | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| | | | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ | | \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ | | | | Self-hosted runner registration | | | --------------------------------------------------------------------------------
そして GitHub Actions 側のログは以下のようになっていた.Python バージョンは 3.12.0
だったり,AWS_LAMBDA_FUNCTION_NAME
という環境変数から customer-xxx
という名前の AWS Lambda 関数が実行されていることなどを確認できた👏(検証用の AWS CodeBuild プロジェクトは既に削除しつつ,関数名はマスキングしてある)
▶Run python src/app.py 3.12.0 ▶Run env | grep LAMBDA AWS_LAMBDA_FUNCTION_VERSION=$LATEST LAMBDA_USER_HOME=/tmp/opt LAMBDA_TASK_ROOT=/var/task AWS_LAMBDA_RUNTIME_API=127.0.0.1:9001 AWS_LAMBDA_FUNCTION_MEMORY_SIZE=1024 LAMBDA_RUNTIME_DIR=/var/runtime AWS_LAMBDA_FUNCTION_NAME=customer-000000000000-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxx AWS_LAMBDA_INITIALIZATION_TYPE=on-demand
できなかったこと
AWS CodeBuild プロジェクトの実行環境を Amazon EC2 ベースにする場合は,runs-on
を codebuild-<project-name>-${{ github.run_id }}-${{ github.run_attempt }}-<image>-<image-version>-<instance-size>
というフォーマットに沿って指定すると環境設定を上書きできるという柔軟さがある.
しかし実行環境を AWS Lambda ベースにする場合だとランタイム・メモリサイズなどを上書きすることはできなさそうだった.ドキュメントにも特に記載はなかった💨 現状ではまだ柔軟な利用はできなさそう.
まとめ
リリースされて気になっていた AWS CodeBuild の GitHub Actions ランナーサポートと AWS Lambda の組み合わせを個人的な検証として試してみた❗️あくまでリリース直後に試してみたレベルの感想ではあるけど,セットアップは比較的簡単で,頻繁に実行する短めのジョブ(例えば Linter 実行・軽めのスキャン実行など)に使うのは相性が良さそうだった.
しかし AWS CodeBuild と AWS Lambda を組み合わせるときの制約もドキュメントに書かれていて,例えば Docker ビルド・VPC 接続はできず,もちろん実行時間の上限もある.そして,今回試した実行環境の設定を上書きすることも現状ではできなさそうだった.制約をうまく活用できるかがポイントになりそう.
あとは Webhook のイベントタイプ WORKFLOW_JOB_QUEUED
を現状 AWS CDK / Terraform で設定できないところも気になるけど,AWS CloudFormation では既にサポートされてそうだし,少し待っていれば解決しそうではある.
ちなみに個人的に GitHub Actions と AWS CodeBuild を組み合わせるときは AWS CodeBuild Run Build for GitHub Actions (aws-actions/aws-codebuild-run-build) を使うことが多く,パラメータの上書きなども柔軟にできて,モノリポ運用との相性もよくて気に入っている👌 参考まで〜