Amazon VPC 생성하기
이전 글에서 Amazon vpc에 대해서 알아봤습니다.
이번에는 실제로 VPC을 생성하고 서브넷 2개 생성할 것입니다. 또한 해당 VPC와 서브넷을 가진 EC2 인스턴스를 생성해 SSH 연결을 해보려고 합니다.
목차는 다음과 같습니다.
1. VPC 생성하기
1.1 DNS 호스트 네임 활성화
2. VPC 생성과 함께 만들어지는 리소스들
2-1. 라우팅 테이블
2-2. DHCP 옵션 셋
2-3 ACL과 시큐리티 그룹
3. 서브넷 생성
4. 서브넷 위에 EC2 인스턴스 생성
4.1 EC2 인스턴스 연결 시도 실패 확인
5. 인터넷 게이트웨이 만들기
6. 라우팅 테이블에 규칙 추가
VPC의 구성 요소 정리
1. VPC 생성하기
먼저 VPC 서비스 콘솔로 이동하고 VPC 생성 버튼을 클릭합니다.
VPC를 생성할 때 지정해야 할 값은 4가지가 있습니다. 필수적으로 입력해야 하는 값은 IPv4 CIDR 블록 하나입니다. 이 값을 지정할 때는 특별한 이유가 없다면 반드시 사설망 대역 범위 내에서 지정하면 됩니다.
사설 IP로 지정된 대역은 다음과 같습니다.
10.0.0.0 ~ 10.255.255.255 - > A Class(10.0.0.0/8)
172.16.0.0 ~ 172.31.255.255 - > B Class(172.16.0.0/12)
192.168.0.0 ~ 192.168.255.255 - > C Class(192.168.0.0./16)
여기서는 이름 태그를 'my-test-vpc', IPv4 CIDR 블록을 10.0.0.0/16으로 지정하겠습니다. 이렇게 설정하면 'my-test-vpc'란 이름을 가진 vpc 안에서 10.0.0.0 ~ 10.0.255.255의 ip를 사용할 수 있습니다.
VPC가 정상적으로 생성된 것을 확인할 수 있습니다. VPC를 만드는 건 이걸로 끝입니다.
'my-test-vpc' 밑에 있는 VPC는 AWS 계정을 생성할 때 기본적으로 생성된 VPC입니다. 현재 글에서는 사용을 안할 거니 참고하기면 됩니다.
1.1 DNS 호스트 네임 활성화
DNS 관련 설정값을 확인 할 것입니다. 기본 VPC는 DNS 해석(DNS Resolution) 기능과 DNS 호스트네임(DNS hostnames)이 모두 활성화 되어있습니다.
DNS 해석 기능은 DNS 호스트네임을 IP로 해석할 때 AWS에서 제공하는 DNS 서버를 사용하는 기능입니다. 이 기능은 새로 만든 VPC에서도 기본적으로 활성화되어있습니다.
DNS 호스트네임은 VPC 내부에서 생성되는 인스턴스에 퍼블릭 DNS 호스트 네임을 할당해주는 기능입니다. 이 기능인 DNS 해석과 달리 기본적으로 비활성화되어있습니다.
VPC를 선택 > 오른쪽 위의 작업 > 'DNS 호스트네임 편집'을 선택해 이 기능을 활성화해줍니다.
2. VPC 생성과 함께 만들어지는 리소스들
다음으로 VPC 생성과 함께 만들어지는 리소스들을 확인해보겠습니다.
2-1. 라우팅 테이블
이 라우팅 테이블은 실제로는 서브넷과 연결됩니다. 하지만 VPC에도 연결이 되어있는데, 여기에 연결된 라우트 테이블이 VPC에 속한 서브넷을 생성할 때 서브넷과 자동으로 연결됩니다. 해당 대역의 IP가 유입되게 되면 VPC 내에서 리소스를 검색하게 됩니다.
2-2. DHCP 옵션 셋
DHCP 옵션 셋은 도메인 네임 서버, 도메인 네임, NTP 서버, NetBIOS 서버 등의 정보를 가지고 있으며, 보통은 기본값을 사용합니다.
2-3 ACL과 시큐리티 그룹
ACL은 서브넷의 앞단에서 방화벽 역할을 하는 리소스입니다. ACL에는 인바운드와 아운 바운드 규칙이 따로 있습니다. VPC와 함께 생성되는 ACL에는 인바운드와 아웃바운드 규칙 각각 2개의 규칙을 가지고 있습니다. 규칙의 번호는 우선순위를 나타냅니다. 번호가 * 인 규칙은 다른 어떤 룰에도 매치하지 않을 경우 사용하는 기본 규칙입니다. 이미지에서 확인할 수 있듯이 기본 규칙은 모든 트래픽을 차단(Deny) 합니다. 하지만 이 ACL에서는 기본 규칙이 사용되지 않습니다. 왜냐하면 100번 규칙에서 모든 트래픽을 허용(Allow) 하고 있기 때문입니다.
3. 서브넷 생성
VPC만으로는 아무것도 할 수 없습니다. VPC내에서 서브넷을 생성한 후 가용존과 연결을 해야 해당 서브넷에서 EC2 Instance를 생성할 수 있습니다.
VPC 콘솔의 왼쪽 탭에서 서브넷 > 서브넷 생성을 클릭합니다.
- VPC는 앞서 생성한 VPC ID('my-test-vpc')를 찾아서 선택합니다.
- 다음은 가용 영역(Available Zone)을 지정합니다. 서울 리전의 가용존은 a부터 d까지 총 4개가 있습니다. 선호 없음 preference을 지정하면 이 중에 하나가 자동적으로 선택됩니다. 여기서는 ap-northeast-2a를 선택합니다.
- Subnet의 CIDR 블록은 앞서 생성한 VPC('my-test-vpc')의 CIDR 블록보다 작은 CIDR 블럭을 지정해주어야 합니다. 현재 VPC의 IP 범위는 10.0.0.0부터 10.10.255.255까지입니다. (CIDR의 값을 10.0.0.0/16으로 했기 때문) 이 서브넷의 IP 범위는 10.10.0.0부터 10.10.0.255까지 사용하겠습니다. CIDR 블록 표현법으로는 10.10.0.0/24입니다. 생성을 클릭하면 서브넷이 만들어집니다.
같은 방법으로 가용존 ap-northeast-2b, CIDR 블록 10.0.1.0/24을 가진 서브넷을 하나 더 만듭니다.
생성이 완료되면 다음처럼 서브넷 2개가 생성된 것을 확인할 수 있습니다.
서브넷 목록에서 2개의 서브넷이 만들어진 것을 확인할 수 있습니다. 서브넷의 상세 내용을 확인해보면 앞서 VPC와 함께 만들어진 네트워크 ACL과 라우트 테이블이 함께 지정되어있는 것을 확인할 수 있습니다.
서브넷을 2개 만드는 이유
하나의 리전에는 다수의 가용존들이 있습니다. 이 가용 영역은 단순히 가상적으로 분리되어있는 것이 아니고, 물리적인 공간도 분리되어있습니다. 따라서 다수의 가용 영역에 유사한 리소스를 배치함으로써 하나의 가용 영역에 문제가 생기더라도 서비스에 장애가 발생하지 않도록 설계하는 것이 가능합니다.
4. 서브넷 위에 EC2 인스턴스 생성
EC2 생성화면으로 이동합니다.
'네트워크 설정'에서 앞서 만든 VPC를 지정하고, 서브넷은 아무거나 하나를 선택합니다.
이 인스턴스에 외부에서 접속을 하려면 퍼블릭 아이피를 할당할 필요가 있습니다. 따라서 '퍼블릭 IP 자동할당'을 '활성'로 지정합니다
키페 어는 임의로 만듭니다. 저는 'study.pem'으로 만들었습니다.
4.1 EC2 인스턴스 연결 시도 실패 확인
ssh로 인스턴스에 연결을 시도하면 연결이 안 되고 다음처럼 타임 아웃 에러가 발생합니다.
VPC의 서브넷에 속한 인스턴스에 대해 인터넷 송수신 액세스를 활성화하려면 다음 네 가지 조건을 충족해야 합니다. 이 조건에 대해서는 아마존의 공식문서 '인터넷 게이트웨이를 사용하여 인터넷 연결'에서 확인할 수 있습니다.
문제는 첫 번째와 두 번째 조건입니다. VPC와 서브넷을 만들었지만 아직 인터넷 게이트웨이를 만들거나 라우트 테이블에서 연결한 적은 없습니다. 따라서 외부에서 SSH로 접속하는 것도 불가능한 상황입니다. 다음 단계에서는 인터넷 게이트웨이를 만들고, SSH를 통해 이 인스턴스에 접속해보겠습니다.
• 인터넷 게이트웨이를 생성하여 VPC에 연결합니다.
• 서브넷의 라우팅 테이블이 인터넷 게이트웨이를 가리키는지 확인합니다.
• 서브넷의 인스턴스에 전역적으로 고유한 IP 주소(퍼블릭 IPv4 주소, 탄력적 IP 주소 또는 IPv6 주소)가 있는지 확인합니다.
• 네트워크 액세스 제어 및 보안 그룹 규칙에서 적절한 트래픽이 인스턴스로, 그리고 인스턴스에서 흐르도록 허용되는지 확인합니다.
네 가지 조건을 모두 만족해야만 인스턴스에서 인터넷 액세스가 가능하고, 거꾸로 외부에서 SSH에 접속하는 것도 가능해집니다. 먼저 마지막 조건부터 살펴보겠습니다. ACL(네트워크 액세스 제어)의 경우 모든 연결을 허용하고 있기 때문에 조건이 충족되어있습니다. 또한 시큐리티 그룹(보안 그룹) 역시 인스턴스 생성 시 만들어지는 시큐리티 그룹에서 22번 포트를 허용하고 있습니다. 3번째 조건은 퍼블릭 IP 할당을 이야기합니다. 인스턴스 생성 시에 퍼블릭 IP 자동 할당을 활성화했으므로 이 조건 역시 충족합니다.
5. 인터넷 게이트웨이 만들기
VPC와 서브넷을 만들고, 서브넷에 속한 인스턴스도 만들어보았습니다. 하지만 이 인스턴스에 접속하지는 못 하고 있는 상황입니다. 앞서 살펴보았듯이 이 문제를 해결하려면 다음 두 가지 조건을 추가적으로 만족해야합니다.
• 인터넷 게이트웨이를 생성하여 VPC에 연결합니다.
• 서브넷의 라우팅 테이블이 인터넷 게이트웨이를 가리키는지 확인합니다.
VPC 콘솔의 왼쪽 탭에서 인터넷 게이트웨이 > 인터넷 게이트웨이 생성을 클릭합니다.
이름과 태그를 다음과 같이 설정합니다.
생성된 인터넷 게이트웨이는 연결되지 않음(Detached) 상태입니다.
작업 버튼을 클릭하고 VPC 연결을 선택합니다. 앞서 만든 VPC를 선택하고 연결을 클릭합니다.
이제 VPC와 인터넷 게이트웨이가 연결되었습니다.(Attached)
6. 라우팅 테이블에 규칙 추가
서브넷의 라우팅 테이블이 인터넷 게이트웨이를 가리키도록 할 것입니다.
라우팅 테이블 목록에서 서브넷에 연결된 라우팅 테이블을 찾습니다.
라우팅 탭을 선택하면 VPC 내부 연결을 위한 규칙(local)만 있는 것을 확인할 수 있습니다.
라우트 편집을 클릭하고 라우트 추가를 클릭합니다.
왼쪽에서 첫 번째 대상(목적지)은 0.0.0.0/0으로 지정하고 두 번째 대상(타깃)은 앞서 생성한 인터넷 게이트웨이의 ID를 지정합니다. 라우팅 저장 버튼을 클릭합니다.
라우트 규칙은 위에서부터 차례대로 적용됩니다. 첫 번째 규칙은 VPC CIDR 범위의 접근에 대해서 VPC 내부로 라우트 하는 규칙입니다.
두 번째 규칙은 그 이외의 모든 IP 접근(0.0.0.0/0은 모든 IP를 의미합니다)에 대해서 인터넷 게이트웨이로 라우트하는 규칙입니다.
이제 모든 조건을 만족했습니다. 다시 ssh를 사용해 이전에 만들었던 인스턴스에 다시 접속해봅니다.
타임아웃 에러가 발생하지 않고 연결이 잘되는 것을 확인할 수 있습니다.
앞서 살펴본 VPC 구성 요소를 정리해보겠습니다.
VPC의 구성 요소 정리
- 1 VPC
- n 서브넷 (Subnet)
- 1 라우트 테이블 (Route Table)
- 1 네트워크 ACL (Network ACL)
- 1 시큐리티 그룹 (Security Group)
- 1 인터넷 게이트웨이(Internet Gateway)
- 1 DHCP 옵션 셋 (DHCP options set)