본문 바로가기
AWS

[AWS VPC] Private Subnet에서 외부 접속을 하는 원리

by PudgeKim 2022. 6. 21.

AWS에서 VPC를 사용하게 되면 아래와 같은 설계를 떠올릴 수 있습니다.

보통 데이터베이스와 같은 서비스들은 보안 등을 위해서 Private Subnet에 두어 외부와 통신을 막습니다.

그러나 가끔은 Private Subnet에 있는 서비스들도 외부로부터 파일이나 데이터 등을 가져와야 하는 경우가 있습니다. 한 가지 예를 들자면 postgres같은 데이터베이스는 같은 VPC내에 있는 EC2 인스턴스들과는 통신을 하겠지만 굳이 외부와 통신이 가능하게 열어둘 필요는 없습니다. 그러나 postgres를 설치하거나 업데이트 등을 하기 위해서는 외부와 통신이 가능해야합니다.

이런 경우 어떻게 외부와 통신을 하는지 알아보겠습니다.

 

Private Subnet의 경우 외부와는 통신이 안되지만 같은 VPC내에 있는 Subnet들과는 통신이 가능하기 때문에 Public Subnet의 도움을 빌리게 됩니다.

AWS에서 제공하는 NAT gateway라는 Private Subnet으로부터 온 요청을 받아 우회하여 외부와 접근 가능하게 하는 서비스를 Public Subnet에 두어 Private Subnet의 요청을 처리하면 됩니다.

아래 그림을 보면 이해가 더 쉬울 것입니다.

전체적인 과정은 아래와 같습니다.

1. 우선 Private Subnet에서 Public Subnet으로 요청을 보냅니다. (초록색 화살표)

2. NAT gateway가 요청을 받고 외부로 요청을 전달합니다. (파랑색 화살표)

3. 외부로부터 데이터가 Public Subnet에 있는 NAT gateway로 오게 됩니다.

4. NAT gateway는 해당 데이터를 다시 Private Subnet에 전달해줍니다.

 

** NAT gateway를 사용하지 않고 EC2 인스턴스를 NAT gateway 같은 역할이 가능하게 추가 설정을 할 수도 있다고 합니다.

 

위 과정과는 반대인 외부 관리자가 Private Subnet에 접속하기 위한 방법으로는 Bastion Host가 있습니다.

방법은 비슷합니다.

1. 외부에서 Public Subnet에 있는 Bastion Host 서비스로 접근을 합니다.

2. Bastion Host가 Private Subnet으로 전달합니다.

 

위 과정을 간단히 실습해보고 싶다면 AWS상에 EC2 인스턴스 2개를 각각 Public Subnet(모든 IP로부터 요청을 받는 subnet)과 Private Subnet(외부와는 통신이 안되는 subnet)에 인스턴스를 생성하고 먼저 ssh 통신으로 public subnet에 접속합니다.

그리고 public subnet에서 다시 ssh 통신(private subnet의 private ip주소로 접속)을 통해 private subnet에 접속해보는 것으로 증명할 수 있습니다.

 

** 번외 VPC endpoint

위에서 소개한 내용들은 외부 인터넷과 VPC내의 Subnet들간의 통신이였습니다.

그런데 AWS내에는 여러 서비스들이 있고 AWS 내에 있는 서비스들과 Private Subnet과의 통신은 VPC Endpoint라는 것을 이용하면 아마존 네트워크를 벗어나지 않고(즉, 외부에 노출되지 않고) 통신이 가능합니다.

 

VPC Endpoint의 경우 2가지 방법이 있습니다.

1. Interface Endpoint

2. Gateway Endpoint

 

Interface Endpoint의 경우 Private IP를 생성하여 서비스와 연결하고,

Gateway Endpoint의 경우 Routing Table에 해당 서비스의 경로를 지정하여 사용합니다.

위 그림은 Gateway Endpoint를 사용한 경우를 나타낸 것입니다.

Route Table에 지정된 경로에 의해 Gateway Endpoint로 요청이 가고 이 요청은 S3에 다다르게 되어 통신하게 됩니다.

(VPC 엔드포인트의 경우 Public Subnet에 두어야 하는 조건은 필요하지 않습니다.)

'AWS' 카테고리의 다른 글

AWS Lambda 개념  (0) 2022.07.03
AWS KMS  (0) 2022.06.29
AWS Fargate을 활용한 배포 흐름#1  (0) 2022.06.27
AWS CloudFront  (0) 2022.06.27
AWS 로드밸런서  (0) 2022.06.26