【问题标题】:Dynamically create multiple WAF rules with Terraform使用 Terraform 动态创建多个 WAF 规则
【发布时间】:2021-06-16 06:55:54
【问题描述】:

我有一段 Terraform 代码,它在 AWS 中创建一个带有一组规则的 Web ACL。

provider "aws" {
  region = "eu-west-2"
}

resource "aws_wafv2_web_acl" "foo" {
    name        = "foo"
    description = "foo"
    scope       = "REGIONAL"
    default_action {
        block {}
    }
    rule {
      name = "AWS-AWSManagedRulesLinuxRuleSet"
      priority = 0
      override_action {
        count {}
      }
      statement {
        managed_rule_group_statement {
          name = "AWS-AWSManagedRulesLinuxRuleSet"
          vendor_name = "AWS"
        }
      }
      visibility_config {
        cloudwatch_metrics_enabled = false 
        metric_name                 = "foo_name"
        sampled_requests_enabled   = false
      }
    }
    rule {
      name = "AWS-AWSManagedRulesSQLiRuleSet"
      priority = 1
      override_action {
        count {}
      }
      statement {
        managed_rule_group_statement {
          name = "AWS-AWSManagedRulesSQLiRuleSet"
          vendor_name = "AWS"
        }
      }
      visibility_config {
        cloudwatch_metrics_enabled = false
        metric_name                = "foo_name"
        sampled_requests_enabled   = false
      }
    }
    tags = {
      Tag1 = "Value1"
    }
    visibility_config {
      metric_name = "foo"
      sampled_requests_enabled = false
      cloudwatch_metrics_enabled = false
    }   
}

这很好用,但是添加更多规则意味着我的代码开始变得有点像单体。

有没有办法在 Terraform 中使用 dynamic_blocksfor_each 或其他东西以看起来更干净、更干燥的方式创建多个规则?

【问题讨论】:

  • 是的,可以使用dynamic 块对规则进行建模。具体如何取决于什么数据,规则的哪一部分,你想要变量
  • 它们都将具有准确的配置并遵循相同的格式。名称、优先级、override_action、语句。等等。它是通过我正在努力解决的 dynamic_blocks 来构建它的。
  • 您没有演示任何动态块或在创建它们时使用的变量。所以不清楚“结构化”是什么意思?任何实际的错误消息或代码示例?

标签: amazon-web-services terraform terraform-provider-aws terraform0.12+ amazon-waf


【解决方案1】:

您可以像这样将dynamicfor_each 结合使用:

定义一个变量:

variable "rules" {
  type    = list
  default = [
    {
      name = "AWS-AWSManagedRulesLinuxRuleSet"
      priority = 0
      managed_rule_group_statement_name = "AWS-AWSManagedRulesLinuxRuleSet"
      managed_rule_group_statement_vendor_name = "AWS"
      metric_name = "foo_name"
    },
    {
      name = "AWS-AWSManagedRulesSQLiRuleSet"
      priority = 1
      managed_rule_group_statement_name = "AWS-AWSManagedRulesSQLiRuleSet"
      managed_rule_group_statement_vendor_name = "AWS"
      metric_name = "foo_name"
    }
  ]
}

然后在资源中使用:

dynamic "rule" {
  for_each = toset(var.rules)

  content {
    name = rule.value.name
    priority = rule.value.priority
    override_action {
      count {}
    }
    statement {
      managed_rule_group_statement {
        name = rule.value.managed_rule_group_statement_name
        vendor_name = rule.value.managed_rule_group_statement_vendor_name
      }
    }
    visibility_config {
      cloudwatch_metrics_enabled = false
      metric_name                = rule.value.metric_name
      sampled_requests_enabled   = false
    }
  }
}

(注意:显然这会替换您之前的 rule 块。有关更多信息,另请参阅有关 Dynamic Blocks 的文档。)

【讨论】:

  • 非常感谢。这是我试图构建的结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2021-05-26
  • 1970-01-01
相关资源
最近更新 更多