arm64 アーキテクチャの Lambda 関数で Runtime.InvalidEntrypoint が発生するときの対処方法

2021.12.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

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

参考資料

コンテナイメージとしてパッケージ化された関数は、使用するアーキテクチャ (x86 または Arm) 用に構築する必要があります。