はじめに
TerraformでAWS VPC (Virtual Private Cloud)のサブネットを作る例を紹介します。サブネットのCIDRブロックをTerraformのcidrsubnet
関数を使って計算します。
今回の例では、以下の構成でVPCとサブネットを設計します。
項目 | 値 |
---|---|
VPC CIDR | 10.1.0.0/16 |
サブネットタイプ | public, private, protected |
アベイラビリティゾーン (AZ) | a, c, d |
サブネットのネットマスク | /20 |
Terraformコードの解説
VPCリソースの定義
# VPC
resource "aws_vpc" "main" {
cidr_block = "10.1.0.0/16"
enable_dns_hostnames = true
}
このコードブロックでは、aws_vpcリソースを使用してVPCを作成します。cidr_block
パラメータでVPCのIPアドレス範囲を指定します。
サブネットCIDRの計算
data "aws_region" "current" {}
# サブネットのCIDR
locals {
subnet_cidr_blocks = {
public = {
for i, v in ["a", "c", "d"] :
v => {
az = "${data.aws_region.current.name}${v}"
cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i)
}
}
private = {
for i, v in ["a", "c", "d"] :
v => {
az = "${data.aws_region.current.name}${v}"
cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i + 3)
}
}
protected = {
for i, v in ["a", "c", "d"] :
v => {
az = "${data.aws_region.current.name}${v}"
cidr = cidrsubnet(aws_vpc.main.cidr_block, 4, i + 6)
}
}
}
}
このlocalsブロックでは、cidrsubnet
関数を使用してサブネットのCIDRブロックを計算しています。
cidrsubnet(prefix, newbits, netnum)
-
prefix: 計算の元になるCIDR。ここではVPCのCIDR(
aws_vpc.main.cidr_block
)を設定します。 -
newbits: prefixに追加するビット数。この結果がサブネットの長さになります。今回の例ではprefix(
/16
)にnewbits(4
)を足した/20
がサブネットの長さになります。 - netnum: 0から順番に増やしていくことで連続したサブネットを作ることができます。
サブネットリソースの作成
# サブネット
resource "aws_subnet" "public" {
for_each = local.subnet_cidr_blocks.public
vpc_id = aws_vpc.main.id
availability_zone = each.value.az
cidr_block = each.value.cidr
tags = {
Name = "public-${each.key}"
Tier = "public"
}
}
resource "aws_subnet" "private" {
for_each = local.subnet_cidr_blocks.private
vpc_id = aws_vpc.main.id
availability_zone = each.value.az
cidr_block = each.value.cidr
tags = {
Name = "private-${each.key}"
Tier = "private"
}
}
resource "aws_subnet" "protected" {
for_each = local.subnet_cidr_blocks.protected
vpc_id = aws_vpc.main.id
availability_zone = each.value.az
cidr_block = each.value.cidr
tags = {
Name = "protected-${each.key}"
Tier = "protected"
}
}
このaws_subnetリソースブロックでは、for_each
を使用して、複数のサブネットを作成しています。各サブネットは、localsブロックっで計算されたCIDRブロックとアベイラビリティゾーンに関連付けられます。
確認をした環境
- Terraform v1.9.2
- aws provider v5.66.0
参考