Module
AWS VPC 구성
cd ~/environment && mkdir -p terraform/network && cd terraform/networkcat <<EOF | tee provider.tf terraform { required_providers { aws = { source = "hashicorp/aws" version = "5.35.0" } } } EOFtouch main.tfresource "aws_vpc" "this" { cidr_block = "10.10.0.0/16" }terraform planterraform initterraform planterraform apply --auto-approveterraform state show aws_vpc.thisoutput "subnet_cidr_1" { value = cidrsubnet(aws_vpc.this.cidr_block, 8, 0) } output "subnet_cidr_2" { value = cidrsubnet(aws_vpc.this.cidr_block, 8, 250) } output "subnet_cidr_3" { value = cidrsubnet(aws_vpc.this.cidr_block, 12, 250) }terraform planresource "aws_subnet" "public" { vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, 0) }terraform planaws ec2 describe-availability-zones \ --query 'AvailabilityZones[*].ZoneName' \ --no-cli-pagerdata "aws_availability_zones" "azs" {} output "availability_zones" { value = data.aws_availability_zones.azs }terraform planresource "aws_subnet" "public" { vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, 0) availability_zone = data.aws_availability_zones.azs.names[0] }terraform planresource "aws_subnet" "public" { count = 4 vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, count.index) availability_zone = data.aws_availability_zones.azs.names[count.index] }terraform planresource "aws_subnet" "public" { count = length(data.aws_availability_zones.azs.names) vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, count.index) availability_zone = data.aws_availability_zones.azs.names[count.index] }terraform planresource "aws_subnet" "public" { count = length(data.aws_availability_zones.azs.names) vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, count.index) availability_zone = data.aws_availability_zones.azs.names[count.index] tags = { "Name" = format( "public-subnet-%s", substr(data.aws_availability_zones.azs.names[count.index], -2, 2) ) } }terraform planoutput "availability_zones" { value = data.aws_availability_zones.azs }data "aws_availability_zones" "azs" {}variable "environment" { description = "환경 이름" type = string } variable "vpc_cidr" { description = "VPC 대역대" type = string default = "10.0.0.0/16" } variable "create_private_subnet" { description = "프라이빗 서브넷 생성" type = bool default = false }# VPC resource "aws_vpc" "this" { cidr_block = var.vpc_cidr enable_dns_hostnames = true tags = { "Name" = "${var.environment}-vpc" } } # 인터넷 게이트웨이 resource "aws_internet_gateway" "this" { vpc_id = aws_vpc.this.id tags = { "Name" = "${var.environment}-igw" } } # 퍼블릭 서브넷 resource "aws_subnet" "public" { count = length(data.aws_availability_zones.azs.names) vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, count.index) availability_zone = data.aws_availability_zones.azs.names[count.index] map_public_ip_on_launch = true tags = { "Name" = format( "${var.environment}-pub-subnet-%s", substr(data.aws_availability_zones.azs.names[count.index], -1, 1), ) } } # 퍼블릭 서브넷용 라우팅 테이블 resource "aws_route_table" "public" { vpc_id = aws_vpc.this.id tags = { "Name" = "${var.environment}-pub-rtb" } } # 각각의 퍼블릭 서브넷에 위에서 생성한 라우팅 테이블 연동 resource "aws_route_table_association" "public" { count = length(aws_subnet.public) subnet_id = aws_subnet.public[count.index].id route_table_id = aws_route_table.public.id } # 퍼블릭 서브넷에 연동된 라우팅 테이블에 인터넷 게이트웨이로 가능 경로 추가 resource "aws_route" "internet" { route_table_id = aws_route_table.public.id gateway_id = aws_internet_gateway.this.id destination_cidr_block = "0.0.0.0/0" } # NAT 게이트웨이에 부여할 EIP resource "aws_eip" "nat" { count = var.create_private_subnet ? 1 : 0 domain = "vpc" } # NAT 게이트웨이 resource "aws_nat_gateway" "this" { count = var.create_private_subnet ? 1 : 0 allocation_id = aws_eip.nat[0].id subnet_id = aws_subnet.public[0].id tags = { "Name" = "${var.environment}-nat-gw" } } # 프라이빗 서브넷 resource "aws_subnet" "private" { count = var.create_private_subnet ? length(data.aws_availability_zones.azs.names) : 0 vpc_id = aws_vpc.this.id cidr_block = cidrsubnet(aws_vpc.this.cidr_block, 8, count.index + 10) availability_zone = data.aws_availability_zones.azs.names[count.index] tags = { "Name" = format( "${var.environment}-pri-subnet-%s", substr(data.aws_availability_zones.azs.names[count.index], -1, 1), ) } } # 프라이빗 서브넷용 라우팅 테이블 resource "aws_route_table" "private" { count = var.create_private_subnet ? 1 : 0 vpc_id = aws_vpc.this.id tags = { "Name" = "${var.environment}-pri-rtb" } } # 각각의 프라이빗 서브넷에 위에서 생성한 라우팅 테이블 연동 resource "aws_route_table_association" "private" { count = var.create_private_subnet ? length(aws_subnet.private) : 0 subnet_id = aws_subnet.private[count.index].id route_table_id = aws_route_table.private[0].id } # 프라이빗 서브넷에 연동된 라우팅 테이블에 NAT 게이트웨이로 가능 경로 추가 resource "aws_route" "nat" { count = var.create_private_subnet ? 1 : 0 route_table_id = aws_route_table.private[0].id nat_gateway_id = aws_nat_gateway.this[0].id destination_cidr_block = "0.0.0.0/0" }terraform planterraform plan \ --var="environment=test" \ --var="vpc_cidr=10.10.0.0/16" \ --var="create_private_subnet=true"terraform apply \ --var="environment=test" \ --var="vpc_cidr=10.10.0.0/16" \ --var="create_private_subnet=true" \ --auto-approveterraform destroy \ --var="environment=test" \ --var="vpc_cidr=10.10.0.0/16" \ --var="create_private_subnet=true" \ --auto-approve
EC2 인스턴스 생성
Module 저장소
Last updated