M1Macを使用していて、AWSのECSを利用したコンテナデプロイをしようとしている方に注意点があります。
今回の内容は私がかなりハマった部分であるため、自分用のメモとして投稿しようと思いますが参考にしてくださる方がいれば嬉しいです。
M1Mac使用者がECSデプロイで気をつけなければいけないことはCPUアーキテクチャについてです。私を含め、初学者や駆け出しエンジニアの方からすればなんだそれ?ってなるのではないでしょうか。
CPUアーキテクチャとは...
じゃあそのCPUアーキテクチャってなんなのとなるのですが正直、私もまだしっかりと理解することはできていないです。そのため、CPUアーキテクチャについて分からないよって方がいれば一度検索して調べてみてください。
そうするとx86やARM64やAMD64といた型番のようなものが出てきたと思います。
CPUアーキテクチャには今あげた3つのように種類があるとだけわかっていればいいと思います。
実際にローカルで立ち上げているDockerコンテナがある方は以下のコマンドを実行して確認してみてください。
dockerイメージを確認
docker images
確認したいイメージ名を当てはめてコマンドを実行
docker inspect {イメージ名}
すると長いコードがいっぱい出てきますがその中にArchitectureという部分があると思います。
そこに書かれているのがDockerイメージで使用するCPUアーキテクチャになります。
ちなみに筆者は"Architecture": "amd64"
と表示されました。
Dockerfileでイメージを作成する時にFROMでベースとなるイメージを明記すると思います。
ちなみにこれは私がRailsの環境を構築する時に作成したDockerfileのFROMの部分です。
FROM ruby:3.0.2-alpine3.14
M1Mac使用者がこのようにDockerfileでベースとなるイメージを指定すると
CPUアーキテクチャがARM64のイメージを作成することになります。
ローカル環境でDockerを立ち上げる場合は問題ないのですがECSでコンテナデプロイをする場合はCPUアーキテクチャがAMD64と明記されているDockerイメージを使用しなければなりません。
それはECS側がARM64のCPUアーキテクチャに対応していないためです。
そのため、ECRにプッシュするDockerイメージを作成するDockerfileでは以下のようにCPUアーキテクチャを指定する必要があります。
FROM --platform=linux/x86_64 ruby:3.0.2-alpine3.14
こうすることでCPUアーキテクチャがAMD64と明記されるようになると思います。
そしてECSでしっかり機能するようになると思います。
仮にARM64と明記されたDockerイメージをECRにプッシュしてECSで動かそうとすると
コンテナが停止してしまい停止理由がEssential container in task exited
と出てきます。
すでにローカルでDocker環境を立ち上げている方はローカルでARM64用のパッケージなどが使われていないか確認する必要がある場合もあります。私はRailsの環境のnokogiriというのがARM64用のものを使用していてECSでnokogiriに関するエラーが表示されてかなり悩まされました。参考にしてみてください。
分かりづらい部分もあったと多いますが誰かの助けになれば幸いです。ありがとうございました。