現象
M1 MacでAWS LambdaへDockerイメージをcdk deployしたところ、デプロイはうまくいきますが、Lambdaを動かすとexec format error になります。
IMAGE Launch error: fork/exec /lambda-entrypoint.sh: exec format error Entrypoint: [/lambda-entrypoint.sh] Cmd: [app.handler] WorkingDir: [/var/task]
対策
いろいろ調べるとM1 Mac上ではDockerイメージのビルドのデフォルトがArm64になっている(当たり前だが)ためでした。対処法として環境変数を設定してDockerのビルドのデフォルトを変更することもできるらしいですが、それだとコードを他の人に渡したときに同様のエラーを発生させることになるので、Dockerfileに記述するのがいいのではないかと思います。
FROM --platform=linux/amd64 public.ecr.aws/lambda/python:3.8
上記のように「--platform=linux/amd64」をいれてあげるとM1 Mac上でビルドされたDockerイメージがAWS Lambdaで動きます。
ちなみにいろいろ検索してStack Overflowで同様の現象に直面している人がいて、対処法がわかりました。
所感
今回は人から譲り受けた環境で cdk deploy してこのような事象が発生しました。発生したエラーからは対処法に結びつきづらいので、ハマるとなかなかの時間を取られてしまうと思います。AWSは全くの素人なので、対処法にたどり着くまでになかなかの時間を要しました。ちなみにMac上でDockerを立ち上げる前にcdk deployすると別のエラーが発生します。これもなかなか気づきづらい。