概要
やりたいこと
AWS WAF を Terraform で管理したい。
以前、 CloudFormation で AWS WAF による IP 制限を行ったので、同様のことを Terraform で行う。
Terraform
Terraform は EC2 と VPC をたてた時に利用した。
流れは
- terraform init
- Terraform template 作成
- terraform plan
- terraform apply
- terraform show
Terraform の AWS WAF
Terraform では以下2つの WAF 用のリソースが提供されている(v2はまだ)。今回は ALB 用の AWS WAF を作成するため WAF Regional を使う。
- aws_wafregional_web_acl : ALB, API Gateway 用
- aws_waf_web_acl : CloudFront 用
利用する Resources は 4 つ。
- aws_wafregional_web_acl
- aws_wafregional_rule
- aws_wafregional_ipset
- aws_wafregional_web_acl_association
デプロイ
準備、プロバイダー作成
クレデンシャル情報をコードには書かないため、aws コマンドで登録する。
aws configure –profile runble1
適当なディレクトリを作成し、作業ディレクトリを初期化する。
mkdir sample_waf cd sample_waf terraform init
プロバイダーを作成する。
vi main.tf
provider "aws" { profile = "runble1" region = "us-east-1" }
空の 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 から確認。