使用CodeBuild构建的Lambda ECR镜像无法正常运行的原因排查
解决Lambda使用ECR镜像时的
exec format error问题 问题背景
通过CodeBuild构建用于Lambda的ECR镜像,构建速度正常,但Lambda运行时抛出以下错误:
RequestId: 614fa6a4-2dad-4c5a-8527-8d060b80f86d Error: fork/exec /lambda-entrypoint.sh: exec format error
Runtime.InvalidEntrypoint
已确认app.py中存在lambda_handler函数。
核心原因及修复方案
1. 架构不匹配(最常见原因)
该错误90%以上是因为CodeBuild构建的镜像架构与Lambda函数的运行架构不兼容:
Lambda支持x86_64和arm64(Graviton2)两种架构,若CodeBuild用x86_64环境构建镜像,但Lambda配置为arm64,反之亦然,就会触发此错误。
修复步骤:
- 确认Lambda函数的架构:进入Lambda控制台,查看函数配置的"架构"选项(x86_64/arm64)。
- 调整CodeBuild项目的环境架构:进入CodeBuild项目设置,修改"环境"中的"镜像"为对应架构的标准镜像:
- 若Lambda用x86_64:选择
aws/codebuild/amazonlinux2-x86_64-standard:3.0或更高版本 - 若Lambda用arm64:选择
aws/codebuild/amazonlinux2-aarch64-standard:3.0或更高版本
- 若Lambda用x86_64:选择
- 重新构建并推送镜像:触发CodeBuild重新构建,确保镜像架构与Lambda一致。
2. 可选:Docker构建时强制指定平台
如果无法修改CodeBuild环境架构,可在buildspec.yml的docker build命令中添加--platform参数,强制匹配Lambda的架构:
# 修改buildspec.yml中的docker build命令 - docker build --platform linux/amd64 -t ${ecr_repo} . --build-arg REGION=${region} # 若Lambda用arm64则改为:--platform linux/arm64
3. 修正buildspec中的账号笔误
你的buildspec.yml中,repo_uri使用的账号是123456789100,但docker login命令中的账号是12345678900,这会导致镜像推送至错误仓库,建议修正为一致的账号ID:
# 修正后的docker login命令 - aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 123456789100.dkr.ecr.ap-northeast-2.amazonaws.com
验证方法
重新构建镜像后,可通过以下命令本地检查镜像架构:
docker inspect ${repo_uri} | grep Architecture
确保输出的架构与Lambda函数的架构一致。
内容的提问来源于stack exchange,提问作者SecY
相关产品推荐
相关产品推荐

