AWS VPC는 AWS의 클라우드 컴퓨팅 환경에서 가상으로 구성된 사설 네트워크입니다.
가상의 네트워크인 VPC 공간 내에 가상 서버, 데이터베이스, 스토리지 등의 AWS 리소스를 구성할 수 있습니다.
VPC는 하나의 Region 내에만 생성할 수 있으며, 여러 Region에 걸쳐 VPC를 구성하는 것은 불가능합니다. 일반적으로 가용성을 위해 최소 2개 이상의 AZ를 사용하여 VPC를 구성합니다.
Region(리전)
- AWS 서비스들이 제공되는 서버의 물리적인 위치
- 네트워크 속도를 위해 서비스하려는 지역과 가까운 Region을 선택하여 인프라를 구성하는 것이 중요
- 각 Region은 고유 코드를 가짐
- ex) 서울 Region : ap-northeast-2
AZ(Availability Zone, 가용영역)
- 각 Region 내의 데이터 센터
- 기본적으로 Region은 최소 2개 이상의 AZ를 가짐
- 재난 대응을 위해 각 Region의 AZ들은 물리적으로 일정 거리 이상 떨어져 있음
서울 Region은 목동, 일산, 용인, 평촌에 AZ가 있다는 썰이..
VPC 대시보드로 이동하여 VPC를 구성해봅시다. VPC 생성 전 Region을 꼭 확인해줍니다.
AWS 각 Region에는 기본 VPC가 제공됩니다. VPC 생선 전 확인할 수 있는 1개의 VPC가 바로 기본 VPC입니다. 기본 VPC를 사용하지 않고, 자체 VPC를 생성하여 네트워크를 구성해보겠습니다. [VPC 생성] 을 클릭해줍니다.
VPC 생성 화면입니다. Subnet은 뒤에서 따로 생성해줄 예정이니 [VPC만] 생성해주도록 하겠습니다.
IPv4 CIDR은 10.0.0.0/16으로 작성해주었습니다.
참고로 AWS는 사설 IP 대역으로 RFC1918을 권고합니다.
RFC1918
- 국제 인터넷 표준화 기구(IETF)에서 공포한 표준으로, 지정된 IP주소를 사설망으로 규정하고 해당 IP 주소들은 공인망으로 사용하지 않기로 한 원칙
- 10.0.0.0/8 : 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0/12 : 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0/16 : 192.168.0.0 ~ 192.168.255.255
VPC DNS 관련 설정을 편집해주겠습니다. 설정을 변경할 VPC를 선택하고, [VPC 설정 편집] 버튼을 클릭해줍니다.
신규 생성한 VPC에는 DNS 해석 기능은 활성화 되어 있고, DNS 호스트 이름 기능은 비활성화 되어있습니다. DNS 호스트 이름 기능까지 활성화 해주겠습니다. 참고로, DNS 확인 기능은 DNS 호스트 이름을 IP로 해석할 때 AWS에서 제공하는 DNS 서버를 사용하는 기능이며, DNS 호스트 이름 기능은 VPC 내 생성되는 인스턴스에 대해 Public DNS 호스트 이름을 할당해주는 기능입니다.
Subnet은 VPC의 IP 주소를 나누어 리소스가 배치되는 주소 범위입니다. VPC 내에 존재하며 실제로 리소스가 생성될 수 있는 네트워크 영역입니다.
각 Subnet은 단일 AZ 내에서만 존재해야하며, 여러 AZ에 걸쳐서 Subnet을 생성할 수 없습니다.
Subnet의 유형에는 Public Subnet과 Private Subnet이 있습니다.
Public Subnet
Subnet에 Internet Gateway로 직접 연결되는 경로가 있습니다. 따라서 Public Subnet 내 Public IP를 할당받은 리소스는 인터넷과 통신할 수 있습니다.
Private Subnet
Subnet에 Internet Gateway로 직접 연결되는 경로가 없습니다. 따라서 VPC 내 인스턴스들과의 통신만 가능합니다. NAT Gateway를 통해 인터넷으로 패킷을 보냈다 돌아올 순 있지만, 인터넷에서 Subnet으로 직접적으로 Inbound할 수 없습니다.
앞서 구성한 VPC 내에 Public Subnet 2개, Private Subnet 2개를 구성해보겠습니다. Subnet 목록을 확인하면 기본 VPC 내에 구성되어있던 Subnet들을 확인할 수 있습니다. [서브넷 생성] 버튼을 클릭하여 생성 대시보드로 이동합니다.
현재까지의 구성도는 아래와 같습니다. (아직 Internet Gateway를 생성하여 Routing Table에 등록해주지 않았으니, Public Subnet은 이름만 Public이라고 할 수 있겠습니다.)
Routing Table은 VPC 내에서 발생한 네트워크 요청에 대해 어디로 트래픽을 전달해야하는지 알려주는 이정표와 같은 역할을 수행합니다. 각각의 Subnet들은 연결된 Routing Table에 따라 요청을 전달할 장소를 정하게 되는 것이죠.
VPC를 생성하게 되면 자동으로 Routing Table이 생성됩니다.
해당 Routing Table에는 아래와 같은 규칙이 생성되어 있는데요. 해당 규칙은 VPC 내부의 모든 Subnet들끼리의 통신을 가능하게 해주는 규칙입니다. 10.0.0.0/16 대역의 요청에 대해서는 VPC 내 Local Routing을 수행하는 것이죠.
그렇다면 Local망에서 통신을 수행하는 것이 아닌, 인터넷망과 통신을 수행하려면 어떻게 해야할까요? 바로 Internet Gateway를 구성해주면 됩니다.
Internet Gateway는 VPC 내 리소스와 인터넷 간의 통신을 가능하게 해줍니다. VPC는 기본적으로 격리된 사설망이기 때문에 Internet Gateway 없이는 인터넷을 사용할 수 없습니다. Internet Gateway가 VPC와 인터넷 사이의 통로 역할을 수행해줍니다.
앞서 Subnet을 설명하면서, Internet Gateway와 연결된 Subnet을 Public Subnet이라고 부르며, Public Subnet 내 리소스들은 인터넷과 통신할 수 있다고 설명했었습니다. Internet Gateway와 연결되지 않은 Subnet을 Private Subnet이라고 부른다고 했고요. 이를 표현하면 아래 그림과 같이 이해해볼 수 있습니다.
그렇다면 Private Subnet에서 인터넷 연결이 필요한 경우에는 어떻게 해야할까요? 예를 들어 보안이 중요한 데이터베이스를 Private Subnet 안에 구성해두었다면, 데이터베이스 업데이트를 위해서는 인터넷 연결이 필요한 경우가 있을 것입니다. 이런 경우 NAT Gateway를 사용하면 됩니다.
NAT Gateway는 네트워크 주소 변환(Network Address Translation, NAT)을 통해 Private Subnet에서 인터넷 또는 기타 AWS 서비스에 연결할 수 있도록 하는 Gateway 입니다. 외부 서비스에서 Private Subnet의 인스턴스로 접근은 할 수 없지만, Private Subnet 내 인스턴스에서는 NAT Gateway를 통해 외부 서비스로 접근할 수 있습니다.
Internet Gateway 목록을 확인해보면 기본 VPC의 Internet Gateway가 존재합니다. 저희가 새로 만든 VPC에 연결해줄 Internet Gateway를 신규 생성해보겠습니다. [인터넷 게이트웨이 생성]을 클릭합니다.
이름 태그를 작성한 후 IGW를 생성해줍니다.
생성 후 목록을 확인해보면, IGW의 상태가 Detached로 뜨는 것을 확인할 수 있습니다. 이제 IGW를 VPC에 연결해주도록 하겠습니다.
VPC에 연결할 IGW를 선택하고, [작업] - [VPC에 연결]을 클릭해줍니다.
각 VPC에는 1개의 IGW만 연결이 가능합니다. 기본 VPC에는 이미 IGW가 연결되어 있어, 사용 가능한 VPC 목록에 뜨지 않는 것을 확인할 수 있습니다. IGW를 연결할 VPC를 선택한 후 연결 버튼을 클릭해줍니다.
신규 생성한 IGW의 상태가 Attached로 변경된 것을 확인할 수 있습니다.
VPC 로컬망 내에서 Subnet끼리의 통신을 위한 Routing Table은 이미 생성되어 있었습니다. 이번엔 외부 인터넷과의 통신을 위한 Public Routing Table을 생성해보겠습니다.
구분을 위해 기존에 있었던 기본 Routing Table은 Local이라는 이름으로 Name Tag를 달아주었습니다. Local Routing만 필요한 Subnet들은 Local Routing Table에 연결하고, 외부 인터넷과의 통신까지 필요한 Subnet들은 Public Routing Table에도 연결해줄 것입니다.
이름만 Public으로 지었다고 해서 Public Routing Table이 아니겠죠. Internet Gateway를 Routing Table과 연결해주어야 합니다.
Public으로 Name Tag를 붙인 Routing Table을 선택하고 [라우팅 편집] 버튼을 클릭합니다.
아래와 같이 Routing Table에 Internet Gateway를 연결해줍니다.
발생하는 모든 트래픽에 대해
라는 의미의 Routing Table입니다.
마지막으로 Public Routing Table에 Public Subnet으로 만들어줄 Subnet들을 연결해줍니다.
이번엔 NAT Gateway를 생성하고 Private Routing Table에 NAT Gateway를 위한 라우트를 정의해주겠습니다. [NAT 게이트웨어 생성]을 클릭해줍니다.
NAT Gateway는 반드시 Public Subnet에 위치해있어야 합니다. 또한 탄력적 IP(Elastic IP)를 생성하여 NAT Gateway에 할당해주어야 합니다.
이를 통해 Private Subnet 내 인스턴스들은 Public IP를 갖지 않지만, 외부 인터넷으로 나갈 때 NAT Gateway의 Elastic IP로 NAT(네트워크 주소변환)되어 나가게 되어 인터넷에 접속할 수 있게 됩니다.
NAT Gateway를 생성했으니 이제 private subnet의 라우팅 테이블의 설정을 변경해주겠습니다.
Private Subnet의 라우팅 테이블을 보면 다음과 같이 내부 트래픽에 대해서만 local로 보내라는 테이블만 설정되어 있습니다.
라우팅 편집을 통해, 0.0.0.0/0 즉 모든 패킷을 NAT Gateway로 보내라는 테이블을 추가해주겠습니다.
정리하자면, 공인 인터넷(0.0.0.0)에 대해서는 NAT Gateway가 있는 Public Subnet으로 이동하여 Elastic IP(공인 IP)로 주소를 변환한 후 Internet Gateway를 통해 공인 인터넷으로 나아가게 됩니다.
[AWS] 📚 VPC 개념 & 사용 - 인프라 구축 [Subnet / Routing / Internet Gateway]