LoginSignup
5
3

More than 3 years have passed since last update.

for_eachを使用したAWS WAFの設定

Last updated at Posted at 2019-11-17

動的なブロックの作成

  • Terraform 0.12からfor_eachを使用して動的にブロックを定義できるようになり、ブロックの数を変更する場合の修正が容易になった
  • ここではAWSのWAFに設定するIPアドレスを例に紹介する

バージョン

  • Terraform 0.12.12
  • AWSプロバイダ 2.35.0

AWSのWAF

  • WAFを作成するには以下3つのリソースが必要になる
    • IP addresses
      • IPアドレスの集合
    • Rules
      • 上記のIP addressesと組み合わせ、「そのIPアドレスにマッチした場合」、「マッチしない場合」などのルールを決める
    • Web ACLs
      • 上記のRulesと組み合わせ、そのルールに合致した場合の許可・拒否の設定、また合致しない場合の許可・拒否の設定ができる

IP addressesの記載(for_eachを使用しない場合)

  • IPアドレスの設定方法は下記の通り
resource "aws_waf_ipset" "ipset" {
  name = "tfIPSet"

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

  ip_set_descriptor {
    type  = "IPV4"
    value = "10.16.16.0/16"
  }
}
  • このように、IPアドレスの数だけip_set_descriptorのブロックを記載する必要があり、IPアドレスの数が変わったときにこの部分も修正する必要がある

IP addressesの記載(for_eachを使用した場合)

  • IPアドレスの設定方法は下記の通り
variable "ipset" {
  type = list(string)
  default = ["192.0.7.0/24", "10.16.16.0/16"]
}

resource "aws_waf_ipset" "ipset" {
  name = "tfIPSet"

  dynamic "ip_set_descriptors" {
    for_each = var.ipset

    content {
      type  = "IPV4"
      value = ip_set_descriptors.value
    }
  }
}
  • このように、複数のIPアドレスを変数にリストとして定義し、動的なブロックとして定義した"ip_set_descriptors"の中でfor_eachにその変数を記載する。
  • ループの中で繰り返し設定する値は、contentブロックの中で指定する。ここでip_set_descriptorsに設定する必要があるtypeとvalueの記載をしている。リストの要素の受け取りにはDynamicブロック名.valueを記載する。type="IPV4"は各IPアドレスで共通なので変数化していない。
  • Dynamicブロック名.keyでリストの要素番号(0スタート)を取得できる。
  • 変数にはリストではなくマップを指定することも可能。
  • 変数の記載をvariables.tfにまとめておけば、登録するIPアドレスの数が変わった場合でもそのファイルだけを更新すればよい。

参考

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3