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

如何用Terraform处理不规则YAML生成AWS Cost Category规则集

解决Terraform处理不规则YAML生成AWS Cost Category规则的问题

针对你遇到的不规则YAML结构转换、规则生成问题,以下是可落地的Terraform实现方案,兼顾原始顺序保留与规则要求:

1. 先明确输入YAML示例

假设你的不规则YAML结构如下(覆盖你提到的所有场景):

service_groups:
  - service_names: ["EC2", "EBS"]
    label: "Compute"
    tags:
      - tag_names: ["Environment:Production"]
        label: "Prod Compute"
      - tag_names: ["Environment:Staging"]
  - service_names: ["S3"]
    tags:
      - tag_names: ["Project:DataLake"]
        label: "Data Lake Storage"
  - service_names: ["Lambda"]
    label: "Serverless"

2. Terraform处理逻辑实现

2.1 读取YAML文件

先加载原始YAML数据:

locals {
  raw_service_data = yamldecode(file("${path.module}/services.yaml"))
}

2.2 生成基础规则与额外规则

通过嵌套for循环+flatten处理所有场景,同时过滤无效值:

locals {
  # 生成标签组规则+服务级Other规则
  base_rules = flatten([
    for sg in local.raw_service_data.service_groups : [
      # 处理每个标签组,无label则用服务名拼接
      for tag_group in lookup(sg, "tags", []) : {
        label = lookup(tag_group, "label", join(", ", sg.service_names))
        services = sg.service_names
        tags = tag_group.tag_names
      },
      # 有标签的服务组,生成「服务名+Other」规则
      (length(lookup(sg, "tags", [])) > 0 ? {
        label = "${join(", ", sg.service_names)} Other"
        services = sg.service_names
        tags = []
      } : null)
    ]
  ])
  # 过滤掉无标签服务组产生的null值
  filtered_base_rules = [for r in local.base_rules : r if r != null]
}

2.3 添加全局Other规则

拼接全局规则到最终规则集:

locals {
  final_rule_sets = concat(
    local.filtered_base_rules,
    [{
      label = "Other"
      services = []
      tags = []
    }]
  )
}

2.4 生成AWS Cost Category资源

将规则集转换为AWS要求的格式,用dynamic块批量生成规则:

resource "aws_cost_category" "cost_grouping" {
  name = "Service_Tag_Cost_Category"
  default_value = "Other"

  # 遍历所有规则生成Cost Category规则
  dynamic "rule" {
    for_each = local.final_rule_sets
    content {
      type  = "REGULAR"
      value = rule.value.label

      # 服务匹配规则
      rule_category {
        key           = "Service"
        values        = rule.value.services
        match_options = ["EQUALS"]
      }

      # 标签匹配规则(动态生成)
      dynamic "rule_tag" {
        for_each = rule.value.tags
        content {
          key           = split(":", rule_tag.value)[0]
          values        = [split(":", rule_tag.value)[1]]
          match_options = ["EQUALS"]
        }
      }
    }
  }
}

3. 核心要点说明

  • 保留原始顺序:Terraform的yamldecode会严格保留YAML中service_groups的定义顺序,遍历生成规则时不会打乱顺序。
  • 兼容不规则结构:用lookup函数安全访问可选字段(如tags、label),避免因字段缺失抛出错误。
  • 规则全覆盖:自动处理无label标签组、带标签服务的Other规则、全局Other规则三种场景,无需手动修改YAML。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:05:04