👩👧👧
[Terraform/AWS]forを使ってALBに複数サブネットを割り当てる
はじめに
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個のサブネットが格納されています。
ここで、for
とin
を使うことでaws_subnet.public
から1つのサブネットを取り出し、これがs
に格納され、s.id
とすることで、そのサブネットのid
が参照されます。
これが3回繰り返されることで、aws_subnet.public
の全てのサブネットがALBに割り当てられ、マルチAZ化されます。
終わりに
for
とin
と:
から成る構文はPythonっぽいですね。
ただし、その次の行は字下げしないのがTerraform的に正しい書き方のようです。
terraform fmt
を実行すると、以下のように字下げの無いかたちに修正されます。
alb.tf
subnets = [
for s in aws_subnet.public :
- s.id
+ s.id
]
Discussion