CodeBuild – Lambdaバージョン

CodeBuild – Lambdaバージョン

2023年11月6日に、CodeBuildのビルド環境に関するアップデートが発表されました。

ビルド実行の新しいコンピューティングモードとして AWS Lambda を選択できるようになりました。AWS Lambda はほぼ瞬時に起動するため、より高速なビルドが可能となります。また、Lambda でコンピューティングを実行すると、1 秒あたりの使用量に対して課金されるため、コストを最適化することができます。

AWS CodeBuild で AWS Lambda によるコンピューティングのサポートを開始

今回はLambdaを使用したCodeBuildをご紹介します。

構築する環境

Diagram of CodeBuild - Lambda Version

LambdaタイプのCodeBuildプロジェクトを作成します。
LambdaのイメージはARMタイプ、Python3.12バージョンを使用します。

今回はPython製パッケージyt-dlpを使用して、YouTubeから動画をダウンロードします。
ダウンロードした動画ファイルをS3バケットに配置します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

GitHub
awstut-fa/149 at main · awstut-an-r/awstut-fa Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

テンプレートファイルのポイント解説

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」を指定します。

詳細につきましては、以下のページをご確認ください。

あわせて読みたい
ビルド環境のコンピューティングモードおよびタイプ - AWS CodeBuild では CodeBuild、 がビルドの実行 CodeBuild に使用するコンピューティングおよびランタイム環境イメージを指定できます。 コンピューティング とは、 が管理および維持す...

3点目はImageプロパティです。
今回はPython3.12バージョンの環境を作成したいと思います。
ですから本プロパティに「aws/codebuild/amazonlinux-aarch64-lambda-standard:python3.12」を指定します。

詳細につきましては、以下のページをご確認ください。

あわせて読みたい
が提供する Docker イメージ CodeBuild - AWS CodeBuild サポートされているイメージ は、 で利用可能なイメージの最新のメジャーバージョン CodeBuild であり、マイナーバージョンとパッチバージョンの更新で更新されます。 Code...

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

AWS Management ConsoleからCodeBuildプロジェクトを確認します。

Detail of CodeBuild 01.

Environmentを見ると、確かにARMタイプのLambdaでビルド環境が構築されています。
イメージはPython3.12バージョン、メモリは1GBです。

Detail of CodeBuild 02.

buildspec.ymlもCloudFormationテンプレートで指定した通りです。

動作確認

準備が整いましたので、CodeBuildプロジェクトを開始します。
しばらく待つと、ビルドが正常に完了しました。

以下が各フェーズの状況です。

Detail of CodeBuild 03.

確かに全フェーズが正常に完了しています。

次にビルド時のログを確認します。
ログを見ると、buildspec.ymlで指定したコマンドを順番に実行していることがわかります。

Detail of CodeBuild 04.

まずyt-dlpをインストールしてます。

Detail of CodeBuild 05.

その後、yt-dlpコマンドでYouTubeから動画をダウンロードしています。

/tmpディレクトリを見ると、確かにoutput.mp4ファイルが設置されていることがわかります。

そしてAWS CLIを使って、output.mp4をS3バケットにアップロードしています。

最後にS3バケットを確認します。

Detail of S3 01.

確かにバケットに動画ファイルが保存されていました。

まとめ

Lambdaを使用したCodeBuildをご紹介しました。