コンテナ化されたアプリケーション開発は、最新のソフトウェア配信に革命をもたらしましたが、CI/CD パイプラインでのイメージビルドが遅いと、開発者の生産性が停止する可能性があります。 AWS CodeBuild がアプリケーションのテストとビルドを自動化しても、チームはリソースの制約、非効率的なキャッシング、複雑なマルチアーキテクチャビルドなどの課題に直面し、遅延、リリース頻度の低下、復旧時間の長期化につながります。
Docker Build Cloud は、イメージのビルドを合理化し、AWS CodeBuild とシームレスに統合し、ビルド時間を大幅に短縮するように設計された高性能クラウドサービスです。Docker Build Cloud を使用すると、強力なクラウドベースのビルダー、共有キャッシング、ネイティブのマルチアーキテクチャ サポートを利用できるだけでなく、CI/CD パイプラインの効率を維持し、開発者は価値をより迅速に提供することに集中できます。
この投稿では、AWS CodeBuild と Docker Build Cloud を組み合わせることで、一般的なボトルネックに対処し、ビルドパフォーマンスを向上させ、ワークフローを簡素化して、チームがより迅速かつ確実に出荷できるようにする方法について説明します。
AWS CodeBuild を使用すると、コンテナアプリケーションのビルドとテストを自動化し、効率的な CI/CD ワークフローを構築できます。 AWS CodeBuild は AWS Identity and Access Management (IAM) とも統合されているため、ビルドプロセスのアクセス許可を詳細に設定し、AWS リソースを制御することができます。
AWS CodeBuild でビルドされたコンテナイメージは、Amazon Elastic Container Registry (Amazon ECR) に保存し、Amazon Elastic Container Service (Amazon ECS)、Amazon Elastic Kubernetes Service (Amazon EKS)、AWS Fargate、AWS Lambda など、さまざまな AWS サービスにデプロイできます (図 1)。 さらに、これらのサービスでは、Armベースのアーキテクチャを採用したAWS Gravitonを活用して、コンピューティングワークロードの価格パフォーマンスを向上させることができます。
AWS CodeBuild を使用したコンテナイメージビルドの課題
使用するツールに関係なく、CI パイプラインでのコンテナイメージのビルドには、多くの場合、かなりの時間がかかります。 これにより、次の問題が発生する可能性があります。
- 開発の生産性の低下
- リリース頻度の低下
- 障害発生時の復旧時間が長い
ビルド時間を延長できる主な理由は次のとおりです。
1。 建築用機械
コンテナイメージの構築には、かなりのリソース(CPU、RAM)が必要です。 CI パイプラインで使用されるマシンの仕様が不十分な場合、ビルド時間が長くなる可能性があります。
単純なコンテナイメージビルドの場合、影響は最小限に抑えられる可能性がありますが、マルチステージビルドや多くの依存関係を持つビルドの場合、影響は大きくなる可能性があります。
AWS CodeBuild では、これらの状況を改善するためにインスタンスタイプを変更できます 。 ただし、このような変更は、コンテナイメージのビルド以外のパイプラインの一部に適用される可能性があり、コストも増加します。
開発者は、パイプラインを最適化するために、コストとビルド速度のバランスを取る必要があります。
2。 コンテナイメージキャッシュ
ローカル開発環境では、 Docker のビルド キャッシュは 、以前にビルドされたレイヤーを再利用することで再構築時間を大幅に短縮し、 Dockerfile の未変更部分の冗長な処理を回避できます。 しかし、クラウドベースのCIサービスでは、デフォルトでクリーンな環境が使用されるため、キャッシュを利用できず、ビルド時間が長くなります。
ストレージレジストリまたはコンテナレジストリを使用してキャッシングを活用する方法はありますが、これらは設定の複雑さとキャッシュデータのアップロードとダウンロードによるオーバーヘッドをもたらすため、多くの場合採用されません。
3。 マルチアーキテクチャビルド(AMD64、Arm64)
Amazon EKS や Amazon ECS で AWS Graviton などの Arm ベースのアーキテクチャを使用するには、Arm64互換のコンテナイメージビルドが必要です。
Apple Silicon などのローカル環境の変化に伴い、AMD64 と Arm64 のマルチアーキテクチャ サポートを必要とするケースが増えています。 ただし、 異なるアーキテクチャのイメージをビルド する場合 (たとえば、Arm で x86 ビルドする場合や、その逆の場合) は、多くの場合、エミュレーションが必要であり、ビルド時間がさらに長くなる可能性があります (図 2)。
AWS CodeBuild は AMD64 と Arm の両方の64 インスタンスを提供しますが、それらを別々のパイプラインとして実行する必要があるため、設定と運用がより複雑になります。
Docker Build Cloud によるコンテナイメージのビルドの高速化
Docker Build Cloud サービスは、クラウドで Docker イメージのビルド プロセスを実行するため、ビルド時間が大幅に短縮され、開発者の生産性が向上します (図 3)。
特に CI パイプラインでは、Docker Build Cloud を使用すると、既存のパイプラインを大幅に変更したり移行したりすることなく、コンテナ イメージのビルドを高速化できます。
Docker Build Cloud には、次の機能が含まれています。
- 高性能クラウドビルダー: 16 個の vCPU と 32GB の RAM を搭載したクラウド ビルダーが利用可能です。これにより、ローカル環境やリソースに制約のある CI サービスと比較して、より高速なビルドが可能になります。
- 共有キャッシュの使用率: Cloud Builder には 200 GiB の共有キャッシュが付属しているため、後続のビルドのビルド時間が大幅に短縮されます。 このキャッシュは追加の設定なしで利用でき、Docker Build Cloud がキャッシュのメンテナンスを処理します。
- マルチアーキテクチャのサポート(AMD64、Arm64): Docker Build Cloud は、1 つのコマンドでマルチアーキテクチャのネイティブ ビルドをサポートします。
docker buildx build
コマンドで--platform linux/amd64,linux/arm64
を指定するか、Bake を使用すると、Arm64 と AMD64 の両方のイメージを同時にビルドできます。このアプローチにより、アーキテクチャごとにパイプラインを分割する必要がなくなります。
AWS CodeBuild + Docker Build Cloudのアーキテクチャ
図 4 は、Docker Build Cloud を使用して AWS CodeBuild でコンテナイメージのビルドを高速化する方法の例を示しています。
- AWS CodeBuild パイプラインは、ソースコードリポジトリ (AWS CodeCommit、GitHub、GitLab) へのコミットからトリガーされます。
- Docker Build Cloudを実行するための準備は、AWS CodeBuild(Buildx インストール、Docker Build Cloudビルダー指定)で行います。
- コンテナイメージは、Docker Build CloudのAMD64 およびArm64 クラウドビルダー上に構築されています。
- ビルドされた AMD64 と Arm64 コンテナイメージは Amazon ECR にプッシュされます。
Docker Build Cloud のセットアップ
まず、Docker Build Cloudを設定します。 (新しい Docker サブスクリプション には、Docker Build Cloud の無料レベルが既に含まれていることに注意してください。
次に、Dockerアカウントでログインし、 Docker Build Cloud Dashboard にアクセスして新しいクラウドビルダーを作成します。
ビルダーが正常に作成されると、ローカル環境 (Docker Desktop、CLI) または CI/CD 環境 (図 5) で使用するためのガイドが表示されます。
さらに、AWS CodeBuild から Docker Build Cloud を使用するには、 Docker パーソナルアクセストークン (PAT) が必要です。 このトークンを AWS Secrets Manager に保存して、安全にアクセスできるようにします。
AWS CodeBuild パイプラインのセットアップ
次に、AWS CodeBuild パイプラインを設定します。 コンテナイメージを保存するためのAmazon ECRリポジトリを事前に準備しておく必要があります。
AWS CodeBuild パイプラインの作成には、次の設定が使用されます。
- 3GB のメモリと 2 個の vCPU を搭載した AMD64 インスタンス。
- Amazon ECR にプッシュし、AWS Secrets Manager から Docker パーソナルアクセストークンにアクセスするアクセス許可を持つサービスロール。
buildspec.yml
ファイルは次のように構成されます。
version: 0.2
env:
variables:
ARCH: amd64
ECR_REGISTRY: [ECR Registry]
ECR_REPOSITORY: [ECR Repository]
DOCKER_ORG: [Docker Organization]
secrets-manager:
DOCKER_USER: ${SECRETS_NAME}:DOCKER_USER
DOCKER_PAT: ${SECRETS_NAME}:DOCKER_PAT
phases:
install:
commands:
# Installing Buildx
- BUILDX_URL=$(curl -s https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json | jq -r ".latest.assets[] | select(endswith(\"linux-$ARCH\"))")
- mkdir -vp ~/.docker/cli-plugins/
- curl --silent -L --output ~/.docker/cli-plugins/docker-buildx $BUILDX_URL
- chmod a+x ~/.docker/cli-plugins/docker-buildx
pre_build:
commands:
# Logging in to Amazon ECR
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY
# Logging in to Docker (Build Cloud)
- echo "$DOCKER_PAT" | docker login --username $DOCKER_USER --password-stdin
# Specifying the cloud builder
- docker buildx create --use --driver cloud $DOCKER_ORG/demo
build:
commands:
# Image tag
- IMAGE_TAG=$(echo ${CODEBUILD_RESOLVED_SOURCE_VERSION} | head -c 7)
# Build container image & push to Amazon ECR
- docker buildx build --platform linux/amd64,linux/arm64 --push --tag "${ECR_REGISTRY}/${ECR_REPOSITORY}:${IMAGE_TAG}" .
install
フェーズでは、Docker Build Cloudを利用するために必要なBuildxをインストールします。
Buildx は AWS CodeBuild にすでにインストールされている場合でも、Docker Build Cloud ではサポートされていないバージョンである可能性があります。 したがって、最新バージョンをインストールすることをお勧めします。
pre_build
フェーズでは、次の手順を実行します。
- Amazon ECR にログインします。
- Docker(Build Cloud)にログインします。
- クラウドビルダーを指定します。
build
フェーズでは、イメージタグが指定され、コンテナイメージがビルドされて Amazon ECR にプッシュされます。
ビルドコマンドとプッシュコマンドを分離する代わりに、 --push
を使用してイメージを Amazon ECR に直接プッシュすると、不要なファイル転送を回避し、ビルドの高速化に貢献します。
結果の比較
比較するために、Docker Build Cloud を使用しない AWS CodeBuild パイプラインが作成されます。 同じインスタンスタイプ (AMD64、 3GB メモリ、 2vCPU) が使用され、ビルドは AMD64 コンテナイメージに限定されます。
さらに、Docker Hubによって課せられるプルレート制限を回避するために、Dockerログインが使用されます。
version: 0.2
env:
variables:
ECR_REGISTRY: [ECR Registry]
ECR_REPOSITORY: [ECR Repository]
secrets-manager:
DOCKER_USER: ${SECRETS_NAME}:DOCKER_USER
DOCKER_PAT: ${SECRETS_NAME}:DOCKER_PAT
phases:
pre_build:
commands:
# Logging in to Amazon ECR
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REGISTRY
# Logging in to Docker
- echo "$DOCKER_PAT" | docker login --username $DOCKER_USER --password-stdin
build:
commands:
# Image tag
- IMAGE_TAG=$(echo ${CODEBUILD_RESOLVED_SOURCE_VERSION} | head -c 7)
# Build container image & push to Amazon ECR
- docker build --push --tag "${ECR_REGISTRY}/${ECR_REPOSITORY}:${IMAGE_TAG}" .
図 6 は、実行結果を示しています。
図 7 は、Docker Build Cloud を使用した AWS CodeBuild パイプラインの実行結果を示しています。
結果は、ビルドするコンテナイメージやキャッシュの状態によって異なる場合がありますが、コンテナイメージをはるかに高速にビルドし、単一のパイプライン内でマルチアーキテクチャビルド(AMD64 とArm64)を実現することができました。
結論
AWS CodeBuild を使用して Docker Build Cloud を CI/CD パイプラインに統合すると、ビルド時間を大幅に短縮し、リリース頻度を向上させることができます。 これにより、開発者は生産性を最大化しながら、ユーザーに価値をより迅速に提供できます。
前述のように、新しい Dockerサブスクリプション には、Docker Build Cloudの無料利用枠がすでに含まれています。 この機会を利用して、現在のプロジェクトのコンテナイメージをどれだけ速くビルドできるかをテストしてください。
さらに詳しく
- Docker Newsletter を購読してください。
- Docker デスクトップの最新リリースを入手します。
- 質問がありますか? Docker コミュニティがお手伝いします。
- ドッカーは初めてですか? 始めましょう。