Joifup Blog

ECSデプロイで躓いた経験: M1 Macユーザー向けの解決策

2023-03-12

ECSエラーM1 MacDocker

前提

ECSの学習のため、参考サイトを使いDocker Composeでweb(Django)、nginx、db(mysql)の構成をECSにデプロイしようと試みた。しかし、最終段階で問題が発生した。

事象

ecs-cli compose --file docker-compose-ecs.yml service up --cluster-config django-ecs-sampleコマンドを実行すると、以下のようなエラーメッセージが表示された。AWSコンソールでは、dbコンテナの詳細に終了コード: 1と表示されるだけで、詳細なログはなかった。

Deployment has not completed: Running count has not changed for 5.00 minute

解決方法の模索

いくつかの参考サイトを調べたが、原因が分からなかった。ログが見れないと進まないため、タスク定義(ここでいうdocker-compose)にログの設定を行い、再実行した。

すると、AWS CloudWatch上に以下のログが出力されていた。

exec /usr/local/bin/docker-entrypoint.sh: exec format error

このエラーメッセージは、docker-entrypoint.shスクリプトが正しい形式でないということを示している。調査の結果、この問題はM1 Macで発生することが判明した。

原因

この問題はM1 Macで発生し、Dockerfileで使用していたイメージとECSのビルド環境のCPUアーキテクチャが異なっていたことが原因であった。

具体的には、M1 MacはARMベースのCPUアーキテクチャを採用しており、一方で、ECSでは、主にx86_64(AMD64)アーキテクチャが使用されているため、互換性がなく問題が発生した。

対応

デプロイ用のDockerイメージをビルドする際に、--platform linux/amd64オプションを追加してAMD64アーキテクチャのイメージをビルド。以下のようにコマンドを修正し、問題を解決。

docker build --platform linux/amd64 -t <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/django-ecs-sample-mysql:latest -f ./web/Dockerfile-mysql .
docker build --platform linux/amd64 -t <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/django-ecs-sample-web:latest -f ./web/Dockerfile-web .
docker build --platform linux/amd64 -t <aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com/django-ecs-sample-nginx:latest -f ./web/Dockerfile-nginx .

まとめ

約5時間の時間を無駄にしてしまったが、ログの重要性を再認識することができた。M1 MacユーザーがECSデプロイに取り組む際、CPUアーキテクチャに注意し、適切なビルドオプションを使用することが重要。今後は、異なるCPUアーキテクチャ間での互換性を確認し、問題が発生しないように注意して進めるようにしよう。

参考にしたサイト