본문 바로가기

리눅스 인프라/Docker, Jenkins, Kubernates

AWS VPC에 대한 이해와 VPC 내 private 통신하기

개요 목적

기존 VirtualBox Ubuntu에서 배포하던 프로젝트를 AWS 서비스를 이용하여 배포하는 프로젝트를 시작했다. 기존 서비스들(Redis, ELKStack, Kafka 등)을 대체하기 위해 AWS 서비스를 생성하면 VPC, Subnet, 보안 그룹 설정이라는 어려운 개념을 만나게 된다.

그래서 이번 시간에는 AWS 서비스 가상 네트워크를 형성해주는 VPC 개념과 Subnet 그리고 보안을 담당하는 보안 그룹 개념에 대해서 알아본다.

그리고 실제 AWS VPC 내에서만 네트워크 통신할 수 있는 EC2-RDS 간의 Private 연결 설정을 해보고 실제 VPC 내부에서만 통신이 가능한 지 테스트 해본다.

VPC & Subnet & 보안 그룹에 대한 이해

VPC

VPC는 Virtual Private Cloud의 약자로 각 리전에 격리된 개별 네트워크 환경을 구성해준다. 격리된 네트워크 환경에 AWS 서비스들을 배치하여 내 입맛대로 서비스 네트워크 통신을 설정할 수 있다. 예를 들어 외부(인터넷)으로부터 격리 보안이 필요한 RDS 서비스 같은 경우, Private Subnet에 두어 VPC 내부 통신만 허용하게 할 수 있고, 인터넷 노출이 필요한 웹 EC2 서버의 경우 public Subnet에 두어 인터넷 통신을 허용할 수 있다.

Subnet

Subnet은 VPC 네트워크를 더 자세하게 나누는 과정이다. subnet은 VPC안에 있는 VPC보다 더 작은단위이기때문에 서브넷마스크가 더 높고 아이피 범위가 더 작다. 그래서 더 세분화된 네트워크 환경에 AWS 리소스를 배치하여 사용할 수 있다.

위 그림 예시는 AWS 계정을 만들면 자동으로 생성해주는 VPC와 Subnet 그룹이다. 4개의 Subnet IPv4 CIDR 값이 VPC의 IPv4 CIDR에 포함 된다는 것을 알 수 있다.

IPv4 CIDR(사이더 블록)란, 사용할 수 있는 아이피 범위를 설정하는 것이다. VPC IPv4 CIDR를 예로 들면, 172.31.0.0/16란 172.31.0.0 IP에서 16비트 부분을 네트워크로 고정해 놓고 나머지 부분을 다양한 호스트 ip로 생성할 수 있다.

Subnet은 Route Tables에 Internet Gateway가 있는지 없는지에 따라서 Public subnet과 Private Subnet으로 구분된다.

보안 그룹

위 예시는 EC2 서비스를 생성할 때 보안 그룹을 설정하는 페이지이다. EC2 외에도 AWS 리소스를 생성할 때 보안 그룹을 반드시 설정해야 한다. 보안 그룹은 방화벽 역할로 인바운드 트래픽과 아웃바운드 트래픽 보안 정책을 설정할 수 있다. 보안 그룹은 Stateful한 방식으로 동작하는 보안 그룹은 모든 허용을 차단하도록 기본 설정 되어있고 필요한 설정은 허용하는 방식으로 되어 있다.

보안 그룹은 서브넷과 리소스에서 설정할 수 있고, 비슷한 역할을 하는 네트워크 ACL은 서브넷 단위에서만 적용할 수 있다.

VPC 내 EC2 RDS private 통신하기

위 내용을 통해 AWS 리소스 생성 시 반드시 설정해야 하는 VPC ,Subnet, 보안 그룹에 대한 개념을 파악했다. 이제 해당 개념을 사용하여 같은 VPC 내에서만 통신할 수 있는 EC2-RDS private 연결하는 실습을 해보자.

default VPC에 EC2 생성하기

  • AWS EC2 인스턴스 생성 페이지에 들어간다.

  • OS는 ubuntu 20.04로 설정하고
  • VPC를 aws 계정 생성 시 자동으로 생성해주는 default VPC로 설정하고 EC2 인스턴스를 생성한다.

EC2에서 RDS로 요청을 보낼 것(아웃바운드트래픽)이기 때문에, EC2 보안 그룹을 크게 신경 쓸 필요는 없다.

default VPC에 RDS 생성하기

  • AWS RDS 생성 페이지에 들어간다.

  • 엔진은 MySQL로 설정을 하고
  • RDS로 로그인할 수 있는 자격 증명 설정을 한다. (해당 정보로 EC2에서 연결을 시도한다.)
  • VPC를 생성한 EC2와 같은 default VPC로 설정을 하고, VPC 내부 통신만 가능하도록 퍼블릭 액세스는 아니요를 체크한다.

  • 보안 그룹은 모든 트래픽이 들어올 수 있게 설정한다.

EC2 → RDS 연결 테스트하기

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToInstance.html

공식 문서에서 제공한 방법을 통해 EC2에 mysql-clinet 패키지를 설치하고

mysql -h {RDB-endpoint} -P 3306 -u {RDB-username} -p

{RDB-password} 명령어를 통해 RDB 연결을 요청할 수 있다.

$ sudo apt-get update
$ sudo apt-get install mariadb-client
$ mysql -h database-1.cbiozpdvq17b.ap-northeast-2.rds.amazonaws.com -P 3306 -u admin -p
$ Asd!1234

같은 VPC에 있는 EC2에서 RDB와 연결이 가능한 것을 확인할 수 있다.

반면에 RDB 외부에 있는 로컬 환경에서는 해당 엔드포인트로 접속이 안 되는 것을 확인할 수 있다.


Reference

https://www.joinc.co.kr/w/Site/cloud/AWS/VPC

https://blog.kico.co.kr/2022/03/08/aws-vpc/

https://medium.com/harrythegreat/aws-가장쉽게-vpc-개념잡기-71eef95a7098