[Terraform] 테라폼으로 AWS 네트워크 환경 구축하기
오랜만에 돌아온 글...
이번엔 Terraform으로 AWS 네트워크 환경을 구축해보자.
가장 먼저 VPC를 만들자.
- resource 다음에 있는 aws_vpc는 VPC를 만든다는 의미이다.
- main은 main이라는 변수값을 주어서 다른 리소스 생성 시 참조할 수 있도록 값을 지정하는 것이다.
#vpc
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
instance_tenancy = "default"
tags = {
Name = "mgthon-vpc-apne2"
}
}
그리고 VPC 내부에 서브넷을 만들어야한다.
- vpc_id에는 위에서 생성한 VPC를 참조하여 만들 수 있도록 하고,
- availability_zone을 지정하여서 각각 a와 c에 생성될 수 있도록 한다.
#Public subnet
resource "aws_subnet" "sbn-pub-a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "mgthon-sbn-public-a"
}
}
resource "aws_subnet" "sbn-pub-c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.3.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "mgthon-sbn-public-c"
}
Private 서브넷도 한꺼번에 만들자
#Private Subnet
resource "aws_subnet" "sbn-svr-a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.11.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "mgthon-sbn-private-svr-a"
}
}
resource "aws_subnet" "sbn-svr-c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.13.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "mgthon-sbn-private-svr-c"
}
}
#Private DB Subnet
resource "aws_subnet" "sbn-db-a" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.21.0/24"
availability_zone = "ap-northeast-2a"
tags = {
Name = "mgthon-sbn-private-db-a"
}
}
resource "aws_subnet" "sbn-db-c" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.23.0/24"
availability_zone = "ap-northeast-2c"
tags = {
Name = "mgthon-sbn-private-db-c"
}
}
Subnet만 만들고 끝이면 좋겠지만, 라우팅 테이블도 만들어야 한다.
그러면서 인터넷 게이트웨이, NAT 게이트웨이까지 만들어서 구성할 수 있도록 한다.
먼저 인터넷 게이트웨이를 생성한다.
#internet gw
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
tags = {
Name = "mgthon-igw"
}
}
퍼블릭 라우팅 테이블은 다음과 같이 만들 수 있다.
- route 부분에 위에서 생성한 internet gateway를 지정한다.
#public route table
resource "aws_route_table" "rt-pub" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
tags = {
Name = "mgthon-rt-public"
}
}
서브넷을 생성했을 때는 기본 라우팅 테이블이 자동으로 생성되어서 붙어있기 때문에, 새로 생성된 라우팅 테이블을 서브넷과 연결해주어야 한다.
#public route table associate
resource "aws_route_table_association" "rt_asso_pub-a" {
subnet_id = aws_subnet.sbn-pub-a.id
route_table_id = aws_route_table.rt-pub.id
}
resource "aws_route_table_association" "rt_asso_pub-c" {
subnet_id = aws_subnet.sbn-pub-c.id
route_table_id = aws_route_table.rt-pub.id
}
나머지 Private subnet도 동일하게 진행할 수 있다.
Private subnet에 있는 프라이빗한 리소스들은 NAT 게이트웨이를 통해 인터넷으로부터 연결될 수 있다.
NAT Gateway에는 EIP가 붙는다 따라서 EIP를 먼저 생성하고, nat gateway를 생성하자.
#EIP
resource "aws_eip" "nat_1" {
tags = {
Name = "mgthon-eip"
}
}
#nat gw
resource "aws_nat_gateway" "nat_gw" {
subnet_id = aws_subnet.sbn-pub-a.id
allocation_id = aws_eip.nat_1.id
tags = {
Name = "mgthon-ntgw"
}
}
그리곤 Private Subnet에 부착할 라우팅 테이블을 만들어서 부착까지 하자!
#private route table
resource "aws_route_table" "rt-pri" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_nat_gateway.nat_gw.id
}
tags = {
Name = "mgthon-rt-private-svr"
}
}
#private route table associate
resource "aws_route_table_association" "rt_asso_pri-a" {
subnet_id = aws_subnet.sbn-svr-a.id
route_table_id = aws_route_table.rt-pri.id
}
resource "aws_route_table_association" "rt_asso_pri-c" {
subnet_id = aws_subnet.sbn-svr-c.id
route_table_id = aws_route_table.rt-pri.id
}
마지막으로 DB Subent에 연결할 Routing table까지 생성하자.
Private DB Subnet의 경우, 인터넷 게이트웨이에 연결하지도, NAT에 연결하지도 않기 때문에 아무것도 지정하지 않고 생성하면 된다.
#db route table
resource "aws_route_table" "rt-db" {
vpc_id = aws_vpc.main.id
route =[]
tags = {
Name = "mgthon-rt-private-db"
}
}
#db route table associate
resource "aws_route_table_association" "rt_asso_db-a" {
subnet_id = aws_subnet.sbn-db-a.id
route_table_id = aws_route_table.rt-db.id
}
resource "aws_route_table_association" "rt_asso_db-c" {
subnet_id = aws_subnet.sbn-db-c.id
route_table_id = aws_route_table.rt-db.id
}
이렇게 하면 아래 아키텍처 리소스를 모두 완성한 것이다! 다음에는 S3를 생성해보자
끗-!