ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【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 は自動採番され、連番の識別子が付与されます。

batch-build-03.png

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

batch-build-04.png

まとめ

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

この記事は私が書きました

野間 太一

記事一覧

猫とCloudFormationが好きです。

野間 太一

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。