我的 CloudFormation 脚本中有以下参数:
CloudFormationURL:
Type: String
Description: S3 URL for nested CloudFormation templates
Default: ""
此参数涵盖我的部署配置的嵌套文件夹中的 CloudFormation 脚本。
我将它与这样的资源一起使用:
CloudWatchDashboardStack:
Type: "AWS::CloudFormation::Stack"
Properties:
TemplateURL: !Sub "${CloudFormationURL}/cloudwatch-dashboard.cfn.yaml"
Parameters:
AppName: !Ref AppName
DeployPhase: !Ref DeployPhase
DeveloperPrefix: !Ref DeveloperPrefix
Environment: !Ref Environment
效果很好,并且已经工作了几个月。
我需要添加另一个资源,所以我添加了这个:
BatchDNSResources:
Type: "AWS::CloudFormation::Stack"
Properties:
Parameters:
AppName: !Ref AppName
Environment: !Ref Environment
DeveloperPrefix: !Ref DeveloperPrefix
DeployPhase: !Ref DeployPhase
AppVersion: !Ref AppVersion
SharedBucketName: !Ref SharedBucketName
S3Version: !Ref S3Version
HostedZone: !Ref HostedZone
VPCStackName: !FindInMap
- EnvironmentMap
- !Ref Environment
- VpcStackName
Company: !Ref Company
CostCenter: !Ref CostCenter
Team: !Ref Team
TemplateURL: !Sub "${CloudFormationURL}/batch-dns.cfn.yaml"
CloudFormation 抛出此错误然后失败:
Parameters: [CloudFormationURL] must have values
检查堆栈的变更集,我可以看到 CloudFormationURL 的以下值:
s3://application-shared-dev/application-name/qa/cf/nested/KShyDj205UK8mz6W_XUA5TnEF8nqPWHS
检查应用程序预部署日志,我可以看到:
upload: deploy/cloudformation/templates/nested/batch-dns.cfn.yaml to s3://application-shared-dev/application-name/qa/cf/nested/KShyDj205UK8mz6W_XUA5TnEF8nqPWHS/batch-dns.cfn.yaml
我可以在 S3 存储桶中看到该文件。
如果我删除 BatchDNSResource
,堆栈就会成功完成。
我到底错过了什么?
最佳答案
有时,最小的事情也会让你受益匪浅。
我已将主 CloudFormation 脚本(包括此脚本)中的参数复制到嵌套脚本中:
CloudFormationURL:
Type: String
Description: S3 URL for nested CloudFormation templates
Default: ""
如果你仔细观察,你会发现我在调用资源时没有将参数传递到嵌套脚本中:
BatchDNSResources:
Type: "AWS::CloudFormation::Stack"
Properties:
Parameters:
AppName: !Ref AppName
Environment: !Ref Environment
DeveloperPrefix: !Ref DeveloperPrefix
DeployPhase: !Ref DeployPhase
AppVersion: !Ref AppVersion
SharedBucketName: !Ref SharedBucketName
S3Version: !Ref S3Version
HostedZone: !Ref HostedZone
VPCStackName: !FindInMap
- EnvironmentMap
- !Ref Environment
- VpcStackName
Company: !Ref Company
CostCenter: !Ref CostCenter
Team: !Ref Team
TemplateURL: !Sub "${CloudFormationURL}/batch-dns.cfn.yaml"
因为 CloudFormation 控制台说问题出在 BatchDNSResources
上,所以我一直在查看主脚本以查找问题,但缺少其他脚本中的引用。有两种方法可以解决这个问题:
- 将
CloudFormationURL
保留为嵌套脚本中的参数(如果您出于某种原因需要它)并传递主脚本中的值。 - 从嵌套脚本中删除参数(如果不需要)
有时,只需多加观察一下并休息一下就能帮助您发现问题。我想把这个问题/答案留在这里,因为当我在这里和其他地方搜索错误时,没有人提到(可能是出于尴尬)这个错误只是忽略了这样的事情。我希望这个答案能够提示其他人在遇到此类错误时检查所有内容。
关于amazon-web-services - AWS 参数必须具有值错误(值存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73991022/