はじめに
こんにちは。
リンクアンドモチベーション SREの篠原です。
弊社ではクラウド基盤にAWSを利用しているのですが、中でもAWS CodeBuildをいろいろな用途に利用しています。
非常に便利なサービスではありますが、弊社の利用方法だと一部実行そのものがトイルになるケースがあったため簡単なツールを作成して効率化を目指しました。
背景
CodeBuildは一般的にはbuildやunit testなどに利用されることが多いと思います。
基本的にはGitHubなどへのpushやmainへのmergeをフックに動かせば実行自体を意識する必要はなくなります。
ただし弊社の場合はそういった使い方に加えて、各種トイルの自動化にCodeBuildを利用することが多いです。
例えば「QAをするためのテストデータを用意する」というトイルがあった場合、
- 最初は手動でRDSの画面をポチポチしたり、sqlファイルをimportしたりしている状態
- RDSの復元からテストデータimportまでを実行するようなスクリプトを書いて自動化する (大体bashかPython)
- 利用する人が各自で実行環境用意しなくてもいいようにCodeBuildで動かせるようにする
- どのデータを使うかなどのパラメータが必要な場合は、CodeBuildの設定を上書きで実行し環境変数を設定して実行する
のような流れでトイルを自動化して開発者みんなが利用できる状態にする。といった作業を各種進めてきました。

上書きでBuildする際の画面イメージです。
利用者にはDUMP_FILEの値を使いたいsqlファイル名に変更して実行してね!とアナウンスします。
このような形で各種トイルを自動化してきましたが、今度は逆にCodeBuildの実行自体がトイルのようになってきます。
「こっちのCodeBuildを実行して、次はこのCodeBuildをこのパラメータ書き換えて実行して...」というのが日常的に発生する状態です。
CodePipelineやAWS CLIを利用した自動化なども検討しましたが、柔軟にパラメータを書き換えたり直感的に操作するのが少し難しそうでした。
なのでこういった手間を解決するために手前味噌ではありますが簡単なツールを作成しました。
概要
リポジトリはこちらです。
一言で説明すると、実行したいCodeBuildの一覧をYAMLで管理してコマンド一発で同時実行できるようにするCLIツールです。
簡単な使い方
Homebrewでインストールできます。
brew install koh-sh/tap/codebuild-multirunner
% codebuild-multirunner -h
This is a simple CLI tool to "Start build with overrides" multiple AWS CodeBuild Projects at once.
This command will read YAML based config file and run multiple CodeBuild projects with oneliner.
Usage:
codebuild-multirunner [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
dump dump config for running CodeBuild projects
help Help about any command
log Print CodeBuild log for a single build with a provided id.
retry retry CodeBuild build with a provided id
run run CodeBuild projects based on YAML
Flags:
--config string file path for config file. (default "./.codebuild-multirunner.yaml")
-h, --help help for codebuild-multirunner
-v, --version version for codebuild-multirunner
Use "codebuild-multirunner [command] --help" for more information about a command.
設定
実行したいCodeBuildをYAMLで管理できます。
以下のようなファイルを作成します。
buildsはCodeBuildのstart-buildのinputを配列にしたものです。
% cat .codebuild-multirunner.yaml
builds:
- projectName: testproject
- projectName: testproject2
environmentVariablesOverride:
- name: TEST_VAR
value: FOOBAR
type: PLAINTEXT
- projectName: testproject3
sourceVersion: feature/aaa_function
上記ファイルを指定してコマンド実行します。そうすると、
- testprojectというCodeBuildを実行
- testproject2というCodeBuildに
TEST_VAR=FOOBARという環境変数を追加して実行 - testproject3というCodeBuildのsource versionを
feature/aaa_functionと指定して実行
を同時に実行し、ステータスをpollingします。
% codebuild-multirunner run --config .codebuild-multirunner.yaml 2023/08/07 16:50:00 testproject:25fe921a-2c5e-4e91-953a-b63ffe29b03e [STARTED] 2023/08/07 16:50:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [STARTED] 2023/08/07 16:50:00 testproject3:33719fff-7ee7-4828-9c6a-ec814226e3fc [STARTED] 2023/08/07 16:51:00 testproject:25fe921a-2c5e-4e91-953a-b63ffe29b03e [SUCCEEDED] 2023/08/07 16:50:00 testproject3:33719fff-7ee7-4828-9c6a-ec814226e3fc [FAILED] 2023/08/07 16:51:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:52:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:53:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:54:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:55:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:56:00 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [IN_PROGRESS] 2023/08/07 16:57:01 testproject2:4f458d02-6d1b-42fe-9215-3523fbc0ed84 [SUCCEEDED]
他にも設定ファイルの中に環境変数を使えたり、コマンドからそのまま実行ログの確認やリトライなどもできます。
またGitHub Actionsでの利用なども最近対応したのでもし興味があれば試してみてください。
まとめ
おそらく弊社のようなCodeBuildの使い方が珍しいためか、今回のようなケースの解決が既存のサービスやツールだとなかなかできなさそうでした。
もし似たようなお悩みをお持ちであればぜひ試してみてくださいmm