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 资源 将您的模板拆分为三个单独的模板,我将它们称为 DAXNoDAXOther: 在支持 DAX 的区域中,使用包含您的集群的 DAX 模板创建堆栈,并将集群的名称导出为 ClusterName 的值。 在不支持 DAX 的区域,使用 NoDAX 模板创建堆栈,并将 none 导出为 ClusterName 的值。由于每个模板都需要一个资源,因此包含一个 AWS::CloudFormation::WaitConditionHandle 作为此模板的唯一资源。 在所有区域中,使用导入 DaxClusterNameOther 模板创建一个堆栈,并基于 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 函数会导致错误

AWS IAM Cloudformation YAML 模板错误:不允许使用“空”值

AWS Cloudformation Fn::If 错误验证错误