- 公開日
- 最終更新日
【CodeBuild】バッチビルドを使ってデプロイ時間を短くしてみた
この記事を共有する
目次
はじめに
こんにちは!パーソル&サーバーワークスの野間です。
皆さんは AWS CodeBuild(以下、CodeBuild)の処理時間が長いと感じたことはないでしょうか?
私の環境では処理を増やしすぎて実行時間が長くなったビルドプロジェクトがあり、不便に感じていました。
そこで今回は、CodeBuild のバッチビルドを使って、連続実行していた処理の合計所要時間を短縮する方法を試してみました。
実装する構成について
今回は、同じ処理を複数リージョンへデプロイするビルドに対してバッチビルドを適用します。
バッチビルドは、1つのビルドプロジェクトから複数の子ビルドを並列実行できる機能です。
例として AWS CloudFormation(以下、CloudFormation)のスタックを大阪リージョンとバージニア北部リージョンにデプロイしているビルドプロジェクトを使います。
以下は変更前の buildspec.yml です。更新対象の CloudFormation スタック名とテンプレートを多数列挙しており、順次実行のため待ち時間が発生していました。
更新する CloudFormation スタックが増えるほど、待ち時間でビルド全体の所要時間が伸びていました。
version: 0.2
phases:
build:
commands:
- |
aws cloudformation deploy \
--template-file $TEMPLATE_FILE_PATH_1 \
--stack-name $STACK_NAME_1 \
--capabilities CAPABILITY_NAMED_IAM \
--region ap-northeast-3
- |
aws cloudformation deploy \
--template-file $TEMPLATE_FILE_PATH_1 \
--stack-name $STACK_NAME_1 \
--capabilities CAPABILITY_NAMED_IAM \
--region us-east-1
(以下省略)
今回の CloudFormation テンプレートは、VPC を 1 つ作成するだけのシンプルな内容です。
Resources:
VPC01:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VPCCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: vpc-01
buildspec の設定
続いて、バッチビルド用 buildspec の設定です。
バッチビルドには ビルドグラフ/ビルドリスト/ビルドマトリックス の 3 つのモードがあります。
- ビルドグラフ:子ビルド同士の依存関係を表現するモード。depend-on を使って子ビルドの依存関係を設定できます。
- ビルドリスト:依存関係のないタスクを並列実行する最もシンプルなモードです。
- ビルドマトリックス:渡した変数の組み合わせごとに子ビルドを自動展開し、並列実行します(例:STACK_ID × REGION で 10×2=20 本)。
今回はビルドマトリックスを使い、STACK_ID(10 個)× REGION(2 個)で 20 本の子ビルドを自動展開する設定にしました。
補足:バッチ全体の失敗ポリシーは fast-fail で制御できます(true=1 件失敗で全停止、false=最後まで実行)。
version: 0.2
batch:
fast-fail: false
build-matrix:
static:
ignore-failure: false
dynamic:
env:
variables:
STACK_ID:
- stack01
- stack02
- stack03
- stack04
- stack05
- stack06
- stack07
- stack08
- stack09
- stack10
REGION:
- ap-northeast-3
- us-east-1
phases:
pre_build:
commands:
- aws --version
- ls -R
build:
commands:
- |
STACK_NAME="${STACK_ID}-${REGION}"
TEMPLATE_FILE_PATH="stacks/${STACK_ID}.yml"
aws cloudformation deploy \
--template-file "$TEMPLATE_FILE_PATH" \
--stack-name "$STACK_NAME" \
--capabilities CAPABILITY_NAMED_IAM \
--region "$REGION"
ビルドプロジェクトの設定
続いてビルドプロジェクトの設定です。
CloudFormation テンプレートや buildspec は GitLab から取得する設定にしています。
- 「BuildBatchConfig」の設定が必要です。
- MaximumBuildsAllowed は子ビルドの最大同時実行数です。今回は 20 本並列にしたいので、20 を指定しています。
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: !Ref CodeBuildProjectName
Source:
Type: GITLAB
Auth:
Type: CODECONNECTIONS
Resource: !Ref CodeConnectionsArn
BuildSpec: !Ref BuildSpecFilePath
Location: !Ref RepositoryUrl
ReportBuildStatus: false
GitCloneDepth: 1
SourceVersion: refs/heads/main
BuildBatchConfig: # この設定を追加
ServiceRole: !GetAtt CodeBuildRole.Arn
Restrictions:
MaximumBuildsAllowed: 20
Triggers:
BuildType: BUILD_BATCH
Webhook: true
FilterGroups:
- - Type: EVENT
Pattern: PUSH
- Type: HEAD_REF
Pattern: refs/heads/main
Environment:
Type: ARMLAMBDACONTAINER
Image: aws/codebuild/amazonlinux-aarch64-lambda-standard:corretto21
ComputeType: BUILD_LAMBDA_1GB
Artifacts:
Type: NO_ARTIFACTS
ServiceRole: !GetAtt CodeBuildRole.Arn
実行結果
ビルドを実行したところ、子ビルドが作成され並列でビルドが実行されるようになりました!
バッチグループ ID は自動採番され、連番の識別子が付与されます。

ビルドの実行時間は子ビルドの数が10個の場合「2分15秒」、20個の場合「2分26秒」でした。
並列実行のため、子ビルド数が増えても全体の所要時間が大きく伸びにくいのはメリットです。
また、今回は VPC を 1 つのみ作成するシンプルなテンプレートですが、デプロイするリソースが増えるほど効果は大きくなります。

まとめ
今回は、ビルド時間短縮のため CodeBuild のバッチビルドを設定しました。
ビルド時間が短くなることで、CI/CD パイプライン運用の効率化が見込めます。
同様の課題に向き合っている方の参考になれば幸いです。
この記事は私が書きました
野間 太一
記事一覧猫とCloudFormationが好きです。