AWS CloudFormation:Fn::Join JSON转YAML报错及NAT实例模板集成求助
CloudFormation NAT实例模板转码报错与资源集成实操
「Unexpected Token : In JSON At Position 10」报错根因
- 通用在线JSON转YAML工具仅支持解析标准纯JSON语法,对CloudFormation模板专属的内置函数、非JSON格式片段无兼容能力,位置10的报错基本来自三类常见问题:
- 待转换片段直接使用了CloudFormation短形式语法(如
!Join、!Ref),这类语法不属于标准JSON规范,解析器遇到感叹号这类非JSON允许字符时直接触发报错 - 待转换JSON的属性名遗漏双引号包裹,如未给
Fn::Join加双引号,解析器识别到属性名后的冒号时,因前面的内容不是合法JSON字符串,触发token识别错误 - 拼接bash初始化脚本时,字符串边界提前闭合,导致后续脚本内容被解析器当成JSON语法块,在遇到脚本里的冒号时触发报错
- 待转换片段直接使用了CloudFormation短形式语法(如
正确转换与集成方法
- 无需依赖通用在线转码工具处理带CloudFormation逻辑的片段,直接使用CloudFormation YAML原生支持的内置函数语法编写即可,避免不必要的转码报错
- 结合已定义的NatInstance基础配置(t2.micro规格、关联AmazonLinuxAMIID镜像、绑定PublicSubnet1公网子网、关联AppSecurityGroup安全组、绑定InstanceProfile IAM角色、设置「NAT Instance」名称标签),集成
Fn::Join组装初始化脚本的完整资源片段参考如下:
NatInstance: Type: AWS::EC2::Instance Properties: ImageId: !Ref AmazonLinuxAMIID InstanceType: t2.micro SubnetId: !Ref PublicSubnet1 SecurityGroupIds: - !Ref AppSecurityGroup IamInstanceProfile: !Ref InstanceProfile Tags: - Key: Name Value: NAT Instance # 原JSON中用Fn::Join组装bash初始化脚本的逻辑,直接用YAML短形式实现即可 UserData: Fn::Base64: !Join - "" - |- #!/bin/bash -xe yum update -y # 开启NAT转发核心配置 sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf # 配置NAT源地址伪装规则 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE service iptables save
- 如果一定要使用在线工具完成转换,需先把待转换片段调整为100%符合JSON语法的结构再操作:
- 把所有CloudFormation短形式函数替换为对应的长形式JSON写法(如把
!Join替换为"Fn::Join") - 给所有对象键、字符串值补上双引号包裹,移除所有非JSON语法的注释、感叹号标记
- 检查所有字符串的边界闭合情况,确保bash脚本内容全部被双引号包裹、用转义字符
\n表示换行
修正后的可直接转码的纯JSON片段示例:
- 把所有CloudFormation短形式函数替换为对应的长形式JSON写法(如把
{ "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum update -y\n", "sysctl -w net.ipv4.ip_forward=1\n" ] ] } } }
快速排查技巧
- 定位报错时直接数待转换JSON的第10个字符位置:如果该位置是感叹号、全角冒号、未加引号的标识符,就是不符合JSON规范的语法点
- 不要把现有YAML模板的片段直接粘贴到JSON转码工具中,YAML对语法的宽松度远高于JSON,大量YAML专属语法本身就无法通过JSON校验
内容的提问来源于stack exchange,提问作者조효빈
相关产品推荐
相关产品推荐

