TerraformでALBにAWS WAFv2を適用する。

ALB

適用対象のALB。
詳細は省略。 aws_lbリソースについては公式ドキュメント を参照。

resource "aws_lb" "example" {
  name                       = "example-alb"
  load_balancer_type         = "application"
  internal                   = false
  idle_timeout               = 3600
  enable_deletion_protection = true

  (省略)
}

WAF

WAFを作成する。

resource "aws_wafv2_web_acl" "example" {
  name        = "example-waf"
  description = "Example WAF"
  scope       = "REGIONAL"

  default_action {
    allow {}
  }

  rule {
    name     = "core-rule-set"
    priority = 101

    override_action {
      count {}
    }

    statement {
      managed_rule_group_statement {
        name        = "AWSManagedRulesCommonRuleSet"
        vendor_name = "AWS"
      }
    }

    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "core-rule-set-rule-metric"
      sampled_requests_enabled   = true
    }
  }

  rule {
    ...
  }

  rule {
    ...
  }

  visibility_config {
    cloudwatch_metrics_enabled = false
    metric_name                = "waf-web-acl-metric"
    sampled_requests_enabled   = false
  }
}

default_actionブロック

allowblockを指定する。 どのルールにも一致しない場合に実行するデフォルトアクションを設定し、 allowの場合はリクエストを通し、blockの場合はリクエストを止めるする。

ruleブロック

WAFのルールを設定する。

複数のルールを記述する場合はruleブロックを並べる。

resource "aws_wafv2_web_acl" "example" {
  ...

  rule {
    ...
  }

  rule {
    ...
  }

  rule {
    ...
  }

  ...
}

priorityはルールの優先度を指定する。
複数のルールを設定している場合にpriorityが小さいほど優先される。

statementブロックにはリクエストを処理するための条件を指定する。
managed_rule_group_statementはAWSが提供するルールセットを指定する。
その他、カスタムルールを指定できるrule_group_reference_statement、複数条件を指定できるand_statementor_statementなどがある。
詳細はドキュメントを参照

visibility_configブロック

CloudWatchメトリクスの有効化設定とWebリクエストのサンプル収集の有効化設定。

ALBにAWS WAFを適用する

上記で作成したWAFをALBに適用するにはaws_wafv2_web_acl_associationリソースを使用する。

resource "aws_wafv2_web_acl_association" "example" {
  resource_arn = aws_lb.example.arn            # 適用対象のALB
  web_acl_arn  = aws_wafv2_web_acl.example.arn # 上記で作成したWAF
}