kakakakakku blog

Weekly Tech Blog: Keep on Learning!

CodeBuild の GitHub Actions ランナーサポートを Lambda 実行環境で試した

2024年4月24日に AWS CodeBuild で GitHub Actions ランナーがサポートされた❗️そして,2023年11月には AWS CodeBuild の実行環境として AWS Lambda を選択できるようになっているため,今回は個人的な検証として GitHub Actions x AWS CodeBuild (AWS Lambda) の組み合わせを試してみた \( 'ω')/

aws.amazon.com

aws.amazon.com

セットアップ

以下のドキュメントを参考に 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. という警告が出ていた💨

docs.aws.amazon.com

あと実行環境として AWS Lambda を選択する場合はランタイムも選択する必要があるため,今回は Python 3.12 (aws/codebuild/amazonlinux-x86_64-lambda-standard:python3.12) にした.

docs.aws.amazon.com

ちなみに AWS CDK で AWS CodeBuild プロジェクトをセットアップしようと思ったけど,現時点では aws_codebuild.EventActionWORKFLOW_JOB_QUEUED を設定できなかった.L1 Construct の CfnProject なら設定できそう.今回はコンソールを使って設定することにした.

docs.aws.amazon.com

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-oncodebuild-<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 接続はできず,もちろん実行時間の上限もある.そして,今回試した実行環境の設定を上書きすることも現状ではできなさそうだった.制約をうまく活用できるかがポイントになりそう.

docs.aws.amazon.com

あとは Webhook のイベントタイプ WORKFLOW_JOB_QUEUED を現状 AWS CDK / Terraform で設定できないところも気になるけど,AWS CloudFormation では既にサポートされてそうだし,少し待っていれば解決しそうではある.

docs.aws.amazon.com

ちなみに個人的に GitHub Actions と AWS CodeBuild を組み合わせるときは AWS CodeBuild Run Build for GitHub Actions (aws-actions/aws-codebuild-run-build) を使うことが多く,パラメータの上書きなども柔軟にできて,モノリポ運用との相性もよくて気に入っている👌 参考まで〜

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com