如何基于多ENI构建单个CloudWatch Metric Filter过滤规则?
解决CloudWatch Metric Filter多ENI单过滤器问题
你需要将所有目标ENI的过滤条件合并为一个OR表达式,而非为每个ENI单独创建过滤器。只需移除for_each,并通过Terraform的字符串拼接功能生成包含所有ENI的过滤规则即可。
修改后的完整代码如下:
data "aws_network_interfaces" "ENI_List" { filter { name = "subnet-id" values = ["subnet-A", "subnet-B", "subnet-C"] } } resource "aws_cloudwatch_log_metric_filter" "EUN_Network_Filter" { name = "EUN_DC_Network_Traffic_Monitoring" # 拼接所有ENI的OR过滤条件 pattern = "[version, accountid, (${join(" || ", [for eni in data.aws_network_interfaces.ENI_List.ids : "interfaceid=${eni}"])}), srcaddr, dstaddr, srcport, dstport, protocol, packets, bytes, start, end, action, logstatus=NODATA]" log_group_name = "VPC_Flow_Log_Group" # "${data.aws_cloudwatch_log_group.vpc_flow_log_group}" metric_transformation { name = "EUN_Network" namespace = "EUN_Network_Traffic" value = "1" } }
关键逻辑说明:
- 移除
for_each:不再为每个ENI单独创建资源,只生成一个指标过滤器 - 生成OR条件列表:通过
for表达式遍历所有ENI ID,生成interfaceid=xxx格式的字符串数组 - 拼接成完整条件:用
join(" || ", ...)将数组元素用||连接,形成interfaceid=eni-xxx || interfaceid=eni-yyy的OR逻辑,嵌入到过滤模式中
这样就能得到一个包含所有目标子网ENI的单指标过滤器,符合你需要的过滤规则。
内容的提问来源于stack exchange,提问作者Malick Sow
相关产品推荐
相关产品推荐

