🛠️

[AWS] AWS CodeBuildがECRのカスタムイメージに対応しました![2024/03/19]

2024/03/20に公開

AWS CodeBuildがECRのカスタムイメージに対応

https://aws.amazon.com/about-aws/whats-new/2023/11/aws-codebuild-lambda-compute/

今日朝起きたら素晴らしいニュースが飛び込んできたのでやってみます!

背景

以前からCodeBuildをビルドなどの用途で利用していました。ただ、2023/11以前はComputeとしてEC2 Compute Modeしか選択肢がなく、起動(Provisioning Phase)に結構時間がかかっていることが悩みでした。

https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-compute-types.html#environment.types

これが、2023/11の下記リリースで、AWS LambdaのCompute Modeを使用することが可能になり、起動やスケーラビリティが向上しました。

https://aws.amazon.com/about-aws/whats-new/2023/11/aws-codebuild-lambda-compute/

ただし、この時点ではカスタムイメージを利用することはできず、AWS managedのコンテナイメージしか利用できませんでした。そのため、できることの幅は少し限られていました。

しかし、昨日ついにカスタムイメージがサポートされました!

https://aws.amazon.com/about-aws/whats-new/2024/03/aws-codebuild-custom-images-lambda-compute/

というわけで、早速お試ししていきます。

やってみる

Container ImageをECR RepositoryにPushする

利用したDockerfileは下記。これをBuildしてECRにpushしておきます。

FROM public.ecr.aws/lambda/provided:al2023

RUN dnf install cowsay -y

ENTRYPOINT ["cowsay"]

CodeBuildでプロジェクト作成

CodeBuildでCreate Projectを実行します。すると、下記の通り、Custom Container ImageをECRを指定できるようになっていることがわかります。

なお、プロジェクト作成時にIAM Roleを自動生成するようにも選択可能ですが、この場合は、ちゃんとECRからの読み取り権限が与えられるようになってます。ちゃんと最低限になっていますね。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-west-2:211125485143:repository/codebuild-custom-lambda-image-sample"
        }
    ]
}

実行

作ったプロジェクトを早速実行してみます。

1回目実行。完了後、Phase Detailsを見てみると、Provisioningに結構80秒強かかってますね。(コマンドミスでエラーになってますが見逃してください)

ただし、2回目を実行してみると。。。

爆速、かつちゃんとcowがHello Worldしてくれてます。

無事、カスタムイメージを実行することができました!

PROVISIONINGにかかる時間について

先ほどの実行時間について、2回目が高速なのはPROVISIONING Phaseで、AWS LambdaがWarm Startした結果なのか、という疑問が湧いてきました。

新しいカスタムイメージを作って、2個同時実行してみます。

1つ目。やはりPROVISIONINGで時間がかかっていますね。

2つ目。QUEUEDで時間がかかっています。

Service Quotaとして下記のようなQuotaは存在するのですが、3が適用されているように見えるので、これは影響はしないような気がします。

4つ同時に実行した際には、そもそもBuildがスタートせずに失敗します。なのでQuotaに引っかかる場合にはそもそも実行開始できないよう。

うーん。普段はシーケンシャルな実行しかしてないので気にならなかったのかもしれないですが、この辺りの挙動については、もう少し後で調べて追記します。

なお、10時間後に同じECRのイメージを利用して、再実行してみました。が、PROVISIONINGは早いままですね。初回のみPROVISIONINGで時間がかかるのはCold Startとはまた違う理由なのかもしれないですが、現状謎です。(そもそもCold Startだとしても80秒は長すぎるし)

各パターンにおける起動時間の違い

書きたい(TBU)

まとめ

ついにAWS CodeBuildでカスタムイメージがサポートされました!AWS CodeBuildを利用されている方はぜひ導入を検討してみてはいかがでしょうか。

Discussion