
오늘의 주제는 바로 AWS이다.
예전에도 AWS를 공부해보고 싶어 이것 저것 시도해보았지만 악랄한 아마존의 요금 폭탄과 EC2 생성에서 마주치는 알아들을 수 없는 설정값 때문에 잠시 거리를 두기로 했었다.
(저 로고의 웃는 모습이 약오른다.)
그러던 중 최근 비용 걱정 없이 AWS를 사용해 볼 기회가 생기게 되었다.
이 포스팅에서는 내가 AWS 인프라를 E2E로 구축하며 공부하고 배운 것을 누군가에게 나누어 보려고 한다.
AWS가 뭔지부터 설명하지는 않을 것이다.
제목에서도 나타나듯이 EC2 생성하다가 머리아파서 잠시 AWS와 멀어진 사람들을 위한 포스팅이니 기본적으로 AWS와 EC2가 뭔지는 알고 오면 좋을 것 같다.
공부를 시작한지 1주일 밖에 지나지 않아 부족한 점도 많겠지만 최대한 내가 이해한 대로 설명해보도록 하겠다.
내가 처음 AWS를 접했을 때 가장 어렵고 복잡했던 것은 무수히 많은 서비스들과 설정 지옥이었다.
간단한 EC2 하나 띄우는 데에도 설정해줘야 하는 것들이 뭐 그리 많은지..
그리고 참고한 블로그 글들과 현재의 GUI 버전이 달라 너무 헷갈렸다.
이 포스팅에서는 단순히 EC2를 생성하는 것이 아닌 전체 인프라를 이해하고 구축하는 것을 목표로 하기 때문에 네트워크부터 먼저 설명해보고자 한다.
가장 먼저 알아야 하는 키워드는 Virtual Private Cloud (VPC)이다.
VPC에 대한 설명을 먼저 하는 이유는 이 서비스가 가장 바깥쪽의 그릇 역할이기 때문이다.
큰 개념부터 시작하여 점점 세부적으로 들어가보자.
VPC는 퍼블릭 클라우드 내에 존재하는 논리적으로 격리된 프라이빗 네트워크이다.
쉽게 말해 AWS에서 제공해주는 개인 가상 내부망이라고 이해하면 된다.
기본적으로 사용자가 생성하는 리소스는 대부분 VPC 안에 들어가게 된다.
물론 예외는 있긴 하지만 그건 뒤에서 설명하도록 하겠다.
만약 당장 이해가 가지 않는다면 EC2 같은 리소스를 담을 가장 바깥쪽의 보따리라고 생각하고 넘어가자.
Region과 Availability Zone 개념에 대해서도 연관되어 있지만 이 글에서는 논리적인 개념을 이해하는 것을 목표로 하기에 따로 설명하지 않겠다. 만약 관심이 있으면 개인적으로 찾아보길 바란다.

위 사진은 AWS Docs에서 VPC를 설명할 때 나오는 그림이다.
VPC 안에 Subnet들과 Instances들이 들어가 있는 것을 볼 수 있다.
아까 VPC는 프라이빗 네트워크라고 이야기했었다.
이 말은 기본적으로 외부 인터넷과 격리된 상태라는 것이다.
이 VPC와 그 안의 EC2들이 인터넷과 연결되기 위해서는 Internet Gateway (IGW)가 필요하다.
IGW는 가장 쉽게 말해 구멍을 뚫어주는 것이다.
아까 VPC를 보따리에 비교한 것을 기억하는가?
보따리 안(VPC)에서 바깥 세상(인터넷)과 상호작용을 하려면 입구를 열어야 하는 것과 같이 VPC도 인터넷에 접근하려면 입구가 필요하다.
그러나 여기서 주의할 점은 IGW가 생긴다고 해서 자동으로 인터넷으로 연결이 되는 것은 아니다.
실제로 인터넷에 연결하기 위해서는 몇 가지 조건이 더 필요하다. 이건 밑에서 설명하겠다.
지금은 그냥 입구 혹은 구멍 정도로 이해하면 된다.
IGW는 VPC에 붙이는 것이다. 당연한 이야기다! 구멍은 보따리에 뚫는 것이니까.
여기까지의 결론
AWS 인프라를 생성하려면 먼저 VPC부터 만들면 된다.
그리고 인터넷 통신이 필요하다면 그 VPC에 IGW를 만들어서 붙여라!
VPC를 생성하고 IGW를 붙였다면 이제 Subnet을 만들 차례다.
서브넷은 VPC의 IP 주소 범위를 더 작은 단위로 분할한 논리적 네트워크 세그먼트이다.
쉽게 말해 VPC라는 보따리 안의 짐들을 비닐봉지로 서로 묶는 것이다.

사실 서브넷이란 개념은 네트워크에서 중요하고 유명한 개념이다.
네트워크를 공부했던 사람이라면 익숙한 서브넷 마스크부터 시작하여 CIDR 개념까지 모두 다루려면 끝이 없기에 이건 네트워크 시간에 따로 공부하기로 하고 지금은 AWS의 네트워크 구조에서의 서브넷을 다뤄보자.
서브넷을 생성하는 이유에는 몇 가지가 있지만 가장 큰 목적은 네트워크 분리이다.
외부(인터넷)에서 접근할 수 있는 네트워크와 외부에서 접근할 수 없는 네트워크를 분리하거나 역할별로 네트워크를 분리할 수 있다. 또한 위에서 넘어갔던 AZ 분리도 중요한 목적 중 하나다.
서브넷은 크게 2가지로 나눌 수 있다. 바로 Public Subnet과 Private Subnet이다.
정확한 정의로는 Public Subnet은 IGW가 존재하는 VPC상에 있고 라우팅 테이블에 0.0.0.0/0 -> IGW 규칙이 있는 서브넷이고 Private Subnet은 그 규칙이 없는 서브넷이다.
아까 위에서 IGW를 생성한다고 자동으로 인터넷에 연결되는 것이 아니라고 말한것을 기억하는가?
인터넷에 연결되기 위해서는 IGW가 존재해야 하고 Public Subnet 즉, 라우팅 테이블에 0.0.0.0/0 -> IGW 규칙이 있어야 한다. 그러나 아직 인터넷에 연결되기 위해서는 몇 가지 조건이 더 필요하다. 이건 밑에서 차차 설명하도록 하겠다.
여기까지의 결론
VPC 내부에는 Subnet을 설정할 수 있다!
Subnet에는 Route Table을 연결할 수 있다!
Route Table의0.0.0.0/0 -> IGW규칙 유무에 따라 Public/Private 서브넷이 나눠진다.
외부에서 접근 가능한 인스턴스를 만들기 위해서는 그 인스턴스를 식별할 수 있는 Public IP가 필요하다.
어떤 인스턴스가 Public IP를 가지는 방법은 2가지가 있다.
첫 번째는 EC2 생성 시 설정을 통해 부여하는 것이다.
두 번째는 Elastic IP(EIP)를 연결하는 것이다.
여기서 Elastic IP (EIP)는 고정된 공인 IP라고 보면 된다.
기본 Public IP는 인스턴스를 중지/재시작하면 변경될 수 있지만, EIP는 계속 유지된다.
그렇다면 이제 EC2를 인터넷에 연결시키기 위한 준비가 모두 끝났다.
0.0.0.0/0 -> IGW 규칙이 있고 (=Public Subnet이고)(보안 설정도 필요하지만 여기서는 제외하겠다. 보안 설정은 추후 설명하겠다.)
위 3개의 조건이 만족한다면 이제 외부에서 접근 가능한 인스턴스를 생성한 것이다.
여기까지의 결론
인스턴스에는 Public IP를 붙일 수 있다!
EC2 생성 시 설정하거나 EIP를 연결하여 붙이는 방법이 있다!
이제 Public Subnet에 있는 EC2는 인터넷을 사용할 수 있게 되었다.
그렇다면 Private Subnet은 인터넷을 사용하지 못하는 것일까?
Private Subnet에서도 Docker Hub에서 이미지를 pull하거나 apt install로 패키지를 설치하는 경우가 있을 수 있다.
이때 사용하는 것이 NAT Gateway이다.
NAT Gateway는 Private IP를 Public IP로 변환해서 외부와 통신하게 해주는 장치이다.
이를 이용하면 외부에서 내부로의 접근은 불가능하지만 내부에서 외부로 요청하고 응답을 받는 것은 가능한 시스템을 만들 수 있다.
즉, 아웃바운드만 가능한 구조라고 이해하면 된다.
Private Subnet에 있는 EC2가 외부로 요청을 보낼 때, NAT Gateway를 통해 트래픽이 나가게 된다.
NAT Gateway는 Public Subnet에 생성되어야 하며, Elastic IP를 가진다.
그리고 Private Subnet의 Route Table에는 0.0.0.0/0 → NAT Gateway 규칙이 필요하다.
이렇게 설정하면 Private Subnet에 있는 인스턴스도 NAT Gateway를 통해 외부로 나갈 수 있게 된다.
여기까지의 결론
Private Subnet에서 인터넷을 사용하려면 NAT Gateway를 사용하면 된다!
NAT Gateway는 Public Subnet에 생성해야 한다!
인터넷을 사용하려는 Subnet의 Route Table에는0.0.0.0/0 → NAT Gateway규칙이 필요하다.
지금까지 기본적인 네트워크 설정과 인스턴스 접근 방법을 설명했다.
만약 여기까지 잘 따라왔다면 아래의 개념들을 이해하고 있을 것이다.
이제 기본적인 트래픽의 흐름을 알았으니 다음 글에서는 흐름을 제어하는 보안 설정에 대해 알아보겠다.
원래 하나의 글로 작성하려 했지만 생각보다 내용이 많아져 분리하게 되었다.
다음 글에서는 보안 설정과 SSM, Route53, S3 등을 설명할 예정이다.