이제 Terraform을 제대로 이해하기 위해
가장 먼저 필요한 네트워크 개념을 정리해보자.
Terraform은 인프라를 코드로 정의하는 도구지만,
실제로 만들게 되는 것은 결국 네트워크 + 서버 구조다.
- VPC를 만들고
- Subnet을 나누고
- 서버를 배치하고
- 외부와 통신을 설계하는 것
이 모든 것이 결국 네트워크 위에서 이루어진다.
그래서 Terraform을 배우기 전에
"이 리소스들이 왜 필요한지"를 이해하는 것이 훨씬 중요하다.
AWS 안에서 내가 쓰는 네트워크 영역
AWS내부에서 직접 만드는 가상의 네트워크 공간
다시말해 AWS 라는 큰 건물이 있다면 내가 따로 쓸 전용 공간
VPC 내부의 또 나뉜 구역
서버를 한 공간에 다 넣었을때 보안과 관리가 어려워진다.
- 외부에서 접근이 가능한 서버 (Web Server)
- 내부에서 접근 가능한 서버 (DB)
등 이와 같은 것들을 한 곳이 아닌 여러 구역을 나눠서 관리하려는 목적 즉
Subnet 이다.
( ALB: 외부 요청을 받아 내부 서버로 분산 하는 로드밸런서 )
( Bastion Host: 외부에서 내부 서버에 안전 접속위한 중간 서버 )
Terraform에서는 VPC 안에 Subnet을 생성해서
서버를 어디에 둘지 결정한다.
다시말해,
- VPC = 나라 전체
- Subnet = 행정구
자 우리는 지금 나라와 행정구를 나누었다.
이제 나라간 소통을 하려면 인터넷이 필요하고
인터넷은 과연 어떻게 연결되는 것일까?
VPC 와 인터넷은 바로 연결하는 것은 불가능하다.
외부 인터넷과 완전 분리된 사설 네트워크 공간이기에 즉,
보안과 격라를 위해 인터넷과 바로 연결하기는 힘들다.
VPC가 외부 인터넷과 통신할 수 있는 문지기가 있으면 되겠다!
그것이 IGW Internet Gateway
서버를 생성하였다.
외부에서 접근이 불가하고, 반대로 외부로 나가는 것도 불가하다.
이는 매우 안전한 상태가 되었다.
다만 실서비스를 지원하려면 결국 Internet으로 사용자에게 제공해야 한다.
그렇다고 하여도 모든것을 Open 해줄 수 있는것도 아니다
일정 부분 공개 하지 말아야 할 것들이 있을것이다.
필요한 경우에만 외부와 소통할 수 있는 장치가 필요하다.
Internet Gateway는 VPC에 연결된다.
즉, 이말은 하나 하나 Subnet에 연결하는 것이 아닌 그들을 관리하는
전체 VPC 가 연결 된다는 것이다.
다만, 전체에 연결 되었다고 하여서
모든 Subnet이 바로 인터넷과 통신하는 것이 아니다.
VPC에 IGW를 연결하는 것은 단순히
인터넷으로 나가는 출입문 만들기를 한 것
그래서 Subnet 쪽에서 어떤 출입문을 사용할지는 지정이 필요하게 된다.
이때 필요한 개념이 Route Table 이다.
해당 과정을 거치면 Public Subnet이 동작!
Terraform에서는
"어디로 가야 하는지" 를 알려주는 경로 정보가 필요하다.
네트워크의 길안내판 같은 개념이라고 생각해 보자
Subnet 안의 서버가 외부와 통신하려고 할 때,
그 요청이 어디로 나가야 하는지 정해져 있지 않다면
패킷은 목적지를 찾지 못한다.
이런 경로를 미리 정해줘야 한다.
즉 "이 Subnet의 트래픽이 어디로 향할지 결정하는 규칙표"
Route Table은 보통
Destination(목적지) 과 Target(대상) 으로 구성된다.
같은 VPC 내부 주소로 가는 트래픽은 내부에서 처리하고
그 외 모든 외부 요청은 Internet Gateway로 보내라는 뜻이다.
Terraform에서는 aws_route_table 로 경로 규칙을 만들고,
aws_route_table_association 으로 특정 Subnet에 연결한다.
VPC에 인터넷 출입문을 만들고
어떤 Subnet이 그 출입문을 사용할지 정하는 것
private subnet은 보안때문에
외부 인터넷 직접 접근이 불가하게 구성한다.
하지만, private subnet도 외부 인터넷과 통신해야 할 때가 있다.
예를들어
이럴 때 사용하는 것이 NAT Gateway
다만, 외부에서 직접 들어올 수 없게 하는 것 이게 핵심
NAT Gateway는 보통
Public Subnet에 생성된다.
Private Subnet의 Route Table에서
외부로 가는 경로(0.0.0.0/0)를 NAT Gateway로 설정
외부 인터넷과 연결된 상태여야 역할을 할 수 있는데,
Internet Gateway와 연결 가능한 Public Subnet에 위치에 있어야
인터넷 통신이 가능하기 때문
다시말해
Terraform에서는 Public Subnet에 NAT Gateway를 생성하고,
Private Subnet의 Route Table에서 외부 경로를 NAT Gateway로 연결한다.
즉, NAT Gateway는
"Private Subnet 서버의 아웃바운드 인터넷 통신을 위한 구성요소"
라고 이해하면 된다.
인스턴스에 붙는 상태 기반 방화벽
EC2 앞에서 트래픽을 허용/차단 하는 필터
[인터넷]
↓
[Internet Gateway]
↓
[VPC]
↓
[Subnet]
↓
[Security Group]
↓
[EC2]
이 요청을 받아도 되는지 판단!
TCP / 22 / 내 IP
→ “내 컴퓨터만 SSH 접속 허용”
TCP / 80 / 0.0.0.0/0
→ “모든 사람이 웹 접속 가능”
- 허용 규칙만 있음
- 나머지는 전부 자동 차단
👉 외부 → EC2
👉 EC2 → 외부
API 호출
패키지 설치 (apt, yum)
DB 외부 연결
기본적으론 기본값: 전부 허용 이다.
네트워크를 이번에 조금더 다루면서 다음편 부터는
Terraform 을 직접 사용해보려고 합니다.