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
相关产品推荐
相关产品推荐

