ALB 用 AWS WAF v1 (Classic) に Terraform でルール適用する

2020年7月12日

概要

やりたいこと

AWS WAF を Terraform で管理したい。

以前、 CloudFormation で AWS WAF による IP 制限を行ったので、同様のことを Terraform で行う。

Terraform

Terraform は EC2 と VPC をたてた時に利用した。

流れは

  1. terraform init
  2. Terraform template 作成
  3. terraform plan
  4. terraform apply
  5. terraform show

Terraform の AWS WAF

Terraform では以下2つの WAF 用のリソースが提供されている(v2はまだ)。今回は ALB 用の AWS WAF を作成するため WAF Regional を使う。

利用する Resources は 4 つ。

デプロイ

準備、プロバイダー作成

クレデンシャル情報をコードには書かないため、aws コマンドで登録する。

aws configure --profile runble1

作業ディレクトリを作成する。

mkdir sample_waf
cd sample_waf

プロバイダーを作成する。

vi main.tf
provider "aws" {
  profile = "runble1"
  region = "us-east-1"
}

初期化する

terraform init

空の WebACL を作成

最初に、土台となる空の WebACL を作成します。

aws_wafregional_web_acl リソース を利用して tfWebACL という名前の WebACL を作成する。

vi myWAF.tf
resource "aws_wafregional_web_acl" "wafacl" {
  name = "tfWebACL"
  metric_name = "tfWebACL"

  default_action {
    type = "ALLOW"
  }
}

Dry-Run 実行し、テンプレートに誤りが無いかを確認する。

terraform plan

Terraform から AWS 上にリソースを作成。

terraform apply

〜略〜
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

リソースができていることを確認。

terraform show

GUI からも確認できる。

WebACL にルールを追加

WebACL にルールを追加する。

aws_wafregional_web_acl リソース内に rule ディレクティブを追加。
aws_wafregional_rule リソースと aws_wafregional_ipset リソースを追加。

vi myWAF.tf
resource "aws_wafregional_ipset" "ipset" {
  name = "tfIPSet"

  ip_set_descriptor {
    type  = "IPV4"
    value = "192.0.7.0/24"
  }
}

resource "aws_wafregional_rule" "wafrule" {
  name        = "tfWAFRule"
  metric_name = "tfWAFRule"

  predicate {
    data_id = "${aws_wafregional_ipset.ipset.id}"
    negated = false
    type    = "IPMatch"
  }
}

resource "aws_wafregional_web_acl" "wafacl" {
  name        = "tfWebACL"
  metric_name = "tfWebACL"

  default_action {
    type = "ALLOW"
  }

  rule {
    action {
      type = "BLOCK"
    }

    priority = 1
    rule_id  = "${aws_wafregional_rule.wafrule.id}"
    type     = "REGULAR"
  }
}

再度、 terraform plan 後に、 terraform apply を実行した結果、 Rule に tfWAFRule が作成されている。

WebACL に紐付いていることを確認。

WebACL と ALB を紐付け

ALB は下記で作成したものを利用する(本当は ALB も Terraform 管理すべき)。

aws_wafregional_web_acl_association リソースを末尾に追記し、 resource_arn には 紐付けたい ALB の arn を GUI などからコピーしてくる。

vi myWAF.tf
resource "aws_wafregional_web_acl_association" "foo" {
  resource_arn = "ALB の arn"
  web_acl_id = "${aws_wafregional_web_acl.wafacl.id}"
}

terraform plan, terraform apply で反映し、 ALB と WebACL が紐付いていることを GUI から確認。

参考

aws_wafregional_web_acl

aws_wafregional_web_acl_association