👩‍👧‍👧

[Terraform/AWS]forを使ってALBに複数サブネットを割り当てる

2021/01/04に公開

はじめに

ALB(Application Load Balancer)に割り当てるアベイラビリティゾーン(以下、AZ)は複数にすることが多いかと思います。

その場合、各AZごとに作成したサブネットを、1つのALBに割り当てることになりますが、これをTerraformのforを使って記述してみます。

環境

  • Terraform 0.12以降

前提

前提として、サブネットはcount等を使って、複数作成するようにします。

subnet.tf
resource "aws_subnet" "public" {
  count = 3

  availability_zone       = var.availability_zones[count.index]
  cidr_block              = cidrsubnet(aws_vpc.vpc.cidr_block, 4, count.index)
  
  // 略
  }
}
variables.tf
variable "availability_zones" {
  type    = list(string)
  default = ["ap-northeast-1a", "ap-northeast-1c", "ap-northeast-1d"]
}

ここで登場したcount, count.index, cidrsubnet関数については、以下の記事を参照ください。

for

ALB(aws_lb)では、割り当てるサブネットをsubnetsに指定することができますが、ここでforを使います。

alb.tf
resource "aws_lb" "alb" {
  load_balancer_type = "application"

  // 略

  subnets = [
    for s in aws_subnet.public :
    s.id
  ]
  
  // 略
}

aws_subnet.publicには、前提に記載したsubnet.tfの通り、異なるAZである計3個のサブネットが格納されています。

ここで、forinを使うことでaws_subnet.publicから1つのサブネットを取り出し、これがsに格納され、s.idとすることで、そのサブネットのidが参照されます。

これが3回繰り返されることで、aws_subnet.publicの全てのサブネットがALBに割り当てられ、マルチAZ化されます。

終わりに

forin:から成る構文はPythonっぽいですね。

ただし、その次の行は字下げしないのがTerraform的に正しい書き方のようです。

terraform fmtを実行すると、以下のように字下げの無いかたちに修正されます。

alb.tf
    subnets = [
      for s in aws_subnet.public :
-       s.id
+     s.id
    ]

参考

Discussion