CloudFormation编写条件逻辑时出现'did not find expected node content'报错原因?
错误根因
- 核心是YAML语法缩进错误,导致
!If内置函数的三个参数结构不完整,cfn-lint解析时无法识别到!If对应的第三个参数(条件为假时的返回值),因此抛出did not find expected node content报错。 - 附带两个语法不规范问题:
- 真值分支的
!Join使用冗余:仅单个拼接元素时不需要调用!Join,直接写对应值即可。 - 假值分支的
!Join多行短格式对齐错误,被解析为外层ResourceRecords数组的独立元素,而非!If的参数。
- 真值分支的
修正后的示例代码
myDNSresource: Type: AWS::Route53::RecordSet Condition: devEnv Properties: HostedZoneName: Fn::ImportValue: !Sub "${stackName}-${AWS::Region}-dnsZone" Name: !Join [".", [!Ref hostname, {"Fn::ImportValue": !Sub "${stackname}-${AWS::Region}-dnsZone"}]] Type: CNAME TTL: 130 ResourceRecords: - !If - conditionIsTrue # 条件为真时的返回值,如需拼接可自行补充!Join逻辑 - Fn::ImportValue: !Sub "${accountStackName}-${AWS::Region}-dnsZone" # 条件为假时的返回值,正确对齐的!Join结构 - !Join - "" - - !GetAtt domainName.regionalValue - "."
补充说明
如果你的业务确实需要在条件为真时拼接多个字符串组成域名,可以保留!Join,只需要调整参数结构和缩进即可,示例如下:
!If - conditionIsTrue - !Join [".", [!Ref "prefixStr", {"Fn::ImportValue": !Sub "${accountStackName}-${AWS::Region}-dnsZone"}]] - # 假值分支逻辑同上
内容的提问来源于stack exchange,提问作者i'i'i'i'i'i'i'i'i'i'i'i
相关产品推荐
相关产品推荐

