개발/AWS

[VPC] VPC 피어링을 사용하여 EC2 인스턴스간 Private IP로 통신하기

YJ_Lee 2023. 12. 1. 10:33

Introduction

MSA 구조에서의 마이크로 서비스들은 보통 외부로 노출되지 않고 게이트웨이를 통하여 통신을 한다. 하지만 현재 필자의 마이크로 서비스들은 모두 EC2의 탄력적 IP를 할당받아 외부에서 접근 가능한 상태이다. 때문에 이를 수정하고자 하였다.

이 포스팅에서는 서로 다른 AWS 계정의 EC2 인스턴스들이 상호 간에 Private Ip로 통신할 수 있도록 설정하는 방법을 설명한다.

VPC Peering

동일한 AWS 계정의 VPC 간 연결이나 서로 다른 AWS 계정의 VPC간 연결 모두 VPC Peering을 통하여 연결이 가능하다.

피어링을 통해 연결 후, 라우팅 테이블을 설정해 주기만 하면 사설망으로 상호 VPC간의 통신이 가능하게 된다. 하지만 주의할 점은 VPC Peering 통신은 전이되지 않는다.

위와 같은 피어링 연결이 존재 할 때, B - C 간의 통신은 불가능하다 따라서, B - C간 통신이 필요하다면 피어링을 추가로 연결해 주어야만 한다. 때문에 연결할 VPC가 많다면 연결이 복잡해지기 때문에 VPC Peering 보다는 Transit Gateway가 더 적합할 수 있다. 하지만 이는 요금이 부과되기 때문에 돈없는 필자는 그냥 피어링으로 모든 서비스들을 연결하는 노가다를 하기로 했다.

(VPC Peering 은 한 VPC당 50개의 연결이 가능하며, 동일 AZ간의 데이터 전송 비용은 모두 무료이다!)

Solution

이제 실제로 연결하고, EC2 인스턴스에서 핑을 때려보자.
현재 필자의 A 계정은 gateway-service가 존재하고, B 계정은 post-service 가 존재하는데 모두 인스턴스 생성 당시 Default VPC를 선택하였다.

불행하게도 VPC Peering 을 위해서는 두 VPC가 서로 다른 네트워크를 가져야 한다. 즉, CIDR가 겹치면 안된다. 처음 EC2 인스턴스를 만들 때, Default VPC를 선택하였다면 172.31.0.0/16 으로 고정될 것이다. 때문에 서로 다른 Default VPC는 연결이 불가능하다.

심지어 EC2 인스턴스는 한 번 생성하면 VPC, Subnet 등을 바꾸는 것이 불가능하다. 때문에 필자와 같이 EC2 인스턴스의 VPC를 바꿔야 하는 상황이라면 다음과 같은 과정을 거치게 된다.

  • VPC 생성
  • 사용 중인 서비스 EC2 인스턴스의 AMI 생성
  • AMI 로 새로운 EC2 인스턴스를 생성하며 1. 에서 만든 VPC로 설정
  • VPC Peering
  • 양쪽 VPC에서 라우팅 테이블 설정

1, 2, 3 번 내용은 서로 다른 두 계정에서 모두 진행해야 한다.
EC2 인스턴스를 건드릴 필요 없이 VPC Peering 만 한다면

  • VPC 생성
  • VPC Peering
  • 양쪽 VPC에서 라우팅 테이블 설정

과정을 거치게 된다.

VPC 생성

VPC 대시보드 > VPC > VPC 생성

)

VPC만 생성할 것인지, VPC와 그 안의 Subnet, Routing Table, IGW 등. 모두 생성할 것인지 선택한다.

  • IGW: 인터넷 게이트웨이. VPC가 외부 인터넷과 연결하기 위해서는 반드시 연결되어야 한다.

한꺼번에 만드는 것이 편리하므로 "VPC 등" 을 선택하고 VPC 이름과 CIDR를 설정한다.
주의할 점은 VPC 내의 서브넷 갯수에 따라 CIDR가 서브네팅 되고, 각각의 서브넷에는 AWS에서 예약한 IP가 존재하므로 호스트 갯수를 넉넉잡아 설정하도록 한다.

서브넷은 호스트 갯수와 용도에 따라 적당히 나누어 주면 된다.
퍼블릭 서브넷은 IGW에 연결되어 외부로 접속이 가능해지며, 프라이빗 서브넷은 IGW에 연결되지 않아 완전히 감춰지고, VPC 내에서만 통신이 가능하다.

NAT 게이트웨이는 일반 가정 공유기같이 Private IP > Public IP 변환하여 프라이빗 서브넷에 속한 서비스라도 인터넷에 접속하도록 한다. 요금이 부과되기도 하고 굳이 사용할 필요는 없다.

S3 게이트웨이는 S3 전용 엔드포인트로, 외부에서 접속이 가능하도록 한다. S3를 사용한다면 만들어 주자.

 

오른쪽 미리보기에 설정한 내용에 따라 VPC 네트워크 현황이 시각적으로 표현되므로 참고하자.

 

)

두 계정 모두 생성이 완료된 모습이다.

VPC Peering 연결 설정

VPC 대시보드 > Virtual Private Cloud > 피어링 연결 > 피어링 연결 생성

VPC ID, 계정 ID, VPC ID 를 입력하면 해당 계정으로 피어링 요청을 보낸다.
VPC ID는 VPC 메뉴에서, 계정 ID는 AWS 우측 상단의 계정 닉네임을 클릭하면 볼 수 있다.

요청 후 다른 계정으로 접속하여 요청을 수락하면 상호 VPC간 연결이 완료되게 된다.

EC2 Instance 에 VPC 할당

EC2 > 인스턴스 시작 > 네트워크 설정 > 편집

새롭게 생성한 VPC와 서브넷을 EC2 인스턴스에 할당할 수 있다.
기존 인스턴스의 VPC는 바꿀 수 없으므로 인스턴스를 복제하여 새로 시작해야 한다.
방법: https://foxtrot.tistory.com/39

 

[EC2] AWS EC2 인스턴스를 새로 생성하고 기존에 사용하던 볼륨을 복사하여 사용해 보자

Introduction EC2 인스턴스를 사용 중에 VPC를 교체할 일이 생겼다. 하지만 불행하게도, EC2 인스턴스는 한 번 생성되면 VPC, Subnet, 가용영역 등을 바꾸는 것이 불가능하다. 따라서 새로운 EC2 인스턴스를

foxtrot.tistory.com

 

 

)

connect-001-vpc 에 할당되어 192.168.101.0/24 대역을 사용 중인 post-service
connect-003-vpc 에 할당되어 192.168.100.0/24 대역을 사용 중인 gateway-service

Subnet Routing table 설정

피어링 연결은 되었으나 통신이 가능한 상태는 아니다. 두 라우터간 UTP만 꽃은 상태라고 보면 된다. 통신을 하기 위해서는 양쪽에서 모두 라우팅 테이블 설정을 해 주어야 한다.

VPC 대시보드 > Virtual Private Cloud > 라우팅 테이블

하나의 라우팅 테이블에는 여러 서브넷이 연결될 수 있다. 위에서 생성할 때 할당한 서브넷이 연결된 라우팅 테이블을 찾아서 클릭해 라우팅 테이블을 편집한다.

현재 사용중인 로컬 대역은 192.168.101.0/24 이고, 목적지가 192.168.100.0/24 인 패킷은 모두 연결된 피어링으로 보내도록 설정한다. 반대쪽도 동일하게 설정해 주어야 응답이 가능해진다.

Ping 테스트

핑 테스트를 위해서는 EC2 Instance 보안 정책에서 ICMP 포트를 뚫어주어야 한다.

192.168.101.0/24 대역 인스턴스에서

  • 192.168.102.0/24
  • 192.168.100.0/24
  • 192.168.103.0/24

대역으로 핑이 잘 된다. 다른 대역은 개인적으로 연결하였고 포스팅은 따로 하지 않았다.
상호간의 VPC 연결을 통하여 Private IP로 통신이 가능해졌다.
사용처에 따라 외부에 노출할 필요가 없는 서비스는 Public IP를 연결하지 않고 서비스끼리만 통신할 수 있게 되었고, MSA 마이크로 서비스에 조금 더 적합하게 되었다.

Link

'개발 > AWS' 카테고리의 다른 글

[EC2] AMI 를 이용하여 EC2 인스턴스를 복사해 보자  (0) 2023.11.30