使用AWS SAM部署Lambda容器时,指定resolve-image-repos后ImageUri该如何设置?
问题:AWS SAM部署Docker镜像到Lambda报错“Unable to upload artifact None referenced by ImageUri parameter”
我尝试通过AWS SAM将Docker镜像部署为Lambda函数,使用的SAM模板如下:
Resources: StrapiFunction: Type: AWS::Serverless::Function Properties: PackageType: Image Events: Strapi: Type: Api Properties: Path: / Method: ANY Metadata: DockerTag: latest DockerContext: ./ Dockerfile: Dockerfile
随后通过CI脚本执行部署命令:
sam deploy \ --resolve-s3 \ --resolve-image-repos \ --region ${AWS_REGION} \ --template-file ${SAM_FILE} \ --stack-name my-cms-${STAGE}-stack \ --capabilities CAPABILITY_NAMED_IAM
根据AWS官方文档,--resolve-image-repos参数会让SAM自动创建Amazon ECR仓库用于打包部署,但部署时出现错误:
Unable to upload artifact None referenced by ImageUri parameter
由于ECR仓库由SAM自动创建,无法提前知晓其URI且每次部署URI似乎都会变化,请问遗漏了什么?
解决方案
- 升级SAM CLI到最新版本
旧版本SAM CLI对--resolve-image-repos的自动处理逻辑存在bug,导致无法正确填充ImageUri。执行以下命令升级:
pip install --upgrade aws-sam-cli
升级后重新执行部署命令,验证是否解决问题。
- 确认Docker服务正常运行
SAM构建镜像依赖Docker,CI环境中需确保Docker daemon已启动且当前用户有权限访问。可以在部署前添加检查命令:
docker ps
如果命令报错,说明Docker未正常运行,需先修复CI环境的Docker配置。
- 在模板中显式添加ImageUri占位符
虽然SAM自动管理ECR仓库,但显式定义ImageUri参数可避免“None”引用问题。修改模板如下:
Parameters: StrapiFunctionECRUri: Type: String Default: "" Resources: StrapiFunction: Type: AWS::Serverless::Function Properties: PackageType: Image ImageUri: !Ref StrapiFunctionECRUri Events: Strapi: Type: Api Properties: Path: / Method: ANY Metadata: DockerTag: latest DockerContext: ./ Dockerfile: Dockerfile
部署时SAM会自动将创建的ECR仓库URI填充到该参数中。
验证Dockerfile和上下文路径
确认DockerContext: ./指向的目录下存在正确的Dockerfile,且Dockerfile能正常构建镜像。本地先执行docker build -t test-strapi .测试构建流程,排除Dockerfile本身的错误。检查CI角色权限
确保执行部署的IAM角色拥有以下权限:ecr:CreateRepositoryecr:GetAuthorizationTokenecr:BatchCheckLayerAvailabilityecr:GetDownloadUrlForLayerecr:BatchGetImageecr:PutImagelambda:CreateFunctionlambda:UpdateFunctionCode
权限不足会导致SAM无法创建ECR仓库或推送镜像,进而引发ImageUri错误。
内容的提问来源于stack exchange,提问作者Wintermute
相关产品推荐
相关产品推荐

