본문 바로가기

DevOps/Terraform

[DevOps] AWS, Terraform - Terraform으로 AWS 리소스 생성하기

VPC 소개

Amazon VPC는 Amazon에서 제공하는 Private한 네크워크 망이다.

사용자에게 AWS 전용 네트워크 망을 만들어주는 것이다.

 

VPC의 핵심 구성요소

  • Virtual Private Cloud(VPC) — 사용자의 AWS 계정 전용 가상 네트워크입니다.
  • 서브넷 — VPC의 IP 주소 범위입니다. VPC 안에서 IP 주소 범위를 어디까지 나누느냐 하는 것.
  • 라우팅 테이블 — 네트워크 트래픽을 전달할 위치를 결정하는 데 사용되는 라우팅이라는 규칙 집합입니다. 어떤 머신에서 외부 아웃바운드로 나가는 트래픽이 어디로 나갈 것인가 규칙을 정하는 테이블.
  • 인터넷 게이트웨이 — VPC의 리소스와 인터넷 간의 통신을 활성화하기 위해 VPC에 연결하는 게이트웨이입니다. 인터넷을 연결하기 위해 필요한 서비스.
  • NAT 게이트웨이 — 네트워크 주소 변환을 통해 프라이빗 서브넷에서 인터넷 또는 기타 AWS 서비스에 연결하는 게이트웨이입니다.
  • 씨큐리티 그룹 — 보안 그룹은 인스턴스에 대한 인바운드 및 아웃바운드 트래픽을 제어하는 가상 방화벽 역할을 하는 규칙 집합입니다. 들어오는 트래픽을 어떤 규칙을 통해서 허용할 건지, 아웃바운드도 어떤 규칙을 통해서 허용할 것인지 그 규칙을 가지고 있는 집합
  • VPC 엔드포인트 — 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결을 필요로 하지 않고 PrivateLink 구동 지원 AWS 서비스 및 VPC 엔드포인트 서비스에 VPC를 비공개로 연결할 수 있습니다. VPC의 인스턴스는 서비스의 리소스와 통신하는 데 퍼블릭 IP 주소를 필요로 하지 않습니다. VPC와 기타 서비스 간의 트래픽은 Amazon 네트워크를 벗어나지 않습니다.
  • IPv4 CIDR block - aws vpc 네트워크망의 주소 범위. 보통 네트워크 사설망 대역 사용.

 

인터넷 게이트웨이 vs. NAT 게이트웨이

둘을 나누는 것은 퍼블릿 서브넷 vs. 프라이빗 서브넷

서브넷과 어떤 라우팅 테이블이 연결되는 구조

 

라우팅 테이블이 인터넷(웹)으로 나가는 서비스가 인터넷 게이트웨이를 통한다면 퍼블릭 서브넷이라고 함

NAT 게이트웨이를 통한다면 프라이빗 서브넷이라고 함

 

-> 서브넷을 어느 라우팅 테이블에 연결하느냐에 따라서 서브넷이 프라이빗 또는 퍼블릭이 되는 것

 

만약 네트워크 구성을 잘했다면 ec2 같은 머신에 공인 IP가 붙어있으면 보통 퍼블릭 서브넷에 위치한 EC2 인스턴스라고 볼 수 있음

공인 IP를 가지고 있지 않지만 NAT 게이트웨이를 통해서 인터넷을 할 수 있는 서브넷을 프라이빗 서브넷이라고 부름

 

게이트웨이와 서브넷과 라우팅 테이블의 관계

 

게이트웨이, 서브넷, 라우팅 테이블의 관계

 

간단하게 정리를 해보면 먼저, 서브넷과 라우팅 테이블은 연결되어 있는 게 맞다.

라우팅 테이블은 subnet이란 vpc 내의 주소 범위에 있는 인스턴스들이 어떤 경로로 트래픽을 전달할지 결정하는 역할을 한다.

즉, 라우팅 테이블에서 잘 설정이 되어 있어야 다른 네트워크로의 트래픽 전송이 가능한 것이다.

이때 vpc와 다른 네트워크를 연결해주는 파이프 같은 요소가 바로 게이트웨이이다.

어떤 게이트웨이로 트래픽이 전송되느냐를 결정하는 게 바로 라우팅 테이블인 것이다.

단적으로 말해서 라우팅 테이블은 네트워크 트래픽을 전달하는 데 사용되는 라우팅 규칙의 집합이기 때문이다.

 

만약 서브넷에서 라우팅 테이블의 대상을 인터넷 게이트웨이로 설정하면 퍼블릭 서브넷인 것이고, 라우팅 테이블의 대상을 NAT 게이트웨이로 하면 프라이빗 서브넷이 되는 것이다.

 

퍼블릭 서브넷과 프라이빗 서브넷

 

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-example-private-subnets-nat.html

 

퍼블릭 서브넷의 인스턴스들의 트래픽은 라우트를 검사해서 인터넷 게이트웨이를 통해 바로 나가게 된다.

각각의 서버들이 각각의 고유한 public ip를 가지고 있다.

 

프라이빗 서브넷의 인스턴스들은 라우트를 검사해서 보면 라우트 테이블에 nat-gateway-id가 트래픽 전달 target으로 설정되어 있어 nat gateway를 통해서 갔다가 internet gateway를 통해 나가게 된다.

인스턴스들이 nat gateway가 가지고 있는 동일한 elastic ip를 통해 나가게 된다.

 

IaC를 하는 이유

마법사를 통해 만들면 VPC의 형태가 틀 안에 갖히게 되고 히스토리를 추적하기 힘듦

코드를 통해 내가 원하는 모양으로 만들 수 있어야 함!

실수로 aws 콘솔에서 변경 사항이 있어도, Terraform으로 구축한 부분이라면 변경 사항을 알 수 있음

aws에서 실수로 삭제해도 terraform apply을 해주면 다시 추가해줌!! -> 내가 원하는 형상으로 다시 복구 가능

따라서 우리가 인프라를 반드시 코드로 만들어야 함!! (테라폼의 강점)

 

 

반드시 해야 하는 것

aws vpc에 대해 공식 문서를 비롯한 다양한 문서를 읽어보는 것

프라이빗 서브넷과 퍼블릭 서브넷을 정확히 구분하는 게 중요

한 번씩 비교해보는 것도 추천

네트워크 사설망 대역에 대해 알아보기

온프레미스

고가용성 설계 (High Availability)

CIDR 반드시 알아야 함

인바운드, 아웃바운드

VPC 엔드포인트(게이트웨이를 안 통하고 다이렉트로 통하는 것)를 만들고 연결해볼 것

라우트 테이블에 룰을 연결해야 한다. (복습해볼 것)

 

Terraform을 이용해서 VPC 와 subnet 생성하기

VPC 생성하기

terraform apply
aws console에서 확인할 수 있는 생성된 VPC

 

subnet 생성하기

Subnet은 특정 Availability Zone 에 속한 네트워크 그룹으로 VPC 내에서도 나눠진 독립적인 네트워크 구역입니다.
Subnet을 생성하실 때는 aws_subnet 이라는 리소스를 사용하시면 됩니다. 필요한 설정은 해당 서브넷을 연결할 VPC의 ID와 해당 서브넷의 cidr block입니다. 서브넷의 cidr block은 반드시 VPC의 cidr block 내에 속해 있어야 합니다.

 

terraform state list로 생성된 state의 리스트를 볼 수 있음

 

IGW와 nat 게이트웨이 생성하기

IGW
NAT

 

AWS RouteTable 구성하기

네트워크 트래픽을 전달하는 데스티네이션 (목적지)

트래픽이 어디로 갈건지 결정하는 라우팅 규칙의 집합

 

resource "aws_route_table_association" "route_table_association_1" {
  subnet_id      = aws_subnet.first_subnet.id
  route_table_id = aws_route_table.route_table.id
}

 

어느 서브넷을 어느 라우트 테이블에 연결할 건지 결정하는 것을 association이라고 함

 

연결된 route_table과 subnet 2개

 

'DevOps > Terraform' 카테고리의 다른 글

[DevOps] AWS, Terraform - AWS IAM  (0) 2023.06.19
[DevOps] AWS, Terraform - AWS S3  (0) 2023.06.18
[DevOps] AWS, Terraform - AWS EC2 및 SSH 활용  (0) 2023.06.15
[DevOps] AWS, Terraform Intro  (1) 2023.06.13
[Infra] Terraform  (0) 2023.06.11