如何将Terraform数据源输出作为输入动态生成CloudWatch指标过滤规则字符串
解决方案
Terraform 会自动加载同一工作目录下所有 .tf 后缀的文件,你不需要做额外的导出/导入操作,直接在任意文件里引用其他文件定义的数据源、资源属性即可。
首先修正你现有代码的小错误:data "aws_instances.mytag 的私有IP列表属性是 private_ips,你之前的引用路径少了一个点,正确写法为 data.aws_instances.mytag.private_ips。
动态生成 pattern 的核心逻辑是用 Terraform 内置的 formatlist 和 join 函数拼接IP过滤片段,直接嵌入 metric filter 的 pattern 字段即可,完整代码示例如下:
数据源定义代码(和之前逻辑一致,仅修正属性引用)
data "aws_instances" "mytag" { filter { name = "tag:Application" values = ["jenkins"] } } # 该output为可选配置,仅跨模块调用时需要导出,同目录下使用可直接省略 output "jenkins_instance_private_ips" { value = data.aws_instances.mytag.private_ips }
Metric Filter 代码(动态拼接pattern)
resource "aws_cloudwatch_log_metric_filter" "test" { name = "test-metric-filter" # 动态生成IP过滤规则 pattern = "[w1,w2,w3,${join("&&", formatlist("w4!=\"*%s*\"", data.aws_instances.mytag.private_ips))},w5=\"*admin*\"]" log_group_name = var.test_log_group_name metric_transformation { name ="test-metric-filter" namespace = "General" } }
每次执行terraform apply时,Terraform会先拉取最新的符合标签的实例IP列表,自动生成对应的pattern字段,同步更新到AWS的CloudWatch metric filter配置,新增/减少实例都不需要手动修改代码。
如果你是跨不同Terraform模块(非同一目录下的文件)的场景,只需要把IP列表作为数据源所在模块的output,然后在metric filter所在的模块声明对应的输入变量,引用模块输出的值即可,字符串拼接逻辑和上面一致。
内容的提问来源于stack exchange,提问作者Kavitha
相关产品推荐
相关产品推荐

