Terrraformを使ってAWSにVPCを作成するための方法を解説していきます。
VPCの作成
- touch vpc.tfして以下の内容を入力
resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "dev-vpc"
}
}
my_vpcの部分には任意の名前を入力する。(これ以降、他のリソースを作成する場合も同様)
cidr_blockには任意のCIDRを入力する。
.tfファイルを実行するためのコマンド
.tfファイルを作成・編集したら以下のコマンドで実行することができる。
- terraform planで実行内容の事前確認
- terraform applyで実行(途中でyesを入力)
- terraform plan -destroyで削除の確認
- terraform destroyで削除実行
※ -target=aws_vpc.my_vpcのように特定のリソースやデータだけを指定することも可能
サブネットの作成
ここではパブリックなサブネットとプライベートなサブネットを作成する。
パブリック: Webサーバなどを配置
プライベート: Webサーバなどから要求を受け取るAPサーバなどを配置
- touch vpc_subnet.tfして以下の内容を入力
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ゲートウェイ、ルートテーブル、セキュリティグループを追加する必要がある。
- インターネットゲートウェイ: VPCにアタッチする
- NATゲートウェイ: パブリックサブネットにアタッチする
Elastic IPの作成
NATゲートウェイで必要となるElastic IPを作成する。
- touch eip.tfして以下の内容を入力
resource "aws_eip" "ngw_pub_a" {
domain = "vpc"
tags = {
Name = "ngw_pub_a"
}
}
インターネットゲートウェイ、NATゲートウェイの作成
- touch vpc_gw.tfして以下の内容を入力
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つを用意する。
- touch vpc_route.tfして以下の内容を入力
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には作成したサブネットを指定する。
セキュリティグループの作成
- touch vpc_sg.tfして以下の内容を入力
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サーバ)を作成する方法を解説していきます。