🧱

CodeBuildがGitHub ActionランナーをサポートしたのでDBマイグレーションを試してみた

2024/04/28に公開

序論

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.

https://aws.amazon.com/jp/about-aws/whats-new/2024/04/aws-codebuild-managed-github-action-runners/

この連携によってホストランナーが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プロジェクト作成

手順については公式のドキュメントに準拠しています。
https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html

まずはじめに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
V1_1_0__create_table_demo_a.sql
CREATE TABLE IF NOT EXISTS demo_a (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  PRIMARY KEY (id)
);
V1_1_1__insert_data_demo_a.sql
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に対して新規にテーブルを作成し、デモデータを追加するシンプルなマイグレーションです。

workflow.yml
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パイプラインが完成したら会社のテックブログであらためてブログに書き起こしてみようと思います。

参考文献

https://developers.cyberagent.co.jp/blog/archives/47677/
https://qiita.com/rubytomato@github/items/d1746585451ff0ba917c

脚注
  1. https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions ↩︎

  2. https://aws.amazon.com/jp/codebuild/pricing/ ↩︎

  3. https://flywaydb.org/ ↩︎

  4. https://aws.amazon.com/jp/secrets-manager/ ↩︎

  5. 2024年4月時点での情報です。 ↩︎

GitHubで編集を提案

Discussion