Terraform入門(AWS VPC構築)

はじめに

VPCを作らないことには各種サービスを使うことができなかったりするので、Public/Privateのよく使われるVPCを構築できるようになりましょう。

必要なコンポーネントはこんな感じかな。

  • VPC
  • Subnet(Public*2、Private*2)
  • Route Table(Public、Private)
  • Internet Gateway

設定ファイル

一旦設定ファイルの全体を公開。

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 2.70"
    }
  }
}

provider "aws" {
  profile = "default"
  region  = "ap-northeast-1"
}

# VPC
resource "aws_vpc" "default" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "vpc-NAME"
  }
}

# Subnet
resource "aws_subnet" "pub-1" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.1.0/24"

  tags = {
    Name = "subnet-pub-NAME-1"
  }
}
resource "aws_subnet" "pub-2" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.2.0/24"

  tags = {
    Name = "subnet-pub-NAME-2"
  }
}
resource "aws_subnet" "prv-1" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.11.0/24"

  tags = {
    Name = "subnet-prv-NAME-1"
  }
}
resource "aws_subnet" "prv-2" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.12.0/24"

  tags = {
    Name = "subnet-prv-NAME-2"
  }
}

# Internet GW
resource "aws_internet_gateway" "default" {
  vpc_id = aws_vpc.default.id

  tags = {
    Name = "igw-NAME"
  }
}

# Route Table
resource "aws_route_table" "pub" {
  vpc_id = aws_vpc.default.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.default.id
  }

  tags = {
    Name = "rtb-pub-NAME"
  }
}
resource "aws_route_table" "prv" {
  vpc_id = aws_vpc.default.id

  tags = {
    Name = "rtb-prv-NAME"
  }
}
resource "aws_route_table_association" "pub-1" {
  subnet_id      = aws_subnet.pub-1.id
  route_table_id = aws_route_table.pub.id
}
resource "aws_route_table_association" "pub-2" {
  subnet_id      = aws_subnet.pub-2.id
  route_table_id = aws_route_table.pub.id
}
resource "aws_route_table_association" "prv-1" {
  subnet_id      = aws_subnet.prv-1.id
  route_table_id = aws_route_table.prv.id
}
resource "aws_route_table_association" "prv-2" {
  subnet_id      = aws_subnet.prv-2.id
  route_table_id = aws_route_table.prv.id
}

VPC

TerraformのVPCのドキュメントを見ながら構築しましょう。

resource "aws_vpc" "default" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "vpc-NAME"
  }
}

resource名

aws_vpc

※defaultとしているのは、このVPCのIDなので何でも良いです。複数ある場合はより適切につけた方が良いでしょう。

必須項目

  • cidr_block

※Nameタグはつけておいた方がConsole上見やすかったりするのでつけておこう。

Subnet

TerraformのSubnetドキュメントを見ながら構築しましょう。

resource "aws_subnet" "pub-1" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.1.0/24"

  tags = {
    Name = "subnet-pub-NAME-1"
  }
}
resource "aws_subnet" "pub-2" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.2.0/24"

  tags = {
    Name = "subnet-pub-NAME-2"
  }
}
resource "aws_subnet" "prv-1" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.11.0/24"

  tags = {
    Name = "subnet-prv-NAME-1"
  }
}
resource "aws_subnet" "prv-2" {
  vpc_id     = aws_vpc.default.id
  cidr_block = "10.0.12.0/24"

  tags = {
    Name = "subnet-prv-NAME-2"
  }
}

resource名

aws_subnet

※pub-1とかはサブネットのIDとなるので、わかりやすくpub-1/pub-2/prv-1/prv-2としています。

必須項目

  • vpc_id
  • cidr_block

vpc_idの設定も、aws_vpc.default.idと他のサービスを参照できるので

※Nameタグはつけておいた方がConsole上見やすかったりするのでつけておこう。

Internet Gateway

TerraformのInternet Gatewayドキュメントを見ながら構築しましょう。

resource "aws_internet_gateway" "default" {
  vpc_id = aws_vpc.default.id

  tags = {
    Name = "igw-NAME"
  }
}

※編集中

Route Table

TerraformのRoute Tableドキュメントを見ながら構築しましょう。

resource "aws_route_table" "pub" {
  vpc_id = aws_vpc.default.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.default.id
  }

  tags = {
    Name = "rtb-pub-NAME"
  }
}
resource "aws_route_table" "prv" {
  vpc_id = aws_vpc.default.id

  tags = {
    Name = "rtb-prv-NAME"
  }
}

TerraformのRoute Table Associationドキュメントを見ながら構築しましょう。

resource "aws_route_table_association" "pub-1" {
  subnet_id      = aws_subnet.pub-1.id
  route_table_id = aws_route_table.pub.id
}
resource "aws_route_table_association" "pub-2" {
  subnet_id      = aws_subnet.pub-2.id
  route_table_id = aws_route_table.pub.id
}
resource "aws_route_table_association" "prv-1" {
  subnet_id      = aws_subnet.prv-1.id
  route_table_id = aws_route_table.prv.id
}
resource "aws_route_table_association" "prv-2" {
  subnet_id      = aws_subnet.prv-2.id
  route_table_id = aws_route_table.prv.id
}

※編集中