はじめに
先日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
が恋しくなる今日このごろ。