AWS VPCネットワーク設計に関するメモ
MEMO
- プライベートIPアドレスの範囲から指定する
- VPNやダイレクトコネクト利用時はオンプレミスの重複に注意
- VPCピア利用時はVPC間で重複できない事に注意
- 将来の拡張に対応可能なCIDRを選択する
- 最低でも128以上が必要
- CIDRブロックのうち、5IP
- ELBを配置するサブネットは/27以上のCIDRかつ、少なくとも8個のIPが必要
- RFC1918準拠のIPアドレス範囲から指定する
- ダイレクトコネクト、VPN、VPCピアリング利用時はIPアドレス範囲の重複に注意する
- サブネットの設計
- ブロードキャストとマルチキャストは使用不可
MEMO:
# プロバイダーの設定
provider "aws" {
region = "ap-northeast-1" # 東京リージョン
}
# VPCの作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
}
}
# インターネットゲートウェイの作成
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "main-igw"
}
}
# パブリックサブネットの作成
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-1a"
tags = {
Name = "public-subnet"
}
}
# ルートテーブルの作成
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
tags = {
Name = "public-rt"
}
}
# サブネットとルートテーブルの関連付け
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
# セキュリティグループの作成
resource "aws_security_group" "web" {
name = "allow_web"
description = "Allow web inbound traffic"
vpc_id = aws_vpc.main.id
ingress {
description = "HTTP from anywhere"
from_port = 80
to_port = 80
protocol = "tcp"
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 = "allow_web"
}
}
# EC2インスタンスの作成
resource "aws_instance" "web" {
ami = "ami-0d52744d6551d851e" # Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
instance_type = "t2.micro"
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.web.id]
associate_public_ip_address = true
user_data = <<-EOF
#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello from Terraform</h1>" > /var/www/html/index.html
EOF
tags = {
Name = "web-server"
}
}
# Elastic IPの割り当て
resource "aws_eip" "web" {
instance = aws_instance.web.id
vpc = true
tags = {
Name = "web-eip"
}
}