はじめに
先日AWS公式ハンズオンとなる「AWS ハンズオン資料」の「Amazon Elastic Container Service 入門 コンテナイメージを作って動かしてみよう」を試そうとした際、エラーでECSのサービスがデプロイできない問題が発生したため、記事に残しておこうと思います。
エラー内容
「はじめに」で紹介したサイトのアジェンダの「サービスの作成」でECSサービスのデプロイを行った際、以下のようなエラーが表示されました。
h4b-ecs-service のデプロイ中にエラーが発生しました
Resource handler returned message: "Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'." (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: GeneralServiceException)
エラーの原因
ハンズオンではAWS上でオンライン開発環境が利用できるCloud9を使って、Cloud9のインスタンス上でコンテナイメージを作成して、そのイメージをECSにデプロイする手順となっていましたが、私が実施した際はCloud9環境を用意してイメージ作成するのも面倒だったので、自分のPC上でイメージを作成したのが原因でした。
その時使用したPCはM2のMacBook Airだったので、CPUアーキテクチャはARM系、デプロイ先のECSはx86系となることからアーキテクチャの違いが原因となったようです。
対処方法
docker buildする際に--platformオプションでCPUアーキテクチャを指定するかDockerfileのFROMでCPUアーキテクチャを指定することでビルド時に指定のCPUアーキテクチャでイメージを作成できます。
以下、AWS公式ハンズオン内で実行しているコマンドをCPUアーキテクチャ指定のコマンドに置き換えた場合の例。
docker build --platform linux/amd64 -t xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1 .
FROM --platform=linux/amd64 ubuntu:18.04
(省略)
AWS公式ハンズオンでは実行しておりませんが、docker-composeで実行する場合も以下のようにplatformで指定することでCPUアーキテクチャを指定できるようです。
services:
web:
image: ubuntu:18.04
platform: linux/amd64
(省略)
CPUアーキテクチャが違うのにビルドできる理由
M2のMacBook AirでDockerを実行するために、Docker Desktopをインストールしていますが、Docker DesktopはCPUをエミュレーションできるQEMUが含まれています。
デフォルトではdocker buildを実行するPCのCPUアーキテクチャでビルドされますが、コマンド指定やDockerfileでCPUアーキテクチャを指定することで、ビルド時に指定のCPUアーキテクチャでビルドできます。
おわりに
開発を行う場合はUnix系コマンドがネイティブで使える分WindowsよりMacのほうがやりやすいと私は感じていますが、ARM系になってCPUアーキテクチャの違いで苦しめられることも増えているので、たまにIntel系Macが恋しくなる今日このごろ。