Terraform の変数を使ってみた

前回 1 の Security Group の TF ファイルを変数に使用する形に変更してみた。

security_group.tf の修正内容は、変数宣言部分 variable を追加して、 ingress の cidr_blocks を修正する。抜粋箇所は以下に示すとおり。

security_group.tf:

variable "allowed_ip_addresses" {
  type = list(string)
}

resource "aws_security_group" "mydefault" {
  # ...
  ingress {
    description = "SSH from allowed ip address"
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = var.allowed_ip_addresses
  }

  ingress {
    description = "RDP from allowed ip address"
    from_port = 3389
    to_port = 3389
    protocol = "tcp"
    cidr_blocks = var.allowed_ip_addresses
  }

  ingress {
    description = "ping from allowed ip address"
    from_port = 8
    to_port = 8
    protocol = "icmp"
    cidr_blocks = var.allowed_ip_addresses
  }
  # ...
}

そして terraform.tfvars に以下の記述を追記する。ファイルがなければ新規作成する。

terraform.tfvars:

allowed_ip_addresses = [
  "192.0.2.50/32",
  "192.0.2.100/32",
  "192.0.2.200/32",
]

もう少しだけ変数部分を増やしてみる。

さらに以下のような書き方をすれば、3つある ingress を for でひとまとめにできたりする。ただしこれは、上の書き方で省略できた ipv6_cidr_blocks などを明示する必要が出てくるのでどこまで変数にするかは迷うところ。

security_group.tf:

variable "sg_ingresses" {
  type = list(object({
    description = string
    from_port = number
    to_port = number
    protocol = string
  }))
}

resource "aws_security_group" "mydefault" {
  # ...
  ingress = [
    for sg_ingress in var.sg_ingresses: {
      description = sg_ingress.description
      from_port = sg_ingress.from_port
      to_port = sg_ingress.to_port
      protocol = sg_ingress.protocol
      cidr_blocks = var.allowed_ip_addresses
      ipv6_cidr_blocks = []
      prefix_list_ids = []
      security_groups = []
      self = false
    }
  ]
  # ...
}

terraform.tfvars への追記部分は以下のようになる。

terraform.tfvars:

sg_ingresses = [
  {
    description = "SSH from allowed ip address"
    from_port = 22
    to_port = 22
    protocol = "tcp"
  },
  {
    description = "RDP from allowed ip address"
    from_port = 3389
    to_port = 3389
    protocol = "tcp"
  },
  {
    description = "ping from allowed ip address"
    from_port = 8
    to_port = 8
    protocol = "icmp"
  },
]

参考