エムオーテックス株式会社が運営するテックブログです。

AWS CodeBuild の実行環境に AWS Lambda を選択するとビルド効率が 7.7 倍に向上した話

はじめに

こんにちは、サービス戦略課の森田です。
サービス戦略課では LANSCOPE エンドポイントマネージャー クラウド版の技術的負債解消やフローの自動化など開発者の生産性向上のためのサービス改善に日々取り組んでいます。

今回は AWS CodeBuild の実行環境に AWS Lambda を選択してビルド時間を短縮した方法についてご紹介したいと思います。

AWS CodeBuild の実行環境とは

まず、AWS CodeBuild は、開発者がアプリケーションのビルド、テスト、デプロイメントを効率的に管理できる AWS のクラウドベースのサービスです。

CI / CD パイプラインの一部として AWS CodeBuild を活用することで、アプリケーションのビルドプロセスを自動化し、開発プロジェクトの効率性を向上させ、迅速なデプロイメントを実現できます。

AWS CodeBuild の実行環境は、従来は AWS EC2 上で実行されていました。
2023年11月に AWS Lambda を実行環境として選択できるようになりました。

AWS Lambda を実行環境として選択することで、起動速度が早くなり、より高速なビルドを期待することができます。
また、AWS Lambda は自動的にスケーリングするため、ビルドキューで待機が発生する問題を解消することができます。

これにより、ビルド時間を短縮することができます。

※AWS Lambda を選択した場合は、現時点では制限事項も多数存在するため、公式ドキュメント *1 を適宜参照することをお勧めします。

実行環境として AWS Lambda を選択してみた

現在取り組んでいるプロジェクトで、CI/CD 環境を構築する機会があったため、早速試してみました。

プロジェクトの要件として、本番環境の AWS S3 にスクリプトファイルを配置する必要がありました。
そのため、ビルド定義 (buildspec.yaml) では AWS S3 にスクリプトファイルをアップロードするコマンドを記述しています。
※弊社の開発方針として、本番環境への作業は可能な限り手動作業を排除し、IaC 化を推奨しています。

CI/CD の構成は以下のとおりです。

CI/CD の構成

上記のインフラ構成を CloudFormation で定義します。

AWS CodePipeline

パイプラインに Upload フェーズを定義して、AWS CodeBuild を呼び出すようにしました。

  CodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      Name: sample-pipeline
      ArtifactStore:
        Type: S3
        Location: artifacts
        EncryptionKey:
          Id: arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
          Type: KMS
      RoleArn: arn:aws:iam::${AWS::AccountId}:role/codepipeline-role
      Stages:
        - Name: Source
          Actions:
            - Name: Source
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: CodeCommit
                Version: 1
              RunOrder: 1
              Configuration:
                PollForSourceChanges: false
                RepositoryName: sample-repository
                BranchName: sample-branch
              InputArtifacts: []
              OutputArtifacts:
                - Name: SourceArtifact
              RoleArn: !Sub arn:aws:iam::xxxxxxxxxxxx:role/codecommit-role
        - Name: Upload
          Actions:
            - Name: Confirm
              ActionTypeId:
                Category: Approval
                Owner: AWS
                Provider: Manual
                Version: 1
              RunOrder: 1
            - Name: Upload
              ActionTypeId:
                Category: Build
                Owner: AWS
                Provider: CodeBuild
                Version: 1
              Configuration:
                ProjectName: !Ref CodeBuild
              Namespace: UploadVariables
              InputArtifacts:
                - Name: SourceArtifact
              OutputArtifacts:
                - Name: UploadArtifact
              RunOrder: 2

AWS CodeBuild

実行環境として以下を定義します。

  • Image: aws/codebuild/amazonlinux-aarch64-lambda-standard:corretto17
  • Type: ARM_LAMBDA_CONTAINER
  • ComputeType: BUILD_LAMBDA_1GB

今回は、AWS Lamda のイメージとして corretto17 を選択してみました。

注意点として、実行環境に AWS Lambda を選択した場合、ビルドのタイムアウトが 15 分になります。
そのため、AWS::CodeBuild::Project リソースに TimeoutInMinutes プロパティを定義すると、エラーが発生します。

  CodeBuild:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: sample-buildproject
      BadgeEnabled: false
      ServiceRole: !Sub arn:aws:iam::${AWS::AccountId}:role/codebuild-role
      Artifacts:
        Type: CODEPIPELINE
      EncryptionKey: arn:aws:kms:ap-northeast-1:xxxxxxxxxxxx:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      Source:
        Type: CODEPIPELINE
        BuildSpec: buildspec.yaml
      Environment:
        Image: aws/codebuild/amazonlinux-aarch64-lambda-standard:corretto17
        Type: ARM_LAMBDA_CONTAINER
        ComputeType: BUILD_LAMBDA_1GB
        PrivilegedMode: false

buildspec.yaml

ビルド対象のリポジトリに以下の buildspec.yaml を配置しました。

version: 0.2
phases:
  build:
    commands:
      - aws s3 cp sample.sh s3://bucket-name/sample.sh

改善効果

以下の図をご参照ください。

AWS EC2 と AWS Lambda の比較

PROVISIONING と BUILD フェーズで大幅に時間が短縮されていることが確認できました。
それにより、ビルドプロセス全体の時間が短縮されました。
従来の AWS EC2 のビルド時間 54 秒と比較すると、AWS Lambda は 7 秒のため、ビルド効率が 7.7 倍に向上しました。

※AWS EC2 と AWS Lambda のスペックは以下を指定して比較しています。

AWS EC2 AWS Lambda
Image aws/codebuild/amazonlinux2-aarch64-standard:2.0 aws/codebuild/amazonlinux-aarch64-lambda-standard:corretto17
Type ARM_CONTAINER ARM_LAMBDA_CONTAINER
ComputeType BUILD_GENERAL1_SMALL BUILD_LAMBDA_1GB

おわりに

今回は、AWS S3にスクリプトファイルをアップロードするだけのシンプルなビルド内容で試してみました。
実行環境に AWS Lambda を選択することで、実行環境の起動が高速になり、ビルドプロセス全体の時間を短縮できることが確認できました。
今回のビルドプロジェクトはそもそもビルド時間が短いため効果が実感しにくいですが、アプリケーションのビルドで試すことで大きな改善効果が得られるのではと感じました。

ただし、AWS Lambda を選択した場合はタイムアウトが 15 分だったりと制限事項が多数あります。
適宜公式ドキュメントを確認していただければと思います。

ここまでお読みいただき、誠にありがとうございます。
本内容がお役に立てれば幸いです。