2020/06/27

TerraformでAWSのセキュリティグループをListで定義してみた

terraformaws

概要

terraformで環境構築を行っていますが、eksのserviceで自動作成されるsecurity groupの定義を後付けて設定しています。
ただ、これは環境毎(開発/ステージング/本番)に異なるので、変数で定義して反映するようにしました。

terraformの for_eachdynamic を組み合わせて、複数の定義を一括で登録できるようにしています。

実装内容

変数の定義

以下のような感じで、 variable.tf に定義します。

variable "ingress-list" {
  default = [
    {
      description = "Allow nlb to access cluster node",
      from_port = 31579
      to_port = 31579
      protocol = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
      self = false
    },
    {
      description = "Allow nlb to access cluster node",
      from_port = 31579
      to_port = 31579
      protocol = "udp"
      cidr_blocks = ["0.0.0.0/0"]
      self = false
    }
  ]
}

変数の活用

resource "aws_security_group" "my-security-group" {
  name              = "my-security-group-${terraform.workspace}"
  description       = "My Security group."
  vpc_id            = aws_vpc.my-vpc.id
  tags              = merge(map("Name", "my-security-group"))
  dynamic "ingress" {
    for_each = var.ingress-list
    content {
      description   = ingress.value["description"]
      from_port   = ingress.value["from_port"]
      to_port     = ingress.value["to_port"]
      protocol    = ingress.value["protocol"]
      cidr_blocks = ingress.value["cidr_blocks"]
      self = ingress.value["self"]
    }
  }
}

for_each を使って、変数に定義されているものを一括で登録することができます。

以上です。