AWS Lambda稳定别名调用报错CodeArtifactUserFailedException求助
问题分析与解决方法
核心原因
你遇到的问题本质是Lambda发布版本与$LATEST在镜像引用逻辑上的本质差异:
- 已发布的Lambda版本(即被
stable别名指向的版本)会静态绑定ECR镜像的唯一摘要(digest),而非你设置的镜像标签(比如stable)。 - 你的ECR仓库启用了保留最后5个镜像的生命周期策略,当旧的镜像摘要被策略自动清理后,Lambda的发布版本找不到对应的镜像文件,就会触发
ImageAccessDenied错误,导致函数状态变为Inactive。 - 而
$LATEST版本是动态解析镜像标签,每次调用时都会去ECR拉取该标签当前指向的最新镜像摘要。只要你的stable标签仍指向一个未被清理的镜像,$LATEST就能正常工作。
对你假设的验证
- 假设1成立:确实是Lambda发布版本绑定的镜像摘要被ECR生命周期策略删除,导致无法访问。
- 疑问2的答案:
$LATEST不绑定固定镜像摘要,而是每次解析标签对应的最新存在镜像,因此不受旧摘要被删除的影响。 - 假设3不成立:禁用warmer后问题依旧,说明和镜像损坏、warmer清理逻辑无关。
解决方法
1. 调整ECR生命周期策略,保护Lambda依赖的镜像
- 给Lambda发布版本对应的ECR镜像添加专属保护标签,比如
lambda-version-<你的Lambda版本号>(示例:lambda-version-3)。 - 修改ECR生命周期策略,新增规则:跳过带有
lambda-version-*标签的镜像,仅清理无此类标签的镜像。以此确保Lambda发布版本绑定的镜像不会被自动删除。
2. 优化Lambda发布流程
在部署Lambda版本时,同步给对应的ECR镜像打上保护标签,避免后续被生命周期策略清理。可通过AWS CLI执行:
aws ecr put-image-tag --repository-name <你的ECR仓库名> --image-digest <Lambda版本绑定的镜像摘要> --image-tag lambda-version-<Lambda版本号>
3. 调整ECR镜像保留规则
如果不需要严格限制仅保留5个镜像,可:
- 增加保留数量(比如改为保留10个),确保旧Lambda版本依赖的镜像不会被快速清理。
- 或者改为按创建时间保留(比如保留30天),给Lambda版本足够的生命周期缓冲。
4. 检查Lambda权限(可选)
虽然你已配置AmazonEC2ContainerRegistryReadOnly权限,但可确认该策略是否包含对目标ECR仓库的具体访问权限,避免出现权限范围不足的情况。
内容的提问来源于stack exchange,提问作者ccardone
相关产品推荐
相关产品推荐

