🦔

【Terraform】VPCとサブネットの作成

2025/01/11に公開

はじめに

TerraformでVPCとサブネットを作成します。

ファイル構成

.
├── main.tf
├── network.tf
└── terraform.tfvars

main.tfとterraform.tfvars

main.tf
#------------------
# Terraform configuration
#------------------
terraform {
  #0.13以上
  required_version = ">=0.13"
  required_providers {
    aws = {
      source = "hashicorp/aws"
      #おおよそ3.0以上(マイナーは気にしない)
      version = "~> 3.0"
    }
  }
}

#------------------
# Provider
#------------------
provider "aws" {
  profile = "ユーザー名"
  region  = "ap-northeast-1"
}

#------------------
# Variables
#------------------
variable "project" {
  type = string
}
variable "environment" {
  type = string
}
terraform.tfvars
project     = "プロジェクト名"
environment = "dev"

VPC

  1. cidr_block : string : IPv4 CIDRブロック
  2. assign_generated_ipv6_cidr_block : string : IPv6 CIDRブロック
  3. instance_tenancy : enum : テナンシー(default,dedicated)
  4. enable_dns_support : bool : DNS解決
  5. enable_dns_hostnames : bool : DNSホスト名
  6. tags : object : タグ
network.tf
#------------------
#VPC
#------------------
resource "aws_vpc" "vpc" {
  cidr_block = "192.168.0.0/20"
  instance_tenancy  = "default"
  enable_dns_support = true
  enable_dns_hostnames = true
  assign_generated_ipv6_cidr_block = false

  tags = {
    Name    = "${var.project}-${var.environment}-vpc"
    Project = var.project
    Env     = var.environment
  }
}

サブネット

  1. vpc_id : string : VPC ID
  2. availability_zone : string : アベイラビリティゾーン
  3. cidr_block : string : CIDRブロック
  4. map_public_ip_on_launch : bool : 自動割り当てIP設定
  5. tags : object : タグ
network.tf
#------------------
#Subnet
#------------------

#パブリックサブネット
resource "aws_subnet" "public_subnet_1a" {
  vpc_id                  = aws_vpc.vpc.id
  availability_zone       = "ap-northeast-1a"
  cidr_block              = "192.168.1.0/24"
  map_public_ip_on_launch = true
  tags = {
    Name    = "${var.project}-${var.environment}-private-subnet-1a"
    Project = var.project
    Env     = var.environment
    Type    = "public"
  }
}

#プライベートサブネット
resource "aws_subnet" "private_subnet_1a" {
  vpc_id                  = aws_vpc.vpc.id
  availability_zone       = "ap-northeast-1a"
  cidr_block              = "192.168.2.0/24"
  map_public_ip_on_launch = false
  tags = {
    Name    = "${var.project}-${var.environment}-private-subnet-1a"
    Project = var.project
    Env     = var.environment
    Type    = "private"
  }
}

ルートテーブル

下記2つを設定。

aws_route_table

  1. vpc_id : string : VPC ID
  2. tags : object : タグ

aws_route_table_association

  1. route_table_id : string : ルートテーブルID
  2. subnet_id : string : サブネットID
network.tf
#------------------
#Route Table
#------------------

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.vpc.id
  tags = {
    Name    = "${var.project}-${var.environment}-public-rt"
    Project = var.project
    Env     = var.environment
    Type    = "public"
  }
}

resource "aws_route_table_association" "public_rt_1a" {
  route_table_id = aws_route_table.public_rt.id
  subnet_id      = aws_subnet.public_subnet_1a.id
}

resource "aws_route_table" "private_rt" {
  vpc_id = aws_vpc.vpc.id
  tags = {
    Name    = "${var.project}-${var.environment}-private-rt"
    Project = var.project
    Env     = var.environment
    Type    = "private"
  }
}

resource "aws_route_table_association" "private_rt_1a" {
  route_table_id = aws_route_table.private_rt.id
  subnet_id      = aws_subnet.private_subnet_1a.id
}

インターネットゲートウェイ

パブリックサブネットをインターネットに繋げる。
下記2つを設定。

aws_route

  1. route_table_id : string : ルートテーブルID
  2. destination_cidr_block : string : 送信先
  3. gateway_id : string : インターネットゲートウェイID

aws_internet_gateway

  1. vpc_id : string : VPC ID
  2. tags : object : タグ
network.tf
#------------------
#Internet Gateway
#------------------
resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.vpc.id

  tags = {
    Name    = "${var.project}-${var.environment}-igw"
    Project = var.project
    Env     = var.environment
  }
}

resource "aws_route" "public_rt_igw_r" {
  route_table_id         = aws_route_table.public_rt.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.igw.id
}

Discussion