【问题标题】:Malformed input-Template format error: Every Default member must be a string (Cloudformation template problems)Malformed input-Template 格式错误:每个默认成员都必须是字符串(Cloudformation 模板问题)
【发布时间】:2021-12-16 18:27:30
【问题描述】:

我正在尝试验证 cloudformation 模板,而 cfn-validate 返回一个无用的错误

“输入模板格式错误:每个默认成员都必须是字符串”。

有人知道如何调试吗?如果cfn- validate 在给出错误时返回错误或至少返回资源名称,那就太棒了。

CloudformationTemplate 调试起来非常痛苦。

【问题讨论】:

  • 错误信息对我来说似乎很有用。遍历每个默认成员并验证它们是否都是字符串?
  • 错误字符串应该在一个单独的行中,并使用 > 作为引号插入使用 `backtick 突出显示句子的内联代码
  • 请记住,Fn::Join 的结果不算作字符串

标签: amazon-web-services


【解决方案1】:

当您指定Parameters 并以某种方式计算其默认值(通常是引用其他参数)时,会出现此问题。

此定义无效 - 参数的默认值必须是命令行工具可以用其他字符串替换的严格字符串。

【讨论】:

  • 是的,即使我遇到了这个错误。只需检查这个值应该是 STRICT STRING““默认”:“aaa-bbb-ccc”。这里不会接受其他值。之前我传递数组的字符串,所以得到了这个错误。
  • 您是否参考了 AWS 文档? @guss
  • @KonstantinA.Magg - 相关文档在这里:docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…。从文档中并不能立即看出这一点,但是当他们说“适当类型的值”时,它们的意思是实际值,而不是计算值的公式或代码。将其设为严格字符串是不正确的 - 尽管所有 JSON 示例都是字符串,即使是数字类型的示例 - 它们也可以是 YAML 数字,但它们必须是文字值。
【解决方案2】:

在我的 cfn 模板中使用 CommaDelimitedList 类型的参数时,我收到了相同的错误消息。

  LoadBalancerSubnets:
    Description: List of subnets for the ApplicationLoadBalancer
    Type: CommaDelimitedList
    Default: [ "subnet-123456", "subnet-012345" ]

这是由于我对 CommaDelimitedList 类型的误解。我认为它实际上是一个列表,但事实证明该值应该是单个字符串值,其中各种元素应该用逗号分隔。 因此,我将模板更改为如下所示:

  LoadBalancerSubnets:
    Description: List of subnets for the ApplicationLoadBalancer
    Type: CommaDelimitedList
    Default: "subnet-123456,subnet-012345"

这行得通。

该错误是一个非常普遍的错误,并且可能还有其他情况会引发相同的错误。

不过,我想分享一下我遇到此错误的经验,以便它可以帮助遇到同样问题的其他人。

【讨论】:

  • “这个错误是一个非常普遍的错误”——确实如此。这解决了我的问题,Type: List<AWS::EC2::Subnet::Id> 和默认需要是 subnet-123,subnet-456
【解决方案3】:

我在Outputs 描述字段中也看到了这个错误(我使用的是!Sub)。必须删除 !Sub 并只使用纯文本。

【讨论】:

    【解决方案4】:

    我认为你有不必要的 !Ref 或 !Sub 这样的

    Parameters:
      RelationTableName: 
        Description: relations table name
        Type: String
        Default: !Ref "relations"
    

    【讨论】:

      【解决方案5】:

      当“Fn::...”的结果是列表而不是字符串时,Cloudformation 输出定义中会发生这种情况。

      要从列表中创建字符串,您可以将列表结果“Fn::Join”转换为逗号分隔的字符串。例如:

       "VpcSubnets": {
            "Export": {
              "Name": "VpcSubnets"
            },
            "Value": {
              "Fn::Join": [
                ",",
                {
                  "Fn::GetAtt": [
                    "MyVpc",
                    "Subnets"
                  ]
                }
              ]
            }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-21
        • 2018-03-31
        • 2017-05-30
        • 1970-01-01
        • 2018-06-21
        • 2017-02-02
        • 2015-07-17
        • 1970-01-01
        相关资源
        最近更新 更多