3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2環境でCDKを使ってAgentCore Runtimeで使用するarm64のコンテナイメージを作成する方法

Posted at

Bedrock AgentCoreのCDK L2 Constructを使って見ましたが、私の環境ではハマりポイントがありましたので、解決策を共有します。

AgentCoreのCDK L2 Constructの使い方は本題ではないので省略します。

私はこの記事を参考に実施しました。

【CDK】Amazon Bedrock AgentCore L2 ConstructでStrands Agentsをデプロイしてみた
https://dev.classmethod.jp/articles/cdk-amazon-bedrock-agentcore-l2-construct-strands-agents/

失敗1:何も気にしない場合

とりあえず何も気にせずcdk deployを試しました。

すると、コンテナイメージのビルドとプッシュは成功するのですが、AgentCoreへの登録時に失敗します。

failed: ToolkitError: The stack named *****Stack failed to deploy: UPDATE_ROLLBACK_COMPLETE: Resource handler returned message: "Invalid request provided: Architecture incompatible for uri '*****.dkr.ecr.us-east-1.amazonaws.com/cdk-hnb659fds-container-assets-*****-us-east-1:*****'. Supported architectures: [arm64]

CPUのアーキテクチャが違うと怒られました。AgentCore Runtimeで使用できるコンテナイメージは、CPUのアーキテクチャがarm64である必要があります。

参考:Agent contract requirements

Windows上のWSL2環境の場合、CPUのアーキテクチャがx86_64のため、そのままビルドするとAgentCore Runtimeで使用できません。

✅ コンテナイメージのビルド
✅ ECRへプッシュ
❌ AgentCoreに登録

失敗2:DockerfileのFROMに--platform=linux/arm64を追記

Dockerfileの先頭に、明示的にarm64向けのベースイメージを使用するように指定しました。

参考:Create dockerfile

Dockerfile
- FROM ghcr.io/astral-sh/uv:python3.13-trixie
+ FROM --platform=linux/arm64 ghcr.io/astral-sh/uv:python3.13-trixie

この場合は以下のエラーが出て、コンテナイメージのビルドに失敗するようになりました。

fail: docker build --tag cdkasset-***** . exited with error code 1: #0 building with "default" instance using docker driver

手動で試してみましたが、やはりエラーになります。

docker build -t test .

❌ コンテナイメージのビルド
❌ ECRへプッシュ
❌ AgentCoreに登録

これまでやってた方法を確認

私はこれまでCDKは使わず、手動でコンテナイメージを作成し、CLIでECRにプッシュしてました。その際のコマンドは以下のものです。

参考:Build and deploy ARM64 image

export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export AWS_REGION=$(aws configure get region)
export AGENT_NAME=mastra-hono

docker buildx create --use

aws ecr create-repository --repository-name ${AGENT_NAME} --region ${AWS_REGION}
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

docker buildx build --platform linux/arm64 -t ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AGENT_NAME}:latest --push .

CDKが内部で実行してるであろうコマンドとちょっと違うことがわかりました。

CDKのビルドコマンド
docker build --tag cdkasset-***** .
手動で成功したビルドコマンド
docker buildx create --use
docker buildx build --platform linux/arm64 -t ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AGENT_NAME}:latest --push .

CDKの内部で呼ばれるコマンドを変えることはできないと思うので、docker buildを使ってarm64向けのコンテナイメージを作成する必要があることがわかりました。

解決策

こちらに解決策がありました。@ma2shita さん、ありがとうございます!

公式ドキュメントのMulti-platform buildsに、ホストと異なるCPUアーキテクチャのビルドをする方法がいくつか解説されています。

  1. QEMU
  2. Multiple native nodes
  3. Cross-compilation

1つ目の「QEMU」の方法を使うと、docker buildコマンドを使用してCPUアーキテクチャが異なるコンテナイメージを作成できることがわかりました。

2つ目の「Multiple native nodes」がdocker buildx buildを使用するものです。
ドキュメントではQEMUの方法よりもMultiple native nodesやCross-compilationのほうが、パフォーマンス的なメリットがあるとのことで推奨されています

解決方法としては、CDK Deployを行う前に以下のコマンドを実行し、QEMUのバイナリをインストールします。

docker run --privileged --rm tonistiigi/binfmt --install all
Unable to find image 'tonistiigi/binfmt:latest' locally
latest: Pulling from tonistiigi/binfmt
f4700b809f99: Pull complete 
2adec5d296ac: Pull complete 
Digest: sha256:30cc9a4d03765acac9be2ed0afc23af1ad018aed2c28ea4be8c2eb9afe03fbd1
Status: Downloaded newer image for tonistiigi/binfmt:latest
installing: arm64 OK
installing: riscv64 OK
installing: loong64 OK
installing: mips64 OK
installing: arm OK
installing: s390x OK
installing: ppc64le OK
installing: mips64le OK
{
  "supported": [
    "linux/amd64",
    "linux/amd64/v2",
    "linux/amd64/v3",
    "linux/arm64",
    "linux/riscv64",
    "linux/ppc64le",
    "linux/s390x",
    "linux/386",
    "linux/mips64le",
    "linux/mips64",
    "linux/loong64",
    "linux/arm/v7",
    "linux/arm/v6"
  ],
  "emulators": [
    "WSLInterop-late",
    "python3.12",
    "qemu-aarch64",
    "qemu-arm",
    "qemu-loongarch64",
    "qemu-mips64",
    "qemu-mips64el",
    "qemu-ppc64le",
    "qemu-riscv64",
    "qemu-s390x"
  ]
}

ホストOSやWSL2を再起動したあとには再度実行する必要があります

このコマンドを実行したあと、--platform=linux/arm64を追記したDockerfileがあれば自動的にarm64向けにビルドされます。

cdk deployでAgentCore Runtimeへの登録も成功します。

✅ コンテナイメージのビルド(arm64)
✅ ECRへプッシュ
✅ AgentCoreに登録

解決策2

Xで困ってるよとポストしたところ、deploy-time-buildを使うと、CodeBuildを使ってビルドできると教えてもらいました!(アキキーさん、ありがとうございます!)

教えていただいた @har1101 さんの投稿は、Goさんの投稿を参考にされていて、さらにGoさんに紹介したのはtmokmssさんで、tmokmssさんはdeploy-time-buildの作成ということがわかりました。

なんだかエモさを感じます。皆様ありがとうございます。

npm i deploy-time-buildをしたうえで、CDKのスタックをちょっと変えるだけです。

-   const agentRuntimeArtifact = agentcore.AgentRuntimeArtifact.fromAsset(
-     path.join(__dirname, "../agents/agent")
-   );
+   const agentcoreRuntimeImage = new ContainerImageBuild(this, 'AgentWithGatewayImage', {
+     directory: './agents/agent',
+     platform: Platform.LINUX_ARM64,
+   });

    const runtime = new agentcore.Runtime(this, "ClaudeAgentRuntime", {
      runtimeName: "ClaudeAgent",
-     agentRuntimeArtifact: agentRuntimeArtifact,
+     agentRuntimeArtifact: agentcore.AgentRuntimeArtifact.fromEcrRepository(
+       agentcoreRuntimeImage.repository,
+       agentcoreRuntimeImage.imageTag
+     ),
    });

すばらしい

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?