AWS Lambdaがコンテナイメージの実行UIDを独自ユーザーへ置き換えることで、distroless
nonrootから継承したWorkingDir=/home/nonrootへ移動できず、ENTRYPOINT開始前に
EACCESになる問題の最小再現です。
Runtime.InvalidEntrypoint
fork/exec /app/bootstrap: permission denied
エラーメッセージはENTRYPOINTを指しますが、実際に失敗しているのは、その前に行われる
chdir("/home/nonroot")です。詳細な調査結果はREPORT.mdを参照してください。
Dockerfile.fail: distrolessnonrootのWORKDIRを継承する失敗ケースDockerfile.fixed:WORKDIR /appを明示する修正ケースindex.ts: Bunで実装した最小のLambdaカスタムランタイムdeploy.sh: ECR、IAMロール、Lambda関数の作成・更新invoke.sh: Lambdaの同期呼び出しとログ表示cleanup.sh: 作成したAWSリソースの削除lambda-trust-policy.json: Lambda実行ロールの信頼ポリシーREPORT.md: 原因、対照実験、推奨修正
- AWS CLI v2でログイン済みであること
- Dockerが起動していること
- Lambda、ECR、IAMロールを作成・削除できるAWS権限
linux/amd64イメージをビルドできること
既定リージョンはAWS CLIの設定値、設定がなければap-northeast-1です。
必要に応じてAWS_PROFILE、AWS_REGION、RESOURCE_NAMEを指定できます。
失敗ケースをデプロイします。ローカルDockerでは正常起動しますが、Lambdaでは
Runtime.InvalidEntrypointになります。
bash deploy.sh fail
bash invoke.sh続いて、ベースイメージとバイナリを変えず、WORKDIR /appだけ追加した修正ケースへ更新します。
bash deploy.sh fixed
bash invoke.sh成功時の応答例です。
{"ok":true,"runtime":"Bun 1.3.14","event":{"source":"lambda-distroless-workdir-repro"}}検証後は課金を避けるためリソースを削除してください。
bash cleanup.shFROM gcr.io/distroless/base-debian12:nonroot
WORKDIR /app
COPY --from=builder --chmod=0755 /out/bootstrap /app/bootstrap
ENTRYPOINT ["/app/bootstrap"]通常のdistrolessタグへ変更する必要はありません。nonrootを維持したまま、実行ステージ自身で
アクセス可能な絶対パスのWORKDIRを宣言します。