CloudFormation模板展开变量时如何保留YAML空格缩进
问题根因
你遇到的问题由两个误操作导致:
gopkg.in/yaml.v2默认序列化配置未正确适配你的嵌套结构,导致子节点被拉平、缩进丢失>块标量语法会将内部内容标记为纯字符串,CloudFormation不会解析字符串内部的!Join等内置函数,因此变量无法展开
方案1:调整Golang侧序列化逻辑(推荐,无需修改CloudFormation模板)
- 首先确认你从CloudFormation API拉取的
Employees数据结构是正确的嵌套形态,未被错误解析为平级结构:Employees => []map[string]any └─ 第0个元素 => map{"hr": []map[string]any} └─ hr的第0个元素 => map{"office": "region_xxx"} - 序列化时手动设置YAML缩进,匹配你期望的格式,示例代码:
运行后输出的YAML会正确保留嵌套缩进,不会将package main import ( "os" "gopkg.in/yaml.v2" ) func main() { // 此处替换为你从CloudFormation获取到的实际Employees数据 employees := []map[string]any{ { "hr": []map[string]any{ {"office": "region_us-east-1"}, }, }, } encoder := yaml.NewEncoder(os.Stdout) encoder.SetIndent(2) // 手动设置缩进为2,和CloudFormation模板格式对齐 err := encoder.Encode(map[string]any{ "Employees": employees, }) if err != nil { panic(err) } }office拉到和hr同级。
方案2:CloudFormation模板侧预生成格式化字符串(无需修改Golang代码)
不用>块标量,改用|保留换行缩进的字面量块配合!Sub实现变量替换,模板写法如下:
Employees: !Sub - | - hr: - office: ${regionOffice} - regionOffice: !Join [ '_', [ 'region', !Ref 'AWS::Region' ] ]
这种写法下CloudFormation会先解析!Join生成对应区域的字符串,再通过!Sub替换到预设好缩进的块内容中,最终输出的Employees本身就是已经格式化完成的YAML字符串,Golang侧直接输出该字符串即可,不需要再做YAML序列化,避免结构被拉平。
内容的提问来源于stack exchange,提问作者Ken - Enough about Monica
相关产品推荐
相关产品推荐

