概要
やりたいこと
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 コマンドで登録する。
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 から確認。
コメント