AWS 네트워크 구축하기

Amazon VPC(Virtual Private Cloud)로 가상 네트워크를 구축해봅시다.

Posted by Juri on May 8, 2022

책 ‘Amazon Web Services로 시작하는 클라우드 입문’, 영진닷컴 을 참고했습니다.

VPC(Virtual Private Cloud)란?

VPC는 AWS에서 가상 네트워크를 생성하기 위한 서비스로 네트워크 요건에 근거한 IP 주소 범위의 선택과 서브넷 생성, 가상 라우터의 라우팅 기능, 게이트웨이 설정 등의 기능을 사용하여 클라우드상에 임의의 네트워크를 구축할 수 있다.

VPC가 없었을 때는 클라우드에 있는 리소스를 격리할 수 있는 방법이 없었다. 예를 들어, 수천 대의 서버를 클라우드에 배포한 경우 IP 네임스페이스를 정확히 관리해야 하며, IP주소간에 중첩되는 부분이 없어야 온프레미스에서 구동되는 리소스에 빈틈없이 접근할 수 있다.

VPC를 사용해 할 수 있는 일

  • 애플리케이션 중 일부는 VPC 내 클라우드에서 실행하고, 일부는 온프레미스에서 실행할 수 있다.
  • VPC 내에서 다수의 서브넷을 생성할 수 있다. 인터넷 접근을 위한 퍼블릭 서브넷을 생성하고 격리된 접근을 위한 프라이빗 서브넷을 생성할 수 있다.
  • 하나 이상의 VPC가 필요하다면 다수의 VPC를 생성한 뒤 VPC 피어링을 통해 서로 연결할 수 있다.
  • VPC 엔드포인트를 사용해 S3와 같은 리소스에 연결할 수 있다.

네트워크 구성의 검토

네트워크를 구축할 땐 다음과 같은 것을 검토한다.

  • 관리하는 서버를 어떻게 나눌 것인가?
  • 서브넷을 어떻게 분할할 것인가?
  • IP주소를 어떻게 할당할 것인가?
  • 라우팅을 어떻게 할 것인가?
  • 방화벽을 어떻게 할 것인가?

온프레미스 환경에서는 DB서버나 웹 애플리케이션 서버는 인터넷에서 직접 접속할 수 없는 내부 네트워크 안에 배치한다. AWS에서는 VPC를 사용하여 1개의 가상 네트워크를 생성하고 분할하여 구성한다.

  • ELB-Subnet

    클라이언트의 요청을 받아 로드 밸런서를 배치하기 위한 네트워크. 로드 밸런서는 Elastic IP를 사용해서 글로벌 IP 주소를 할당한다. 인터넷에 접속할 수 있는 게이트웨이를 설치해 라우팅을 설정한다. 로드 밸런서와 연결되는 웹 애플리케이션 서버에 접근할 수 있도록 Apache Tomcat이 이용하는 8080번 포트 통신을 허가하는 보안 그룹(ELB-Sec)을 생성한다.

  • WebAP-Subnet

    웹 애플리케이션 서버를 작동시키는 EC2 인스턴스를 배치하기 위한 네트워크. EC2 인스턴스에 대한 접속은 로드 밸런서로부터의 접속으로 한정한다. ELB-Subnet에서만 Apache Tomcat에 통신을 허가하는 보안 그룹(WebAP-Sec)을 생성한다.

  • RDS-Subnet

    RDS 인스턴스를 배치하기 위한 네트워크. RDS로의 접속은 웹 애플리케이션 서버가 가동되는 EC2 인스턴스로부터의 접속만 가능하도록 제한한다. WebAP-Subnet에서만 MySQL 3306번 포트의 통신을 허가하는 보안 그룹(RDS-Sec)을 생성한다.

VPC 생성

VPC 설정값

VPC는 IPv4IPv6 모두를 지원하며 IPv4 CIDR 범위를 선택하면 /16 사이의 범위, 즉 65,536(2^16) IP주소를 사용할 수 있고 /28사이의 범위, 즉 16(2^4) IP주소를 사용할 수 있다. IPv6를 선택하면 아마존이 제공하는 IPv6 블록 또는 직접 생성한 IPv6 블록을 사용하면 된다. 아마존이 제공하는 IPv6 블록을 사용하는 경우 CIDR 블록의 크기는 /56으로 고정되며 IPv6 주소의 범위는 아마존에 의해 자동으로 IPv6 주소로 할당된다. 한번 생성된 VPC는 주소의 크기를 변경할 수 없다.

VPC는 리전에 제한되고 다른 리전으로 확장할 수 없으며 VPC 내에서 동일 리전의 AZ를 포함시킬 수 있다.

항목 설명
CIDR Block 생성하는 네트워크 주소를 CIDR 형식으로 지정. 네트워크 주소는 16비트 ~ 28비트 사이
테넌시 생성하는 네트워크에서 하드웨어를 독점 사용할지 지정. 다른 사람과 공용으로 생성하는 경우는 Default

서브넷

서브넷은 서브네트워크의 줄임말로 IP 네트워크의 논리적인 하위 부분을 가리킨다. 서브넷을 통해 하나의 네트워크를 여러 개로 나눌 수 있다.

  • 퍼블릭 서브넷 : 인터넷을 통해 연결할 수 있는 리소스를 위함.
  • 프라이빗 서브넷 : 인터넷을 연결하지 않고 보안 유지를 위한 배타적인 연결에 사용.

VPC의 CIDR 블록을 이용해 서브넷을 정의할 수 있다. VPC로 정의할 수 있는 최소 크기의 서브넷은 /28이며 16개의 IP주소를 생성할 수 있다. 서브넷은 AZ당 하나만 사용할 수 있고 여러 개의 AZ에 연결되는 서브넷은 만들 수 없다.

여러 개의 서브넷을 생성할 때는 VPC의 CIDR 블록에 맞춰야 한다. 예를 들어, /16의 VPC를 생성했고 VPC 내에 /18인 3개의 서브넷을 생성했다면 각각은 16,384(2^14)개의 IP주소를 갖는다. 이렇게 하면 49,152개의 IP주소가 소모된다. 65,536 ~ 49,152개만큼의 IP주소만 새로운 서브넷으로 사용할 수 있게 된다. 하지만 이 시점에서 32,768개의 IP주소를 지니는 /17 체계의 새로운 서브넷을 생성할 수 없으며 /19에서 /28 사이의 새 서브넷을 생성해야 한다.

AWS console에서 VPC와 Subnet을 생성한 결과.

DB 서브넷 그룹 생성

DB 서브넷 그룹에서는 다른 Availability Zone에 속하는 서브넷이 2개 이상 필요하다.

가상 라우터(인터넷 게이트웨이) 생성

라우트 테이블은 트래픽의 전송 방향을 결정하는 라우트와 관련된 규칙을 담은 테이블이며, 목적지를 향한 최적의 경로로 데이터 패킷을 전송하기 위한 모든 정보를 담고 있다. 모든 서브넷은 라우트 테이블을 지닌다. 예를 들어, 특정 VPC의 서브넷이 라우트 테이블에 인터넷 게이트웨이를 포함하고 있다면 해당 서브넷은 인터넷 엑세스 권한 및 정보를 지닌다. 각각의 서브넷은 항상 라우트 테이블을 지니고 있어야 하지만, 하나의 라우트 테이블 규칙을 여러 개의 서브넷에 연결하는 것은 가능하다. 서브넷을 생성하고 별도의 라우트 테이블을 생성하지 않으면 클라우드가 자동으로 VPC의 메인 라우트 테이블에 연결한다.

생성한 4개의 서브넷 중 인터넷과 직접 접속하는 것은 클라이언트의 요청을 받는 ELB-Subnet이다. 따라서, ELB-Subnet에 인터넷 접속을 위한 게이트웨이를 생성한다.

인터넷 게이트웨이는 VPC를 인터넷에 접속하는 가상 라우터로 VPC에서 생성한 네트워크에서 외부 네트워크에 대한 경로 정보인 하이웨이 테이블을 설정한다.

VPC 로컬 네트워크(10.0.0.0/16) 이외의 수신지 패킷은 인터넷 게이트웨이로 중계할 수 있다.

그 다음, Load balancer가 있는 ELB-Subnet에 인터넷 접속이 가능한 라우트 테이블을 할당한다.

방화벽 (보안그룹) 생성

보안 그룹은 패킷을 필터링 한다.

  • ELB-Sec

    load balancer에 적용하는 보안 그룹으로 임의 장소로부터 8080번 포트에 접속을 허용한다.

    타입 프로토콜 포트 범위 송신지점
    커스텀 TCP TCP 8080 임의 장소(0.0.0.0/0)
  • WebAP-Sec

    웹 애플리케이션 서버에 적용하는 보안 그룹으로 load balancer의 서브넷인 10.0.0.0/24에서 8080번 포트에 접속을 허용한다.

    타입 프로토콜 포트 범위 송신지점
    커스텀 TCP TCP 8080 커스텀 IP(10.0.0.0/24)
  • RDS-Sec

    RDS에 적용하는 보안 그룹으로 웹 애플리케이션 서버의 서브넷인 10.0.1.0/24에서 3306번 포트에 접속을 허용한다.

    타입 프로토콜 포트 범위 송신지점
    커스텀 TCP TCP 3306 커스텀 IP(10.0.1.0/24)

AWS Lambda in VPC

VPC를 사용하여 프라이빗 네트워크를 생성한다. lambda 함수를 VPC에 연결하여 함수가 실행되는 동안 private resource에 접근한다.

함수를 VPC에 연결하면 lambda는 함수의 VPC 구성에 있는 각 서브넷의 ENI(Elastic Network Interface)에 함수를 할당한다. Lambda 함수를 VPC에 연결하기 위해 다음의 두가지 정보가 필요하다.

  1. Private subnet ID
  2. Security Group ID

lambda 함수가 VPC에 접근이 가능해지면 인터넷에 직접 연결할 수가 없어 NAT Gateway가 필요하다. NAT Gateway는 public subnet에 위치하고 private subnet이 외부와 연결될 수 있도록 라우팅 해주고 이는 인터넷 게이트웨이를 통해 외부와 연결된다.

실습

학습한 내용을 바탕으로 토이 프로젝트 ‘maggyeo’의 네트워크를 구성해보았다.

  1. Public subnet

    인터넷 게이트웨이가 있는 라우팅 테이블을 지정해 외부와 통신할 수 있다. 유지보수를 위한 bastion host 담당 EC2가 위치한다. 개발자의 IP만 접근 가능하게 제한한다.

  2. Private subnet

    람다 함수가 위치하는 서브넷으로 외부에서 접근할 수 없다. NAT Gateway를 연결해 내부에서 외부로 통신할 수 있다. API Gateway가 클라이언트의 요청 메시지를 람다로 전달할 것이다.

  3. Isolated subnet

    데이터베이스는 외부와 통신을 하지 않아도 되므로 완전히 단절된 서브넷에 위치한다. bastion host를 사용한 SSH Tunnel을 통해 개발자가 DB에 접근 가능하다.