🤖

M2 MacでビルドしたDockerコンテナをAWS App Runnerにデプロイすると失敗する

2024/07/06に公開

はじめに

タイトルの通り、Docker化したNode.jsサーバをローカルでビルドし、ECRにプッシュ。その後そのイメージをApp Runnerにデプロイしようとしたところ失敗しました。

結論

DockerイメージとApp Runnerのプラットフォームでアーキテクチャのズレがあったのが原因でした。

私の使用しているM2 MacbookのCPUアーキテクチャはlinux/arm64で、何も指定せずdocker buildを行うとlinux/arm64でビルドされます。
かたや、App Runnerのアーキテクチャはlinux/amd64にしか対応していないそうです。
このアーキテクチャの違いによってデプロイ時に下記エラーが発生しました。

exec /docker-entrypoint.sh: exec format error

ちなみにApp Runnerのイベントログではなく、Cloud Watchのほうにエラーログが出力されていました。デプロイ時ではなく実行時に起因するものだからでしょうか。AWSに慣れていないので少し時間を食ってしまいました。

対策

docker buildコマンドにアーキテクチャを指定するか、Dockerfileにアーキテクチャを明記しましょう。

docker build --platform linux/amd64 -t imagename ./

もしくは

Dockerfile
FROM --platform=linux/amd64 node:18-alpine

でビルドすることにより、想定したアーキテクチャが使用されます。後者の方がオペレーションミスの発生を防ぐことができそうです。

まとめ

以前Google CloudのCloud RunでDockerイメージをデプロイするときも同じようなミスを犯したような気がするので、自戒と啓蒙のため投稿しました。
余談ですがGoogle Cloudのほうがシンプルで使いやすいですね。AWSは高機能すぎて個人開発にはtoo muchと感じる機会が多いです。精進します。

Discussion