Help us understand the problem. What is going on with this article?

for_eachを使用したAWS WAFの設定

More than 1 year has passed since last update.

動的なブロックの作成

  • 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アドレスの数が変わった場合でもそのファイルだけを更新すればよい。

参考

str416yb
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away