🐎

ECSのビルドを高速化したい

2024/06/30に公開

ECSのビルドを高速化したい。
そう思ってbuildspec.ymlを修正しました。

結論、2回に1回高速化が成功するという中途半端な状態で沼っているのが現状です。。。

試したこと

以下の記事を参考にしました。
https://zenn.dev/paiza/articles/improve-codebuild-performance-2

やったことはシンプルで、インラインキャッシュを有効化しました

version: 0.2
env:
  variables:
    DOCKER_BUILDKIT: 1
phases:
  pre_build:
    on-failure: ABORT
    commands:
      - ECR_REPOSITORY_URL=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION_NAME}.amazonaws.com/${ECR_REPOSITORY_NAME}
      - aws ecr --region ${AWS_REGION_NAME} get-login-password | docker login --username AWS --password-stdin https://${ECR_REPOSITORY_URL}
      - BUILD_TIME=`date '+%Y%m%d%H%M%S'`
      - SHORT_COMMIT_HASH=${CODEBUILD_RESOLVED_SOURCE_VERSION:0:7}
      - WEB_IMAGE_TAG="${BRANCH}-web-${BUILD_TIME}-${SHORT_COMMIT_HASH}"
      - WEB_LATEST_IMAGE_TAG="${BRANCH}-web-latest"
  build:
    on-failure: ABORT
    commands:
      - "\
          docker build \
          -f .container/web/Dockerfile . \
          -t ${ECR_REPOSITORY_URL}:${WEB_IMAGE_TAG} \
          -t ${ECR_REPOSITORY_URL}:${WEB_LATEST_IMAGE_TAG} \
          --build-arg BUILDKIT_INLINE_CACHE=1 \
          --cache-from ${ECR_REPOSITORY_URL}:${WEB_LATEST_IMAGE_TAG}\
        "
  post_build:
    on-failure: ABORT
    commands:
      - "\
          aws ecr batch-delete-image \
          --repository-name ${ECR_REPOSITORY_NAME} \
          --image-ids imageTag=${WEB_LATEST_IMAGE_TAG}\
        "
      - docker image push ${ECR_REPOSITORY_URL}:${WEB_LATEST_IMAGE_TAG}
      - docker image push ${ECR_REPOSITORY_URL}:${WEB_IMAGE_TAG}
以下略

※実際には複数のコンテナをビルドしています。

結果

5分半程度かかっていたビルド時間が15秒程度に短縮されました。

そう思ったのも束の間、、再度ビルドしてみると

またも5分半程度かかってしまいました。
さらにもう一度ビルドすると今度は15秒程度で終わり、その次はまた5分半かかり、、
というように、修正してから偶数回目のビルドでキャッシュが効かないという事象が発生しました。

調査

ログを見てみます。

#4 importing cache manifest from xxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/repo:develop-web-latest
#4 sha256:xxxxx
#4 ERROR: unexpected status code [manifests develop-web-latest]: 403 Forbidden

キャッシュの利用に失敗する際には403エラーが出ています。

同じような事象に遭遇している人はいないかと調べてみたところ、buildkitのGithubリポジトリでissueとして上がっていました。
https://github.com/moby/buildkit/issues/2274

どうやらbuildkitのバグのようですが、回避策について議論されています。
個人的に以下の見地が有効そうだと思っていますが、まだどうやれば実装できるか研究している段階です。
https://github.com/moby/buildkit/issues/2274#issuecomment-1674335355

最後に

まだ解決に至っていないので、時間を見つけて挑戦していきます。

Githubの調査によると、エンジニアはビルド待ちに多くの時間を費やしているとのことです。
https://github.blog/2023-06-13-survey-reveals-ais-impact-on-the-developer-experience/

私は実際のところ、ビルド時間が長い場合はただ待っているのでなく別タスクに着手してしまいます。
それは必然的にマルチタスクを引き起こし、集中力を奪っていくことにつながります。
だからビルド時間は極限まで短くしたいなと思っています。

Discussion