AWS CloudFormation 条件模板验证
Posted
技术标签:
【中文标题】AWS CloudFormation 条件模板验证【英文标题】:AWS CloudFormation conditional template validation 【发布时间】:2018-06-22 01:30:38 【问题描述】:我有一个模板可以使用 DynamoDB 和 DAX 为多个区域创建 CloudFormation,例如 us-east-1 和 ap-southeast-1。 在为 us-east-1 工作时,此模板不适用于 ap-southeast-1,因为该区域尚不支持 DAX。
我希望这可以使用Conditions
来完成,这样对于一个区域 (us-east-1) 我将同时拥有 DynamoDB 和 DAX,而对于另一个区域 (ap-southeast-1) - 只有 DynamoDB:
Conditions:
isDAXAvailable: !Not [!Equals [ !Ref "AWS::Region", ap-southeast-1 ]]
Resources:
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
.....
DaxCluster:
Type: AWS::DAX::Cluster
Condition: isDAXAvailable
Properties:
.....
但不幸的是我收到一个错误:
调用 ValidateTemplate 时发生错误 (ValidationError) 操作:模板格式错误:无法识别的资源类型: [AWS::DAX::集群]
是否可以配置这样的模板,或者应该创建一个单独的模板?
【问题讨论】:
对于任何有同样问题的人:不幸的是,我找不到任何其他解决方案,只能为其他区域创建单独的模板。 【参考方案1】:模板验证是针对区域中的可用资源进行的。由于 DAX 当前在 ap-southeast-1 中不可用,因此 AWS::DAX::Cluster 资源将无法在此处验证。对于如何完成这项工作,我有一些建议:
预处理您的模板以去除当前不支持的区域中的 DAX 资源 将您的模板拆分为三个单独的模板,我将它们称为 DAX、NoDAX 和 Other: 在支持 DAX 的区域中,使用包含您的集群的 DAX 模板创建堆栈,并将集群的名称导出为 ClusterName 的值。 在不支持 DAX 的区域,使用 NoDAX 模板创建堆栈,并将 none 导出为 ClusterName 的值。由于每个模板都需要一个资源,因此包含一个 AWS::CloudFormation::WaitConditionHandle 作为此模板的唯一资源。 在所有区域中,使用导入 DaxClusterName 的 Other 模板创建一个堆栈,并基于Fn:Equals: [“DaxClusterName”, “none”]
创建一个条件。然后使用条件判断这个模板中的资源是否可以依赖集群。
【讨论】:
DAX 现已在 ap-southeast-1 中可用,因此,如果这是唯一会导致您出现问题的区域,那么它不应该再出现了。【参考方案2】:目前,有一种解决方法可以将 Transform: AWS::Serverless-2016-10-31
之类的转换添加到您的模板中
虽然这可能需要添加CAPABILITY_AUTO_EXPAND
功能,但"there is no charge incurred when using this transform" 如果您没有任何AWS::Serverless
资源,它不应该影响您的模板,如果您有@,您应该已经在使用此转换987654323@
【讨论】:
以上是关于AWS CloudFormation 条件模板验证的主要内容,如果未能解决你的问题,请参考以下文章
使用带反斜杠的sed命令时出现AWS CloudFormation模板验证错误
有没有办法对 AWS Cloudformation 模板进行单元测试
如何在 CloudFormation 模板中描述 AWS Lambda 函数测试事件?
AWS CloudFormation:结合 ImportValue 和 Sub 函数会导致错误