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

Terraform中为CloudWatch日志组保留对应前缀的过滤值

问题描述

我有一个名为cloudwatch_log_prefixes的变量,它是一个map,包含多组CloudWatch日志组前缀及其对应的过滤器。通过该变量生成数据源,可以获取所有匹配给定前缀的CloudWatch日志组列表,但目前无法保留前缀map中的过滤器值,希望将这些过滤器值关联到每个对应的CloudWatch日志组上。

当前配置

variable "cloudwatch_log_prefixes" {
  default = {
    "/aws/lambda/type1_" = {"filter"},
    "/aws/lambda/type2_"    = {"*"},
  }
}

data "aws_cloudwatch_log_groups" "cloudwatch_groups" {
  for_each              = var.cloudwatch_log_prefixes
  log_group_name_prefix = each.key
}

locals {
  log_groups = {
    for log_group in flatten([for log_group in data.aws_cloudwatch_log_groups.cloudwatch_groups : log_group.log_group_names]) :
    log_group => {}
  }
}

output "log_groups" {
  value = local.log_groups
}

当前输出

log_groups = {
    "/aws/lambda/type1/func1" = {},
    "/aws/lambda/type1/func2" = {},
    "/aws/lambda/type2/func1" = {},
    "/aws/lambda/type2/func2" = {},
}

期望输出

log_groups = {
    "/aws/lambda/type1/func1" = {"filter"},
    "/aws/lambda/type1/func2" = {"filter"},
    "/aws/lambda/type2/func1" = {"*"},
    "/aws/lambda/type2/func2" = {"*"},
}

附加信息

> tf state show 'data.aws_cloudwatch_log_groups.cloudwatch_groups["/aws/lambda/type1_"]'
# data.aws_cloudwatch_log_groups.cloudwatch_groups["/aws/lambda/type1_"]:
data "aws_cloudwatch_log_groups" "cloudwatch_groups" {
    arns                  = [
        "arn:aws:logs:eu-central-1:111111111:log-group:/aws/lambda/type1_func1",
        "arn:aws:logs:eu-central-1:111111111:log-group:/aws/lambda/type1_func2",
    ]
    id                    = "eu-central-1"
    log_group_name_prefix = "/aws/lambda/type1_"
    log_group_names       = [
        "/aws/lambda/type1_func1",
        "/aws/lambda/type1_func2",
    ]
}

解决方案

修改locals中的log_groups定义,通过嵌套循环同时保留日志组名称和对应的过滤器值:

locals {
  log_groups = merge(
    for prefix, filter in var.cloudwatch_log_prefixes : {
      for log_group_name in data.aws_cloudwatch_log_groups.cloudwatch_groups[prefix].log_group_names :
      log_group_name => filter
    }...
  )
}

说明

  • 外层循环遍历每个前缀及其对应的过滤器,内层循环遍历该前缀匹配到的所有日志组名称。
  • 每个日志组名称作为键,对应的过滤器作为值生成子map,最后通过merge(...)将所有子map合并为一个完整的map。
  • 末尾的...是Terraform的展开操作符,用于将内层循环生成的多个map合并到外层结果中。

修改后,输出会和期望一致,每个日志组都会关联到其匹配前缀对应的过滤器值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:18:09