You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudFormation模板展开变量时如何保留YAML空格缩进

问题根因

你遇到的问题由两个误操作导致:

  1. gopkg.in/yaml.v2默认序列化配置未正确适配你的嵌套结构,导致子节点被拉平、缩进丢失
  2. >块标量语法会将内部内容标记为纯字符串,CloudFormation不会解析字符串内部的!Join等内置函数,因此变量无法展开

方案1:调整Golang侧序列化逻辑(推荐,无需修改CloudFormation模板)

  1. 首先确认你从CloudFormation API拉取的Employees数据结构是正确的嵌套形态,未被错误解析为平级结构:
    Employees => []map[string]any
      └─ 第0个元素 => map{"hr": []map[string]any}
          └─ hr的第0个元素 => map{"office": "region_xxx"}
    
  2. 序列化时手动设置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)
        }
    }
    
    运行后输出的YAML会正确保留嵌套缩进,不会将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:45:02