테라폼으로 빠르게 VPC를 만들어보자.
수작업으로 오류가 생기지 않도록 VPC와 서브넷을 만들어 관리하자.
테라폼 설치법 알아보자
테라폼으로 VPC,서브넷등 만드는 법을 알아보자.
myeks
ec2키페어 필요
access/secret-key 필요
terraform -version
참고
https://brunch.co.kr/@topasvga/3585
실무에서 어느정도의 IP를 할당해 사용하는지 알아보자.
/20 블럭정도 할당해 사용하도록 한다.
private ip를 가장 많이 사용하므로 /22로 할당 한다.
클라우드 CSP마다 서브넷 할당 규칙이 틀릴수 있어 여유IP를 둔다.
첨부 IP
IP블럭 설계시 참고 사항.
개발 VPC블럭이 있다.
전자금융 거래법 사용 VPC 블럭이 있다.
비 전자금용 거래법 사용 VPC블럭이 있다.
1
# pub2 , pri2 , nat 2 -> pub2, pri2, pridb2, nat2
mkdir -p 11
cd 11
# 1. 변수 선언 파일 (variables.tf) 생성
cat <<'EOF' > variables.tf
variable "vpc_name" {
description = "VPC 및 하위 리소스들의 이름 접두사"
type = string
}
variable "vpc_cidr" {
description = "VPC의 기본 CIDR 블록"
type = string
}
EOF
# 2. 변수 값 정의 파일 (terraform.tfvars) 생성
cat <<'EOF' > terraform.tfvars
vpc_name = "terraform-101"
vpc_cidr = "10.0.0.0/20"
EOF
# 3. 메인 인프라 구성 파일 (main.tf) 생성
cat <<'EOF' > main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
tags = {
Name = var.vpc_name
}
}
resource "aws_subnet" "pri1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.0.0/22"
availability_zone = "ap-northeast-2a"
tags = {
Name = "${var.vpc_name}-subnet-private-1"
}
}
resource "aws_subnet" "pri2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.4.0/22"
availability_zone = "ap-northeast-2c"
tags = {
Name = "${var.vpc_name}-subnet-private-2"
}
}
resource "aws_subnet" "pub1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.8.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "${var.vpc_name}-subnet-public-1"
}
}
resource "aws_subnet" "pub2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.9.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "${var.vpc_name}-subnet-public-2"
}
}
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.vpc_name}-igw"
}
}
# default route
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
tags = {
Name = "${var.vpc_name}-rt-public"
}
}
resource "aws_route_table_association" "public_association_1" {
subnet_id = aws_subnet.pub1.id
route_table_id = aws_route_table.public.id
}
resource "aws_route_table_association" "public_association_2" {
subnet_id = aws_subnet.pub2.id
route_table_id = aws_route_table.public.id
}
resource "aws_subnet" "pri-db1" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.10.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "${var.vpc_name}-subnet-pri-db1"
}
}
resource "aws_subnet" "pri-db2" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "${var.vpc_name}-subnet-pri-db2"
}
}
# nat
resource "aws_eip" "nat_1" {
domain = "vpc"
lifecycle {
create_before_destroy = true
}
tags = {
Name = "${var.vpc_name}-eip-nat1"
}
}
resource "aws_eip" "nat_2" {
domain = "vpc"
lifecycle {
create_before_destroy = true
}
tags = {
Name = "${var.vpc_name}-eip-nat2"
}
}
resource "aws_nat_gateway" "nat_gateway_1" {
allocation_id = aws_eip.nat_1.id
subnet_id = aws_subnet.pub1.id
tags = {
Name = "${var.vpc_name}-nat-1"
}
}
resource "aws_nat_gateway" "nat_gateway_2" {
allocation_id = aws_eip.nat_2.id
subnet_id = aws_subnet.pub2.id
tags = {
Name = "${var.vpc_name}-nat-2"
}
}
# private route table add
resource "aws_route_table" "public_private_1" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.vpc_name}-rt-private-1"
}
}
resource "aws_route_table" "public_private_2" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.vpc_name}-rt-private-2"
}
}
resource "aws_route_table_association" "public_association_private_1" {
subnet_id = aws_subnet.pri1.id
route_table_id = aws_route_table.public_private_1.id
}
resource "aws_route_table_association" "public_association_private_2" {
subnet_id = aws_subnet.pri2.id
route_table_id = aws_route_table.public_private_2.id
}
resource "aws_route" "private_nat_1" {
route_table_id = aws_route_table.public_private_1.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat_gateway_1.id
}
resource "aws_route" "private_nat_2" {
route_table_id = aws_route_table.public_private_2.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat_gateway_2.id
}
# pri-db1,2 private route table add
resource "aws_route_table" "public_private_db1" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.vpc_name}-rt-private-db1"
}
}
resource "aws_route_table" "public_private_db2" {
vpc_id = aws_vpc.main.id
tags = {
Name = "${var.vpc_name}-rt-private-db2"
}
}
resource "aws_route_table_association" "public_association_private_db1" {
subnet_id = aws_subnet.pri-db1.id
route_table_id = aws_route_table.public_private_db1.id
}
resource "aws_route_table_association" "public_association_private_db2" {
subnet_id = aws_subnet.pri-db2.id
route_table_id = aws_route_table.public_private_db2.id
}
EOF
vi terraform.tfvars
vpc_name = "agame-dev"
vpc_cidr = "10.0.0.0/20"
terraform init
terraform plan
terraform apply -auto-approve
1분 30초
aws_nat_gateway.nat_gateway_2: Still creating... [1m30s elapsed]
aws_nat_gateway.nat_gateway_1: Still creating... [1m30s elapsed]
aws_nat_gateway.nat_gateway_1: Creation complete after 1m34s [id=nat-0c5fb918a977ff1b9]
aws_route.private_nat_1: Creating...
aws_route.private_nat_1: Creation complete after 0s [id=r-rtb-00345d4bcafba1e341080289494]
aws_nat_gateway.nat_gateway_2: Still creating... [1m40s elapsed]
aws_nat_gateway.nat_gateway_2: Still creating... [1m50s elapsed]
aws_nat_gateway.nat_gateway_2: Creation complete after 1m54s [id=nat-07649ab3ce232abdc]
aws_route.private_nat_2: Creating...
aws_route.private_nat_2: Creation complete after 0s [id=r-rtb-0101a725fa0798d121080289494]
╷
1
VPC 생성 확인
2. 서브넷 생성 확인
3 . 라우팅 테이블 생성 확인
라우팅 테이블은 5개이다.
퍼블릭 라우팅 테이블 1개
프라이빗 라우팅 테이블 2개
DB라우팅 테이블 2개
퍼블릭 라우팅 테이블
프라이빗 라우팅 테이블1
프라이빗 라우팅 테이블2
디비 라우팅 테이블 1 , 디비 라우팅 테이블 2
4
VPC > natgw 생성확인
terraform destroy -auto-approve
1
https://brunch.co.kr/@topasvga/2797
2
https://brunch.co.kr/@topasvga/3360
3
https://brunch.co.kr/@topasvga/3347
4
https://brunch.co.kr/@topasvga/3588
감사합니다.