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

使用Python修复YAML缩进问题(CloudFormation场景)

解决CloudFormation YAML资源复制时的缩进层级问题

问题根源

你原代码的问题出在手动拼接资源名称行,然后直接dump单个资源对象。PyYAML处理单个资源的键(比如DeletionPolicy、Properties)时,会默认把它们作为顶级键输出,你手动加的4个空格根本没法让这些键嵌套到资源名称的层级下,最终导致格式混乱。

正确实现方式

要让PyYAML帮你处理好所有缩进层级,得把单个资源包装成字典再dump,再调整外层缩进适配Resources:的层级。结合@Michael的思路,优化后的代码如下:

import yaml
import textwrap

# 假设rscItem是当前处理的资源名,entrypath是原模板路径,resourcename是输出文件名
with open(entrypath, 'r') as magic:
    yaml_object = yaml.load(magic, Loader=yaml.SafeLoader)

with open(f'{resourcename}_Restore.yaml', 'a+') as s:
    # 把单个资源包装成{资源名: 资源内容}的字典,让PyYAML自动处理内部嵌套
    resource_block = {rscItem: yaml_object['Resources'][rscItem]}
    # dump时指定indent=2,保证资源内部字段的缩进正确
    raw_yaml = yaml.safe_dump(resource_block, default_flow_style=False, indent=2)
    # 给整个资源块加2个空格缩进,让它归属于Resources节点
    indented_yaml = textwrap.indent(raw_yaml, '  ')
    s.write(indented_yaml)
    # 加空行分隔不同资源,可读性更好
    s.write('\n')

为什么这能解决问题

  1. 包装资源字典:把单个资源放到以资源名为键的字典里,PyYAML dump时会自动把DeletionPolicy、Properties等字段嵌套在资源名称下方,确保内部层级正确。
  2. 统一缩进配置:indent=2让资源内部的每个子字段相对于资源名称缩进2个空格,符合YAML的标准缩进规范。
  3. 外层缩进适配:textwrap.indent给整个资源块再加2个空格,让它正好嵌套在Resources:下面,和你期望的格式完全匹配。

最终效果

运行这段代码后,生成的YAML格式会和你想要的一致:

Resources:
  defaulteventbus:
    DeletionPolicy: Retain
    Properties:
      Name: default
      Tags: []
    Type: AWS::Events::EventBus
    UpdateReplacePolicy: Retain

  LambdaEventSourceMapping:
    DeletionPolicy: Retain
    Properties:
      BatchSize: 1
      BisectBatchOnFunctionError: true
      DestinationConfig:
        OnFailure:
          Destination:
            Ref: SNSTopicName
      Enabled: true

内容的提问来源于stack exchange,提问作者soBusted

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:33:24