VPC
AWS VPC(Amazon Web Services Virtual Private Cloud)は、AWSクラウド内で論理的に隔離されたネットワークを設定・管理するためのサービスです。VPCを使うことで、自分自身でIPアドレス範囲を定義したり、サブネットを作成したり、ルーティングテーブルやネットワークゲートウェイを設定してトラフィックの流れを制御することができます。
この機能により、従来のネットワークとほぼ同じ設定を持ちながら、AWSのスケーラビリティとリソースを活用することができます。セキュリティ面では、ネットワークアクセス制御リストやセキュリティグループといった機能があり、サブネットやインスタンスレベルでの入出力トラフィックを制御することができます。VPCは、AWSでスケーラブルかつセキュアなアプリケーションを運用するための基本的なコンポーネントです。
モジュール例
My tip
2つのパブリックサブネットと2つのプライベートサブネットを持つVPC
modules/vpc/variables.tf
variable "cidr_block" {
default = "10.0.0.0/16"
}
modules/vpc/main.tf
/**
* VPCモジュール
*/
# VPC
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
enable_dns_hostnames = true
tags = {
"Name" = "terraform-vpc"
}
}
# vpc作成時に自動生成されるデフォルトsecurity_group
resource "aws_default_security_group" "default" {
vpc_id = aws_vpc.main.id
ingress {
from_port = 0
to_port = 0
protocol = -1
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = -1
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
"Name" = "terraform-default-security-group"
}
}
# vpc作成時に自動生成されるデフォルトacl
resource "aws_default_network_acl" "default" {
default_network_acl_id = aws_vpc.main.default_network_acl_id
ingress {
protocol = -1
rule_no = 100
action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 0
to_port = 0
}
egress {
protocol = -1
rule_no = 100
action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 0
to_port = 0
}
subnet_ids = [aws_subnet.public-1a.id, aws_subnet.public-1c.id, aws_subnet.private-1a.id, aws_subnet.private-1c.id]
tags = {
"Name" = "terraform-acl"
}
}
/**
* subnet
*/
resource "aws_subnet" "public-1a" {
availability_zone = "ap-northeast-1a"
cidr_block = cidrsubnet(var.cidr_block, 4, 0)
vpc_id = aws_vpc.main.id
map_public_ip_on_launch = true
tags = {
"Name" = "terraform-public-1a"
}
}
resource "aws_subnet" "public-1c" {
availability_zone = "ap-northeast-1c"
cidr_block = cidrsubnet(var.cidr_block, 4, 1)
vpc_id = aws_vpc.main.id
map_public_ip_on_launch = true
tags = {
"Name" = "terraform-public-1c"
}
}
resource "aws_subnet" "private-1a" {
availability_zone = "ap-northeast-1a"
cidr_block = cidrsubnet(var.cidr_block, 4, 2)
vpc_id = aws_vpc.main.id
tags = {
"Name" = "terraform-private-1a"
}
}
resource "aws_subnet" "private-1c" {
availability_zone = "ap-northeast-1c"
cidr_block = cidrsubnet(var.cidr_block, 4, 3)
vpc_id = aws_vpc.main.id
tags = {
"Name" = "terraform-private-1c"
}
}
# IGW
resource "aws_internet_gateway" "gw" {
vpc_id = aws_vpc.main.id
tags = {
"Name" = "terraform-igw"
}
}
/**
* ルートテーブル
*/
# public
# vpc作成時に自動生成されるデフォルトroute_table
resource "aws_default_route_table" "public" {
default_route_table_id = aws_vpc.main.default_route_table_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
"Name" = "terraform-public-rtb"
}
}
resource "aws_main_route_table_association" "public" {
route_table_id = aws_default_route_table.public.id
vpc_id = aws_vpc.main.id
}
resource "aws_route_table_association" "public-1a" {
route_table_id = aws_default_route_table.public.id
subnet_id = aws_subnet.public-1a.id
}
resource "aws_route_table_association" "public-1c" {
route_table_id = aws_default_route_table.public.id
subnet_id = aws_subnet.public-1c.id
}
# private
resource "aws_route_table" "private-1a" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.gw.id
}
tags = {
"Name" = "terraform-private-rtb"
}
}
resource "aws_route_table_association" "private-1a" {
route_table_id = aws_route_table.private-1a.id
subnet_id = aws_subnet.private-1a.id
}
resource "aws_route_table_association" "private-1c" {
route_table_id = aws_route_table.private-1a.id
subnet_id = aws_subnet.private-1c.id
}