サイトアイコン 上尾市のWEBプログラマーによるブログ

初心者のためのTerraformの使い方: VPC作成編

AWS

Terrraformを使ってAWSにVPCを作成するための方法を解説していきます。

VPCの作成

resource "aws_vpc" "my_vpc" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "dev-vpc"
  }
}

my_vpcの部分には任意の名前を入力する。(これ以降、他のリソースを作成する場合も同様)

cidr_blockには任意のCIDRを入力する。

.tfファイルを実行するためのコマンド

.tfファイルを作成・編集したら以下のコマンドで実行することができる。

-target=aws_vpc.my_vpcのように特定のリソースやデータだけを指定することも可能

サブネットの作成

ここではパブリックなサブネットとプライベートなサブネットを作成する。
パブリック: Webサーバなどを配置
プライベート: Webサーバなどから要求を受け取るAPサーバなどを配置

resource "aws_subnet" "public_a" {
  vpc_id = aws_vpc.my_vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-3a"
  map_public_ip_on_launch = true
  tags = {
    Name = "pub-a"
  }
}

resource "aws_subnet" "private_a" {
  vpc_id = aws_vpc.my_vpc.id
  cidr_block = "10.0.2.0/24"
  availability_zone = "ap-northeast-3a"
  tags = {
    Name = "priv-a"
  }
}

map_public_ip_on_launch = trueは、サブネットで起動したインスタンスにパブリックIPを割り当てるかどうか

cidr_blockにはサブネットのCIDRを入力する。

外部と通信できるようにする

ここまでの手順でVPCとサブネットを構築したが、まだ外部とは通信できない状態である。
Elastic IP、インターネットゲートウェイ、NATゲートウェイ、ルートテーブル、セキュリティグループを追加する必要がある。

Elastic IPの作成

NATゲートウェイで必要となるElastic IPを作成する。

resource "aws_eip" "ngw_pub_a" {
  domain = "vpc"
  tags = {
    Name = "ngw_pub_a"
  }
}

インターネットゲートウェイ、NATゲートウェイの作成

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.my_vpc.id
  tags = {
    Name = "igw"
  }
}

resource "aws_nat_gateway" "ngw_pub_a" {
  allocation_id = aws_eip.ngw_pub_a.id
  subnet_id = aws_subnet.public_a.id
  tags = {
    Name = "ngw-pub-a"
  }
}

allocation_idには作成したElastic IPを指定する。

subnet_idには作成したサブネットを指定する。

ルートテーブルの作成

パブリックサブネット用とプライベートサブネット用の2つを用意する。

resource "aws_route_table" "public_a" {
  vpc_id = aws_vpc.my_vpc.id
  # routeには=を付けないので注意
  route {
    gateway_id = aws_internet_gateway.igw.id
    cidr_block = "0.0.0.0/0"
  }
  tags = {
    Name = "rtb-pub-a"
  }
}
resource "aws_route_table_association" "public_a" {
  subnet_id = aws_subnet.public_a.id
  route_table_id = aws_route_table.public_a.id
}

resource "aws_route_table" "private_a" {
  vpc_id = aws_vpc.my_vpc.id
  route {
    nat_gateway_id = aws_nat_gateway.ngw_pub_a.id
    cidr_block = "0.0.0.0/0"
  }
  tags = {
    Name = "rtb-priv-a"
  }
}
resource "aws_route_table_association" "private_a" {
  subnet_id = aws_subnet.private_a.id
  route_table_id = aws_route_table.private_a.id
}

gateway_idには作成したインターネットゲートウェイを指定する。

nat_gateway_idには作成したNATゲートウェイを指定する。

subnet_idには作成したサブネットを指定する。

セキュリティグループの作成

resource "aws_security_group" "pub_a" {
  name = "sg_pub_a"
  vpc_id = aws_vpc.my_vpc.id
  tags = {
    Name = "sg-pub-a"
  }
}

# アウトバウンド
resource "aws_security_group_rule" "egress_pub_a" {
  type = "egress"
  # ポートの範囲(0〜0=全て)
  from_port = 0
  to_port = 0
  protocol = "-1" # 全て
  cidr_blocks = ["0.0.0.0/0"] # 全て
  security_group_id = aws_security_group.pub_a.id
}

# SSHインバウンド
resource "aws_security_group_rule" "ingress_pub_a_22" {
  type = "ingress"
  from_port = "22"
  to_port = "22"
  protocol = "tcp"
  cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
  security_group_id = aws_security_group.pub_a.id
}

# HTTPインバウンド
resource "aws_security_group_rule" "ingress_pub_a_80" {
  type = "ingress"
  from_port = "80"
  to_port = "80"
  protocol = "tcp"
  cidr_blocks = ["xxx.xxx.xxx.xxx/32"]
  security_group_id = aws_security_group.pub_a.id
}

resource "aws_security_group" "priv_a" {
  name = "sg_priv_a"
  vpc_id = aws_vpc.my_vpc.id
  tags = {
    Name = "sg-priv-a"
  }
}

resource "aws_security_group_rule" "egress_priv_a" {
  type = "egress"
  from_port = 0
  to_port = 0
  protocol = "-1"
  cidr_blocks = ["0.0.0.0/0"]
  security_group_id = aws_security_group.priv_a.id
}

resource "aws_security_group_rule" "ingress_priv_a_22" {
  type = "ingress"
  from_port = "22"
  to_port = "22"
  protocol = "tcp"
  cidr_blocks = ["10.0.1.0/24"] # パブリックサブネットからの通信を許可
  security_group_id = aws_security_group.priv_a.id
}

xxx.xxx.xxx.xxxにはSSHとHTTPを許可するIPアドレスを指定する。

パブリックサブネットはアウトバンドを全て許可、インバウンドをSSHとHTTPのみを許可としています。

プライベートサブネットはアウトバンドを全て許可、インバウンドをパブリックサブネットからの通信のみを許可としています。

Terraformの実行

terraform applyで実行する。

次回はTerraformを使ってEC2インスタンス(WEBサーバ)を作成する方法を解説していきます。

モバイルバージョンを終了