AWS에서 애플리케이션을 작동하게 인프라를 구축하겠습니다.
VPC는 AWS에서 네트워크를 구축할때 VPC(Amazon Virtual Private Cloud)를 이용합니다. 그림을 그릴 때 그림판 같은 존재라고 볼 수 있습니다. VPC 안에 네트워크 장비에 해당하는 리소스를 추가해나가면 됩니다.
VPC 대시보드에서 Create VPC를 누르고 다음과 같이 설정해 줍니다.
설정을 완료 후 create VPC를 누르면 VPC가 생성된 것을 볼 수 있습니다.
VPC가 만들어진 현재 아키텍쳐는 다음과 같습니다.
VPC 안에는 하나 이상의 서브넷을 만드어야 합니다. 서브넷은 VPC의 IP 주소 범위를 나누는 단위 입니다. IP 주소를 나누어하는 이유는 두가지로 하나는 역할 분리, 다른 하나는 기기 분리 입니다.
역할 분리는 어떤 리소스를 공개하고 공개 하지 않을지 정한 후, 용도에 맞게 나누어 담기 위해서 하게 됩니다. 공개가 가능한 Public subnet과 공개가 불가능한 Private subnet으로 나누게 됩니다.
기기 분리는 안정성을 높게 하기 위해 설정하고, 리전 안에서 서로 독립된 가용영역(availability zone)을 두어 설정합니다. 이렇게 되면 한쪽 가용영역에 문제가 발생했을 때도 독립된 다른 가용영역에서 그 역할을 수행하면 되기 때문에 안정성이 높습니다.
위 그림과 같이 가용 영역을 나누고 서브넷을 생성하겠습니다.
VPC 대시보드에 subnet 칸에서 Create subnet을 통해 생성합니다.
VPC ID에서 위에서 만든 sample-vpc를 선택하고 퍼블릭 서브넷 2 프라이빗 서브넷 2를 만듭니다.
퍼블릭 서브넷 1
이름 : sample-subnet-public01
가용 영역 : ap-northeast-2a
IPv4 CIDR 블록 : 10.0.0.0/20
퍼블릭 서브넷 2
이름 : sample-subnet-public02
가용 영역 : ap-northeast-2c
IPv4 CIDR 블록 : 10.0.16.0/20
프라이빗 서브넷 1
이름 : sample-subnet-private01
가용 영역 : ap-northeast-2a
IPv4 CIDR 블록 : 10.0.64.0/20
프라이빗 서브넷 2
이름 : sample-subnet-private02
가용 영역 : ap-northeast-2c
IPv4 CIDR 블록 : 10.0.80.0/20
위 정보를 기반으로 서브넷을 4개 모두 생성하면 다음과 같이 서브넷이 완성된 것을 볼 수 있습니다.
서브넷이 생성된 후 아키텍쳐는 다음과 같습니다.
인터넷 게이트 웨이의 역할은 'VPC에서 생성된 네트워크와 인터넷 사이의 통신을 수행하는 것' 입니다. VPC를 만들고 그 안에 리소스를 담았다면 이를 인터넷과 통신시키기위해 인터넷 게이트 웨이를 생성합니다. 인터넷 게이트웨이를 생성하고 앞서 만든 VPC에 연결합니다.
인터넷 게이트웨이를 생성, 연결을 완료했을 시 아키텍쳐는 다음과 같습니다.
인터넷 게이트웨이를 연결했기 때문에 VPC는 인터넷과 연결이 가능하고, 인터넷과 직접 통신하기 위해서는 공개 IP를 가져야 합니다. 하지만 여러가지 이유로 외부에서 접근하지 못하게 하도록 만든 프라이빗 서브넷이 존재합니다. 따라서 프라이빗 서브넷에 생성된 리소스는 인터넷으로 내보낼 수 있지만 반대로 인터넷에서는 접근하지 못하게 해야합니다.
이런 요구 사항을 구현하기 위해 NAT라는 네트워크 주소 변환 시스템이 있습니다. NAT 게이트웨이를 통해 프라이빗 IP만 존재하는 상태에서 프라이빗 IP + 퍼블릭 IP를 포함한 정보로 변경시킬 수 있습니다.
그럼 각 퍼블릭 서브넷에 NAT 게이트웨이를 만들어보겠습니다.
VPC 대시보드의 NAT 게이트웨이 에서 NAT 게이트웨이 생성을 클릭합니다.
NAT게이트 웨이 생성 페이지에서 게이트웨이의 이름, 게이트웨이를 생성할 서브넷, Elastic IP 할당 까지 설정합니다. (두 퍼블릭 서브넷에 같은 방법으로 게이트웨이를 생성합니다.)
NAT 게이트웨이까지 생성 완료했다면 아래 그림과 같은 아키텍쳐를 생성했고 어떻게 작동하는지 볼 수 있습니다.
인터넷 게이트웨이와 NAT 게이트웨이를 생성해서 리소스가 인터넷과 통신할 수 있게 되었습니다. 하지만 서브넷과 서브넷, 서브넷과 게이트웨이가 통신하기 위한 경로를 만들어 주어야 합니다. 이를 위해 라우팅 테이블을 만들고, 라우팅 테이블은 '이 서버에 접속할 때 이 곳을 경유한다.'는 규칙을 생성합니다.
퍼블릭 서브넷용 라우팅 테이블 1개, 프라이빗 서브넷용은 각각 2개를 만듭니다.
생성된 라우팅 테이블을 클릭하고 '라우팅' -> '라우팅 편집'을 통해 라우팅을 추가 합니다. 그리고 대상에 '0.0.0.0/0'과 앞서만든 인터넷 게이트웨이를 선택합니다.
다시 라우팅 테이블 페이지에서 방금 만든 'sample-rt-public'을 선택하고 '서브넷 연결'->'서브넷 연결 편집'을 누른 후 퍼블릭 서브넷 두개를 선택하고 '연결 저장'을 클릭 합니다.
프라이빗 서브넷을 만들땐 위와 같은 과정을 반복하되 아래의 내용으로 만들어 줍니다.
이름 : sample-rt-private01
라우팅-로컬 송신대상지: 10.0.0.0/16
라우팅-로컬 타겟: Local
라우팅-외부 송신대상지: 0.0.0.0/0
라우팅-외부 타겟: sample-ngw-01
서브넷: 프라이빗 서브넷1
이름 : sample-rt-private02
라우팅-로컬 송신대상지: 10.0.0.0/16
라우팅-로컬 타겟: Local
라우팅-외부 송신대상지: 0.0.0.0/0
라우팅-외부 타겟: sample-ngw-02
서브넷: 프라이빗 서브넷1
VPC에 다양한 리소스를 생성할 준비가 끝났지만 지금 상태는 인터넷을 통해 모든 리소스에 접근할 수 있는 상태입니다. 따라서 VPC 안에 리소스를 보호하기 위해 외부로부터 접근에 제한을 걸 것이고 그 역할을 하는 보안 그룹을 생성합니다.
이 두가지 보안그룹을 아래의 내용으로 만들어 줍니다.
보안 그룹 이름 : sample-sg-bastion
VPC : sample-vpc
인바운드 규칙 : 유형=SSH, 소스=0.0.0.0/0
보안 그룹 이름 : sample-sg-elb
VPC : sample-vpc
인바운드 규칙 : 유형=HTTP, 소스=0.0.0.0/0
유형=HTTPS, 소스=0.0.0.0/0
여기까지 완료했다면 아래와 같은 아키텍쳐이고, 서버를 구축할 '네트워크'를 다 만들었다고 할 수 있습니다.