arm64 アーキテクチャの Lambda 関数で Runtime.InvalidEntrypoint が発生するときの対処方法
困っていた内容
AWS公式ドキュメントを参考にコンテナイメージを作成し、arm64
アーキテクチャの Lambda 関数で実行したところ、Runtime.InvalidEntrypoint
で失敗します。なぜでしょうか?
{ "errorMessage": "RequestId: 123456789-abcd-abcd-abcd-123456789 Error: fork/exec /lambda-entrypoint.sh: exec format error", "errorType": "Runtime.InvalidEntrypoint" }
どう対応すればいいの?
コンテナイメージのアーキテクチャを確認してください。
# イメージのアーキテクチャを表示 $ docker inspect <イメージ名> | grep Architecture "Architecture": "arm64",
arm64
アーキテクチャの Lambda 関数には、Arm アーキテクチャのコンテナイメージを選択する必要があります。
AWS公式ドキュメントを参考にした場合、AWS が提供するx86_64
およびarm64
アーキテクチャに対応したマルチCPUアーキテクチャのベースイメージが使用されます。マルチCPUアーキテクチャのイメージは、ダウンロードする環境のアーキテクチャに応じて、対応する(同じ)アーキテクチャのイメージがダウンロードされます。
そのため、x86_64
アーキテクチャの環境でコンテナイメージを作成した場合、x86_64
アーキテクチャのコンテナイメージが作成され、 Lambda 関数の実行時にエラーとなります。逆に、Arm アーキテクチャの環境でコンテナイメージを作成した場合、全く同じ手順でも、Arm アーキテクチャのコンテナイメージが作成され、 Lambda 関数の実行が成功することが期待されます。
Arm の環境をすぐに用意できません
Arm ベースの EC2 のご利用をご検討ください。
AWS では Arm ベースの EC2 インスタンスを提供しており、汎用インスタンスの場合 T4g インスタンスが選択できます。
新しい EC2 T4g インスタンス – AWS Graviton2 によるバースト可能なパフォーマンス – 無料で利用可能 | Amazon Web Services ブログ
また、マルチステージビルド等を駆使することで、異なるアーキテクチャのコンテナイメージ作成が可能です。
ARMアーキテクチャ向けのDockerコンテナイメージをWindows/Macでビルドする | DevelopersIO
参考資料
- AWS Lambdaがarm64アーキテクチャをサポートしました | DevelopersIO
- Lambda コンテナイメージの作成 - AWS Lambda
- マルチ CPU アーキテクチャのサポートを活用 — Docker-docs-ja 19.03 ドキュメント
- IMAGE Launch error: fork/exec /lambda-entrypoint.sh: exec format error on public.ecr.aws/lambda/python:3.8 · Issue #26 · aws/aws-lambda-base-images
- AWS Graviton2 プロセッサを搭載した AWS Lambda 関数 – Arm で関数を実行し、最大 34% 優れた料金パフォーマンスを実現 | Amazon Web Services ブログ
コンテナイメージとしてパッケージ化された関数は、使用するアーキテクチャ (x86 または Arm) 用に構築する必要があります。