ようへいの日々精進XP

よかろうもん

AWS WAF を使って ALB に設定されているパス に対して IP 制限を施す Terraform サンプル

tl;dr

ALB に設定されている特定のパスに対して, AWS WAF を使って IP 制限を施す設定を Terraform で作ってみたのでメモっておきます. 尚, 作成にあたり, 以下の各種記事を参考にさせて頂きました.

www.terraform.io

dev.classmethod.jp

有難うございます.

こんなん感じ

検証環境

構成

root
├── index.html     # IP 制限しない
├── path1
│   └── index.html # IP 制限する
└── path2
    └── index.html # IP 制限する
  • path1/index.htmlpath2/index.html については xxx.xxx.xxx.xxxyyy.yyy.yyy.yyy からのみアクセスを許可
  • 上記以外については, IP アドレスの制限を設けない

Terraform など

$ terraform -v
Terraform v0.11.13

サンプル

以下のように作ってみました. workspace を使って環境を切り替えることを前提にしています.

作成した ACL を ALB と関連付ける為に ALB の ARN を指定しますが, 今回は諸般の事情により, variables.tf が取得するような書き方にしています.

また, Rule の定義 (aws_wafregional_rule.allow-rule) を定義する際に, aws_wafregional_byte_match_set.byte_set と aws_wafregional_ipset.ipset を AND 条件で定義する書き方がドキュメントから読み取ることが出来なくて試行錯誤してしまいましたが, 結局, 以下の通りに書くことで定義することが出来ました.

resource "aws_wafregional_rule" "allow-rule" {
  depends_on  = ["aws_wafregional_byte_match_set.byte_set", "aws_wafregional_ipset.ipset"]
  name        = "exampleAllowRule${terraform.workspace}"
  metric_name = "exampleAllowRule${terraform.workspace}"

  predicate {
    data_id = "${aws_wafregional_byte_match_set.byte_set.id}"
    negated = false
    type    = "ByteMatch"
  }

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

以上

メモでした.

Terraform 奥深いですね.