반응형
테라폼으로 AWS 네트워크 구축하기
Terraform?
테라폼은 IT 인프라를 코드로 정의하고 관리하는 도구다.
코드를 사용하여 클라우드 리소스나 온프레미스 인프라를 설정하고 관리할 수 있다.
이렇게 하면 반복 작업을 자동화하고, 시스템을 유연하게 확장하며, 변경 사항을 추적하고 문제를 미리 예방할 수 있다.
AWS CLI 설치 ( 선택 )
MAC
# AWSCLI 설치
brew install awscli
# AWS CLI 버전 확인
aws --version
# 설정 정보 구성
aws configure
설정 정보에는 AWS 계정 ID, 액세스키, 비밀 액세스키를 입력하면 된다.
AWS 계정 ID
IAM -> 보안 자격 증명 에 들어오면 계정 세부정보에서 AWS 계정 ID를 확인 할 수 있다.
액세스키들
보안 자격 증명에서 액세스 키 만들기를 통해서 키를 만들 수 있다.
주의!! 비밀 액세스 키는 한 번 보여지고 바로 삭제되기 때문에 안전한 공간에 저장해두자.
테라폼 설치
MAC
# by Homebrew
brew install terraform
테라폼 실행
테라폼 파일 작성
# VPC RELATED JOBS
# AWS 프로바이더 설정
provider "aws" {
region = "ap-northeast-2" # 원하는 AWS 리전으로 변경
access_key = ["YOUR_ACCESS_KEY"]
secret_key = ["YOUR_SECRET_KEY"]
}
# VPC 생성
resource "aws_vpc" "[_NAME_]_vpc" {
cidr_block = "192.168.0.0/16"
enable_dns_support = true
enable_dns_hostnames = true
tags = {
Name = ["VPC_NAME"]
}
}
# Public 서브넷 생성
resource "aws_subnet" "[_NAME_]_public_subnet_1" {
count = 2
vpc_id = aws_vpc.[_NAME_]_vpc.id
cidr_block = element(["192.168.1.0/24", "192.168.2.0/24"], count.index)
availability_zone = element(["ap-northeast-2a", "ap-northeast-2b"], count.index)
map_public_ip_on_launch = true
tags = {
Name = element(["[_NAME_]-public-subnet-1", "[_NAME_]-public-subnet-2"], count.index)
}
}
# Private 서브넷 생성
resource "aws_subnet" "[_NAME_]_private_subnet_1" {
count = 2
vpc_id = aws_vpc.[_NAME_]_vpc.id
cidr_block = element(["192.168.3.0/24", "192.168.4.0/24"], count.index)
availability_zone = element(["ap-northeast-2a", "ap-northeast-2b"], count.index)
tags = {
Name = element(["[_NAME_]-private-subnet-1", "[_NAME_]-private-subnet-2"], count.index)
}
}
locals {
public_subnet_ids = aws_subnet.[_NAME_]_public_subnet_1[*].id
private_subnet_ids = aws_subnet.[_NAME_]_private_subnet_1[*].id
}
# 라우팅 테이블 생성
resource "aws_route_table" "[_NAME_]_public_rt" {
vpc_id = aws_vpc.[_NAME_]_vpc.id
tags = {
Name = "[_NAME_]-public-rt"
}
}
resource "aws_route_table" "[_NAME_]_private_rt" {
vpc_id = aws_vpc.[_NAME_]_vpc.id
tags = {
Name = "[_NAME_]-private-rt"
}
}
# 인터넷 게이트웨이 생성 및 연결
resource "aws_internet_gateway" "[_NAME_]_igw" {
vpc_id = aws_vpc.[_NAME_]_vpc.id
tags = {
Name = "[_NAME_]-igw"
}
}
# Public 라우팅 테이블 생성
resource "aws_route" "public_route" {
route_table_id = aws_route_table.[_NAME_]_public_rt.id
destination_cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.[_NAME_]_igw.id
}
# Public 라우팅 테이블과 서브넷 연결
# 여러 프라이빗 서브넷과 연결
resource "aws_route_table_association" "public_subnet_association" {
count = length(local.public_subnet_ids)
subnet_id = local.public_subnet_ids[count.index]
route_table_id = aws_route_table.[_NAME_]_public_rt.id
}
# Private Elastic IP
resource "aws_eip" "[_NAME_]_nat_eip" {
instance = null
vpc = true
}
resource "aws_nat_gateway" "[_NAME_]_ngw" {
allocation_id = aws_eip.[_NAME_]_nat_eip.id
subnet_id = local.private_subnet_ids[0] # 임의의 서브넷 하나를 입력
tags = {
Name = "[_NAME_]-ngw"
}
}
# Private 라우팅 테이블 생성
resource "aws_route" "private_route" {
route_table_id = aws_route_table.[_NAME_]_private_rt.id
destination_cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.[_NAME_]_ngw.id
}
# Private 라우팅 테이블과 서브넷 연결
# 여러 프라이빗 서브넷과 연결
resource "aws_route_table_association" "private_subnet_association" {
count = length(local.private_subnet_ids)
subnet_id = local.private_subnet_ids[count.index]
route_table_id = aws_route_table.[_NAME_]_private_rt.id
}
[_NAME_] 을 자신이 원하는 이름으로 변경하고 CIDR 블럭을 기호에 맞추어 수정한다.
테라폼 실행
terraform init
terraform plan # 필수! 이걸로 디버깅 시작
terraform apply -target target_file_name.tf
# OR
terraform apply
enter value 라는 창이 나오면 yes를 입력
-target 사용 시 변경 내용만 배포되는 문제점 발생.. 그래서 폴더별로 terraform 파일을 구분해서 init -> plan -> apply 를 진행하자.
결과
삭제
terraform 파일을 수정하지 않은 상태에서 삭제해야 정상적으로 삭제된다.
terraform destroy
반응형