问题描述
在使用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版本,适当地调整代码。