CodeBuild – Lambdaバージョン
2023年11月6日に、CodeBuildのビルド環境に関するアップデートが発表されました。
ビルド実行の新しいコンピューティングモードとして AWS Lambda を選択できるようになりました。AWS Lambda はほぼ瞬時に起動するため、より高速なビルドが可能となります。また、Lambda でコンピューティングを実行すると、1 秒あたりの使用量に対して課金されるため、コストを最適化することができます。
AWS CodeBuild で AWS Lambda によるコンピューティングのサポートを開始
今回はLambdaを使用したCodeBuildをご紹介します。
構築する環境
LambdaタイプのCodeBuildプロジェクトを作成します。
LambdaのイメージはARMタイプ、Python3.12バージョンを使用します。
今回はPython製パッケージyt-dlpを使用して、YouTubeから動画をダウンロードします。
ダウンロードした動画ファイルをS3バケットに配置します。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
テンプレートファイルのポイント解説
CodeBuild
Resources:
CodeBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Artifacts:
Type: NO_ARTIFACTS
Cache:
Type: NO_CACHE
Environment:
ComputeType: !Ref ProjectEnvironmentComputeType
EnvironmentVariables:
- Name: BUCKET_NAME
Type: PLAINTEXT
Value: !Ref BucketName
Image: !Ref ProjectEnvironmentImage
ImagePullCredentialsType: CODEBUILD
Type: !Ref ProjectEnvironmentType
LogsConfig:
CloudWatchLogs:
GroupName: !Ref LogGroup
Status: ENABLED
Name: !Sub "${Prefix}-project"
ServiceRole: !GetAtt CodeBuildRole.Arn
Source:
Type: NO_SOURCE
BuildSpec: !Sub |
version: 0.2
phases:
install:
commands:
- pip3 install yt-dlp
build:
commands:
- yt-dlp -o /tmp/output.mp4 'https://www.youtube.com/watch?v=TqqaSD2qTdY'
- ls -al /tmp
- aws s3 cp /tmp/output.mp4 s3://$BUCKET_NAME/
Visibility: PRIVATE
Code language: YAML (yaml)
ポイントは4点です。
1点目と2点目はComputeTypeおよびTypeプロパティです。
今回はARMタイプのLambdaを使用して、最小ビルド環境(メモリ1G)を作成したいと思います。
ですから前者に「BUILD_LAMBDA_1GB」を、後者に「ARM_LAMBDA_CONTAINER」を指定します。
詳細につきましては、以下のページをご確認ください。
3点目はImageプロパティです。
今回はPython3.12バージョンの環境を作成したいと思います。
ですから本プロパティに「aws/codebuild/amazonlinux-aarch64-lambda-standard:python3.12」を指定します。
詳細につきましては、以下のページをご確認ください。
4点目はSourceプロパティです。
本プロパティにbuildspec.ymlを直接記載します。
installフェーズでyt-dlpをインストールします。
同パッケージのインストールはPythonパッケージ管理ツールpipを使用します。
buildフェーズでは、まずyt-dlpを使用して、YouTubeから動画をダウンロードします。
今回ダウンロードする動画はAWS公式チャンネルの動画です。
動画のダウンロード先がポイントです。
以下の制約から、ダウンロード先は/tmpを指定します。
AWS Lambda は、/tmp 外部のファイルへの書き込みはサポートしていません。付属のパッケージマネージャーは、パッケージのダウンロードと参照にデフォルトで /tmp ディレクトリを使用するように設定されています。
AWS Lambda コンピューティングの制限
ダウンロードした動画ファイルをS3バケットにアップロードします。
この操作はAWS CLIを使用します。
以下に引用した通り、Lambda版のCodeBuildは、AWS CLIをサポートしています。
AWS Lambda は、AWS CLI v2、AWS SAM CLI、git、go、Java、Node.js、Python、pip、Ruby、および .NET の各ツールをサポートしています。
AWS Lambda 上で実行される、選別されたランタイム環境の Docker イメージには、どのツールとランタイムが含まれますか?
(参考) S3バケット
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref Prefix
AccessControl: Private
Code language: YAML (yaml)
ダウンロードした動画ファイルを配置するバケットです。
特別な設定は不要です。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
AWS Management ConsoleからCodeBuildプロジェクトを確認します。
Environmentを見ると、確かにARMタイプのLambdaでビルド環境が構築されています。
イメージはPython3.12バージョン、メモリは1GBです。
buildspec.ymlもCloudFormationテンプレートで指定した通りです。
動作確認
準備が整いましたので、CodeBuildプロジェクトを開始します。
しばらく待つと、ビルドが正常に完了しました。
以下が各フェーズの状況です。
確かに全フェーズが正常に完了しています。
次にビルド時のログを確認します。
ログを見ると、buildspec.ymlで指定したコマンドを順番に実行していることがわかります。
まずyt-dlpをインストールしてます。
その後、yt-dlpコマンドでYouTubeから動画をダウンロードしています。
/tmpディレクトリを見ると、確かにoutput.mp4ファイルが設置されていることがわかります。
そしてAWS CLIを使って、output.mp4をS3バケットにアップロードしています。
最後にS3バケットを確認します。
確かにバケットに動画ファイルが保存されていました。
まとめ
Lambdaを使用したCodeBuildをご紹介しました。