이번 글에서는 AWS VPC를 직접 생성하고, 퍼블릭 서브넷을 추가한 뒤 AWS EC2 인스턴스를 외부에서 접근할 수 있도록 설정하는 과정을 다뤄보려고 한다.
AWS 콘솔창에서 VPC
를 검색해 들어간다.
[VPC 생성] 클릭
생성할 리소스는 VPC만
옵션을 선택
VPC 등
을 선택하면 서브넷, 라우팅 테이블 등이 자동으로 같이 만들어지는데 하나씩 직접 구성해보는 것이 목적이므로VPC만
으로 설정
VPC 이름을 입력하고 IPv4 CIDR 블록은 수동 입력
→ 10.0.0.0/16
범위를 사용한다.
10.0.0.0/16
은 사설 IP 대역 중 가장 넓은 범위로, 나중에 서브넷을 다양하게 나누기에도 좋다.
다른 옵션은 기본값을 유지하고 [VPC 생성] 클릭
그러면 생성된 VPC의 정보를 확인할 수 있다.
VPC 리소스 맵을 보면 아직 아무것도 연결되지 않은 상태다.
생성한 VPC를 EC2에 연결하기 위해서 일단 임의의 EC2를 생성한다.
네트워크 설정 오른쪽의 [편집]을 클릭하여, 방금 생성한 VPC로 지정한다.
서브넷을 선택하려 하면, 서브넷을 찾을 수 없다고 뜬다.
오른쪽의 [새 서브넷 생성] 링크를 클릭해, 서브넷을 생성해보자.
서브넷 생성 창에서 먼저 VPC가 제대로 선택되었는지 확인한 뒤, 서브넷 이름을 정해준다.
여기서 가용 영역(AZ) 개념을 알아야 한다.
가용 영역(Availability Zone, AZ)
하나의 리전(예: 서울 ap-northeast-2) 안에 여러 개 존재하는 독립된 인프라 구역
- 같은 리전이더라도 a, b, c, d 같은 AZ로 나뉜다.
- AZ는 서로 물리적으로 분리돼 있어 하나의 AZ가 문제가 생겨도 다른 AZ는 정상 운영된다.
- 트래픽을 분산하거나 장애 대비 이중화할 때 중요하다.
→ 같은 리전 내 다른 AZ에 리소스를 분산하면 한쪽이 장애가 나더라도 다른 쪽에서 서비스 유지가 가능하다.📌 TMI: 나한테 보이는
ap-northeast-2a
가 다른 사람한텐2b
일 수도 있다. (AWS가 균등 분산을 위해 내부 매핑을 다르게 함)
서브넷 네이밍의 경우에는 주로 환경(dev, prob 등), 서비스명(web, api 등), 가용 영역(AZ), 용도(public/private)을 포함한다.
접미사로 subnet을 포함하는 경우도 있다.
환경은 생략하고 서비스명(예시로 sb), 가용 영역(a), 용도(public), 접미사를 포함해 서브넷 이름을 지었다.
CIDR 블록은 10.0.1.0/24
로 입력
→ 256개의 IP를 할당할 수 있다.
다른 가용 영역 b에 대해서도 서브넷을 추가하기 위해 [새 서브넷 추가] 클릭
위와 마찬가지로 입력한다.
[서브넷 생성] 클릭
리소스 맵을 보면, 생성한 서브넷들이 VPC와 연결된 걸 확인할 수 있다.
다시 EC2 인스턴스 생성으로 돌아가, 이제 퍼블릭 서브넷을 EC2 인스턴스에 지정해서 만들어보자.
그런데 인스턴스를 생성해도 아래와 같은 경고 메시지가 뜰 수 있다.
이는 인터넷 게이트웨이(IGW)와 연결이 되어 있지 않아서 생기는 문제다.
인터넷 게이트웨이(Internet Gateway, IGW)
VPC 내부 리소스가 외부 인터넷과 통신할 수 있도록 연결해주는 관문
- IGW는 VPC에 1:1로만 연결 가능하다.
- EC2에 퍼블릭 IP를 붙였다고 해도, IGW 없이 외부 통신은 불가능하다.
VPC 사이드탭의 [인터넷 게이트웨이] 클릭 후 [인터넷 게이트웨이 생성] 클릭
이름을 적당히 지정해 준 후 [인터넷 게이트웨이 생성] 클릭
인터넷 게이트웨이를 생성했으면 알림이 뜨는데, [VPC에 연결]을 클릭한다.
사용할 VPC를 선택 후 [인터넷 게이트웨이 연결]
하지만 아직 서브넷과 IGW는 연결되지 않은 상태다.
이 둘을 이어주는 게 바로 라우팅 테이블이다.
라우팅 테이블(Routing Table)
트래픽이 어디로 가야 할지 결정하는 길 안내판
- 서브넷 내부의 트래픽이 어디로 가야 하는지를 결정해주는 설정표
- 기본적으로 VPC 내부 통신은 자동(local)으로 되어 있다.
- 외부와 통신하려면 명시적으로
0.0.0.0/0 → 인터넷 게이트웨이
경로를 추가해줘야 한다.🎯 서브넷이 어떤 라우팅 테이블을 사용하는지가 중요하다.
→ IGW 연결만 해두고, 라우팅 테이블에 반영하지 않으면 인터넷 접속은 안 된다.
VPC 사이드바의 [라우팅 테이블] 클릭 후 [라우팅 테이블 생성]
→ 이름은 public-rt
처럼 직관적으로
생성된 라우팅 테이블의 [서브넷 연결] 탭을 확인해보면 명시적 서브넷 연결이 아직 없는 걸 확인할 수 있다.
참고
명시적 연결이 없는 서브넷의 경우, VPC 생성 시에 자동으로 생성되는 default 라우팅 테이블에 연결된다.
명시적 서브넷 연결 옆의 [서브넷 연결 편집] 클릭
퍼블릭 서브넷에 대해 [연결 저장]
위 작업은 서브넷 - 라우팅 테이블에 대한 연결이고, 다음은 인터넷 게이트웨이와 라우팅 테이블을 연결해줘야 한다.
기본적으로 10.0.0.0/16
에 대해 local 라우팅이 설정되어 있는데,
이는 10.0.0.0/16
(VPC 범위)에 대해 VPC 내부끼리는 local(VPC 내부)로 라우팅
=> 한마디로 VPC 내부에서는 서로 소통 가능
0.0.0.0/0
이제 외부 인터넷과의 통신 경로가 생겼다.
VPC 리소스 맵을 보면 모든 구성 요소가 잘 연결된 걸 확인할 수 있다.
EC2 콘솔로 돌아가 다시 연결해보면… 경고 없이 접속 성공!
구성된 전체 구조를 시각화하면 아래와 같다.