0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでAWS VPCのサブネットをcidrsubnet関数を利用して作る

Posted at

はじめに

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?