はじめに
こんにちは、サービス戦略課の森田です。
サービス戦略課では 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 の構成は以下のとおりです。
上記のインフラ構成を 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
改善効果
以下の図をご参照ください。
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 分だったりと制限事項が多数あります。
適宜公式ドキュメントを確認していただければと思います。
ここまでお読みいただき、誠にありがとうございます。
本内容がお役に立てれば幸いです。