CloudFormation报GetObject.NoSuchKey错误,需排查S3路径与参数读取问题
解决CloudFormation中S3 NoSuchKey错误及!Join用法问题
1. 修复!Join语法错误
你的!Join写法存在语法问题,正确格式应为!Join [ "<分隔符>", [ <元素1>, <元素2>... ] ],你写的delimiter是无效占位符,需替换为实际分隔符。另外要注意避免拼接出重复斜杠(比如默认值/直接拼接会得到//subscription-health-check.zip,这会导致S3键无效)。
推荐两种修正方式:
- 用
!Join处理:
S3Key: !Join [ "", [ !Ref SubscriptionApiVersonedPath, "subscription-health-check.zip" ] ]
- 用
!Sub更直观处理斜杠问题:
S3Key: !Sub "${SubscriptionApiVersonedPath}${SubscriptionApiVersonedPath:ends_with('/') ? '' : '/'}subscription-health-check.zip"
2. 验证实际生成的S3键值
要确认CloudFormation最终使用的S3 Key,可通过以下方法:
- 添加输出项:在模板末尾新增Outputs部分,直接输出拼接后的结果:
Outputs: HealthCheckLambdaS3Key: Value: !Join [ "", [ !Ref SubscriptionApiVersonedPath, "subscription-health-check.zip" ] ] Description: Actual S3 Key used for Lambda function
部署完成后,在CloudFormation控制台的「输出」标签即可查看最终键值。
- 查看变更集:部署前创建变更集,在预览结果里找到Lambda函数的S3Key属性,就能看到拼接后的具体值。
- 部署后检查Lambda配置:进入Lambda控制台,查看函数的「代码」标签,里面会显示实际使用的S3桶和键。
3. 确认Parameter Store参数是否被正确读取
同样用Outputs验证参数值:
Outputs: SubscriptionApiVersonedPathValue: Value: !Ref SubscriptionApiVersonedPath Description: Value fetched from Parameter Store
部署后查看输出即可确认参数是否被正确加载。
额外排查点
- 确认S3桶
bwotn-deployment-pipeline中存在对应键的对象,注意S3键区分大小写。 - 检查CloudFormation执行角色是否拥有访问该S3桶和SSM参数的权限。
内容的提问来源于stack exchange,提问作者Danny Ellis Jr.
相关产品推荐
相关产品推荐

