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

for_eachを使用したAWS WAFの設定

動的なブロックの作成

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

参考

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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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