CodeBuildがGitHub ActionランナーをサポートしたのでDBマイグレーションを試してみた
序論
2024年4月24日、CodeBuildがGitHub Actionホストランナーをサポートしました。
AWS CodeBuild now supports managed GitHub Action self-hosted runners. Customers can configure their CodeBuild projects to receive GitHub Actions workflow job events and run them on CodeBuild ephemeral hosts. AWS CodeBuild is a fully managed continuous integration service that compiles source code, runs tests, and produces software packages ready for deployment.
この連携によってホストランナーがVPC内で実行できるようになりました。またホストランナーをLambdaでも使えるようになったことで小さな処理を気軽にできるようになったことも大きなポイントです。
GitHub Actionsは最小課金単位が1分からであり1分以内に終わった処理も1分としてカウントされます。[1]
一方、CodeBuild上で実行されるLambdaの最小課金単位は1秒からなので1分以内に完了するジョブのコストが下げられるようになります。[2]
最近会社でFlyway[3]を使ったDBマイグレーションのCI/CDについて検証していたのでこの機能をつかってDBマイグレーションを簡略化できないか検証してみることにしました。
対象読者
- GitHub ActionからAWSリソースへセキュアに接続したい
- AuroraへのDBマイグレーションをGitHub Actionsで実現したい
構成図
構築するアーキテクチャは以下の通りです。
アーキテクチャ図
ユーザーがGitHubへプッシュしたらCodeBuild内で、GitHub ActionホストランナーがFlywayを起動しAuroraへデータを追加する単純なCI/CDパイプラインを構築していきます。
実装
CodeBuildプロジェクト作成
手順については公式のドキュメントに準拠しています。
まずはじめにCodeBuildとGitHubを接続します。OAuthを使用して接続すればGitHubのsettings>applications
でCodeBuild用のOAuthアプリが追加されていることが確認でき、CodeBuild上でGitHubリポジトリを参照できるようになります。
プライマリソースのWeb hookイベントでコードの変更がこのレポジトリにプッシュされるたびに再構築する
にチェックをつけ、フィルターグループに WORKFLOW_JOB_QUEUED
を選択すればGitHubActionsワークフローのジョブイベントでCodeBuildが起動されます。
環境では起動コンピューティングにEC2かLambdaを選べます。環境イメージもAWSがマネージドに提供されているAmazon LinuxやUbuntu以外にもカスタムイメージで自身のコンテナイメージをGitHub Action上で起動できます。
ただ残念ながらLambdaをVPC内で起動させることはできず、Auroraに対して何か接続させるといったことは一筋縄ではいきません。
今回はコンピューティングにEC2を選択し、VPC内で起動させるようにします。DBへの接続情報はSecrets Manager[4]に登録させているので環境変数に追加しました。
ホストランナーをセットするとBuildspec
は無視されるので設定しなくても大丈夫です。
他の設定値はデフォルトのままにしてビルドプロジェクトを作成します。
GitHubリポジトリ準備
Flywayを実行できる最小限の構成でリポジトリを作成します。
.
├── .github
│ └── workflows
│ └── workflow.yml
└── sql
├── V1_1_0__create_table_demo_a.sql
└── V1_1_1__insert_data_demo_a.sql
CREATE TABLE IF NOT EXISTS demo_a (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO demo_a (name) VALUES ('demo a test data 1');
INSERT INTO demo_a (name) VALUES ('demo a test data 2');
INSERT INTO demo_a (name) VALUES ('demo a test data 3');
こちらの記事内のSQLファイルをそのまま使わさせていただきましたが、マイグレーション先DBに対して新規にテーブルを作成し、デモデータを追加するシンプルなマイグレーションです。
name: self-hosted-runner
on:
push:
branches: [ "main" ]
jobs:
build:
#ビルド設定
runs-on: codebuild-github-hosted-runner-connect-${{ github.run_id }}-${{ github.run_attempt }}
#Flywayで使うDB接続認証
#$DB_HOST、$DB_USER、$DB_PASSWORDはプロダクト構築時の環境変数を呼び出している
env:
FLYWAY_URL: jdbc:mysql://$DB_HOST:3306/test
FLYWAY_USER: $DB_USER
FLYWAY_PASSWORD: $DB_PASSWORD
steps:
- uses: actions/checkout@v4
- name: Setup flyway
run: |
wget -qO- https://download.red-gate.com/maven/release/com/redgate/flyway/flyway-commandline/10.11.1/flyway-commandline-10.11.1-linux-x64.tar.gz | tar -xvz && sudo ln -s `pwd`/flyway-10.11.1/flyway /usr/local/bin
- name: Run Flyway info
run: |
flyway info -url=${{ env.FLYWAY_URL }} -user=${{ env.FLYWAY_USER }} -password=${{ env.FLYWAY_PASSWORD }}
- name: Set baseline
run: |
flyway baseline -baselineVersion=1.0.0 -baselineDescription="App version 1.0" -url=${{ env.FLYWAY_URL }} -user=${{ env.FLYWAY_USER }} -password=${{ env.FLYWAY_PASSWORD }}
- name: Run Flyway Migration
run: |
flyway migrate -url=${{ env.FLYWAY_URL }} -user=${{ env.FLYWAY_USER }} -password=${{ env.FLYWAY_PASSWORD }}
- name: Run Flyway result
run: |
flyway info -url=${{ env.FLYWAY_URL }} -user=${{ env.FLYWAY_USER }} -password=${{ env.FLYWAY_PASSWORD }}
ワークフローファイルではruns-on
を以下のように設定することでビルド環境をCodeBuild上に変更できます。
runs-on: codebuild-<CodeBuildのプロジェクト名>-${{ github.run_id }}-${{ github.run_attempt }}
ちなみに、コンピューティングリソースについてはプロジェクト構築時に選択したものがデフォルトで設定されていますが、上書きもできます。
runs-on: codebuild-<CodeBuildのプロジェクト名>-${{ github.run_id }}-${{ github.run_attempt }}-<image>-<image-version>-<instance-size>
ドキュメントより引用[5]
ワークフロー実行
ワークフローファイルを作成しGitHubへプッシュしたらCodeBuild上でビルドが実行され、GitHub Actionのホストランナーが起動されます。
[Container] 2024/04/27 14:17:36.856738 Entering phase PRE_BUILD
[Container] 2024/04/27 14:17:36.858566 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2024/04/27 14:17:36.858582 Phase context status code: Message:
[Container] 2024/04/27 14:17:36.900801 Entering phase BUILD
GHA self-hosted runner build triggered by /actions/runs/8860461823/job/24331274329
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
13 179M 13 24.9M 0 0 37.8M 0 0:00:04 --:--:-- 0:00:04 37.7M
35 179M 35 64.1M 0 0 37.6M 0 0:00:04 0:00:01 0:00:03 37.6M
55 179M 55 99.9M 0 0 38.0M 0 0:00:04 0:00:02 0:00:02 38.0M
84 179M 84 151M 0 0 42.0M 0 0:00:04 0:00:03 0:00:01 42.0M
100 179M 100 179M 0 0 43.9M 0 0:00:04 0:00:04 --:--:-- 43.9M
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-04-27 14:18:13Z: Listening for Jobs
2024-04-27 14:18:16Z: Running job: build
2024-04-27 14:18:57Z: Job build completed with result: Succeeded
√ Removed .credentials
√ Removed .runner
Runner listener exit with 0 return code, stop the service, no retry needed.
Exiting runner...
CodeBuildでGitHub Actionのホストランナーが起動されるとGitHub Actionのワークフローが実行されDBのマイグレーションが始まります。
所感
CodeBuild上でGitHub Actionホストランナーを起動させてAuroraへのDBマイグレーションを試してみました。
ホストランナーからAuroraへのセキュアな接続が強化されるようになり、新たにBuildspecファイルを書かなくてもワークフローファイルだけでCI/CDパイプラインが完結できるのは便利だなと感じました。
Flywayについては最近存在を知ったばかりで適当な使い方になってしまいましたが、会社でDBマイグレーションのCI/CDパイプラインが完成したら会社のテックブログであらためてブログに書き起こしてみようと思います。
参考文献
Discussion