CloudFormation YAML格式不正确问题的解决方案

49次阅读
没有评论

问题描述

在使用CloudFormation模板时遇到了问题。他想从另一个模板中导入一些值。目前,另一个模板通过连接数组来导出一个字符串(有更好的方法吗?)。在他想导入的模板中,当尝试在AWS控制台中更新堆栈时,出现了以下错误:

Template format error: YAML not well-formed. (line 71, column 28)

他的YAML文件中的第70和71行如下:

SubnetId: Fn::Select [ "0", [ Fn::Split: [ ",", Fn::ImportValue [ !Sub "${ExportPrefix}-SubNets"] ] ] ]

他还尝试了以下方式:

Fn::Select [ "0", [ {Fn::Split: [ ",", Fn::ImportValue [ {Fn::Sub "${ExportPrefix}-SubNets"}] ]} ] ]

他已经检查过所有的空格和制表符。

解决方案

请注意以下操作可能存在版本差异,请根据您使用的AWS CloudFormation版本进行调整。

最佳解决方案

首先,让我们看一下问题可能出现的原因。您的错误是“YAML格式不正确”,可能是由于您的YAML语法中存在问题。

在您的CloudFormation模板中,您正在使用嵌套的内联函数,而这可能导致YAML解析错误。正确的做法是将这些嵌套的函数调用分开,使代码更清晰易读。在这种情况下,您可以使用长格式的Fn::函数。

以下是您的代码的更正版本:

SubnetId:
  Fn::Select:
    - "0"
    - Fn::Split:
        - ","
        - Fn::ImportValue:
            !Sub "${ExportPrefix}-SubNets"

这将会解决YAML格式不正确的问题,并使模板更易于阅读和维护。在这个修正版本中,我们使用了嵌套的Fn::函数来正确地表示CloudFormation函数调用。

备选方案

您提到尝试了另一种方式,并且遇到了Template error: the attribute in Fn::ImportValue must be a string or a function that returns a string错误。这个错误是由于Fn::ImportValue函数的参数不正确造成的。

如果您决定继续使用短格式的函数调用,您可以尝试以下方式:

!Select:
  - "0"
  - !Split
    - ","
    - !ImportValue
      !Sub "${ExportPrefix}-SubNets"

请注意,这种方式在某些情况下可能会导致问题,因为短格式可能不支持特定的语法结构。建议使用长格式以确保函数调用的正确性。

总结

在CloudFormation模板中,正确的YAML格式和函数调用语法至关重要。通过使用长格式的Fn::函数,您可以避免嵌套函数调用造成的错误,并且使模板更易于阅读和维护。如果您遇到问题,请根据您使用的AWS CloudFormation版本,适当地调整代码。

正文完