Amazon Web Services 한국 블로그

Amazon API Gateway 기반 VPC Link 활용 방법

Amazon API Gateway는 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보호할 수 있도록 지원하는 완전관리형 서비스입니다. 백엔드 서비스의 데이터, 비즈니스 로직 또는 기능에 액세스할 수 있도록 “현관문” 역할을 하는 API를 클릭 몇번으로 생성할 수 있습니다.

API Gateway에서 액세스하는 백엔드가 프라이빗 VPC 안에 있는 EC2와 같은 리소스일 때 어떻게 안전하고 빠르게 액세스할 수 있을까요? 이전에는 API Gateway가 인터넷을 경유해서 백엔드에 액세스했어야 했기 때문에 경로가 복잡해지면서 Latency도 추가적으로 늘어가는 단점이 있었지만, 이제는 VPC Link라고 하는 프라이빗 VPC와의 엔트포인트를 통합하는 기능을 활용하여 API Gateway와 프라이빗 VPC 내의 리소스가 안전하고 빠르게 연결될 수 있습니다.

이렇게 편리한 VPC Link를 더 효율적으로 이용하기 위해서는 아래 두 가지 사항을 유념해야 합니다.

  • VPC Link의 한도
  • VPC Link 활용에 필수적인 NLB의 특성

먼저 VPC Link는 사용 한도가 있습니다. 기본 한도는 하나의 계정 내에서 5개까지 생성할 수 있습니다. 이 5개라는 한도는 하나의 계정 내에서 생성할 수 있는 VPC의 갯수와 일치합니다. 즉, 하나의 VPC에는 하나의 VPC Link를 쓰는 것으로 생각할 수 있습니다. 물론, 경우에 따라서 하나의 VPC의 리소스들에 5개의 VPC Link를 모두 쓸 수 있겠지만, 다른 VPC에서도 VPC Link를 쓰고자 할 때는한도 증가 요청을 해야하며 VPC Link의 기능을 낭비하는 것이 됩니다.

다음으로 VPC Link를 구성하기 위해서는 NLB(Network Load Balancer)가 필요하다는 것입니다. NLB의 생성에도 한도는 있지만, NLB 자체가 고성능의 라우팅을 지원하기 때문에 하나의 NLB로 초당 수백만건의 요청을 처리할 수 있습니다. 이러한 NLB를 VPC Link마다 하나씩 쓰게 되며, 기본적으로 NLB는 실행된 시간에 따라서 과금이 되므로 NLB를 필요한 만큼만 사용하는 것이 좋습니다. 그리고 NLB는 대상(Target) 그룹과 리스너의 조합으로 하나의 NLB로 다양한 요청을 각기 다른 대상그룹으로 보낼 수 있습니다.

위의 두 가지 사항을 바탕으로 API Gateway의 VPC Link를 효율적으로 활용하는 것에 대해서 설명해보겠습니다. 먼저, 위의 두 가지 사항을 고려하지 않고 동일한 VPC 내의 API 요청을 수행하는 서버마다 1개의 VPC Link를 생성하는 경우를 생각해보겠습니다.

즉, VPC Link : NLB : API 서버 의 비율이 1:1:1 이 되는 경우입니다.

앞서 설명한대로 API 서버의 수가 늘어나면, VPC Link와 NLB의 수도 따라서 늘어나게 되고 가장 먼저 VPC Link의 한도가 소진되게 됩니다. 그리고 NLB도 늘어나므로 불필요한 비용이 증가하게 됩니다.

이를 VPC Link 의 한도와 NLB의 특성을 고려하여 VPC Link : NLB : API 서버의 비율을 1:1:N으로 한다면 다음과 같이 됩니다.

VPC Link는 해당 VPC에 하나만 쓰게 되므로 한도에도 걸리지 않고, NLB도 하나만 쓰게되어 불필요한 비용을 줄이게 됩니다. 이렇게 VPC Link로 VPC 내 여러 API 서버를 통합하는 예제를 아래에서 보겠습니다. 순서는 다음과 같습니다.

  • Step 1. API 서버 2개를 생성. 각각 서비스 포트가 80으로 동일하게 설정
  • Step 2. Target Group 생성
  • Step 3. VPC Link를 위한 NLB 생. NLB의 리스너 생성시 각 리스너 포트를 8080과 8081로 설정하고 대상그룹을 각각 지정
  • Step 4. VPC Link 생성
  • Step 5. API Gateway의 각 리소스별 메소드에 VPC Link를 설정하여 테스트

Step 1. 동일한 VPC에 간단한 API 서버로 Apache Httpd를 실행하는 서버 2개를 생성합니다.

각각의 API 서버들은 API Gateway에서 VPC Link로 백엔드 호출 시 8080과 8081로 호출합니다. 즉, NLB의 리스너 포트가 각각 8080과 8081인 것입니다.

각 API 서버들은 접속 성공 시 아래와 같은 메시지를 출력합니다.

  • 8080로 연결되는 API 서버 : This is Node-1 using 8080
  • 8081로 연결되는 API 서버 : This is Node-2 using 8081

Step 2. NLB의 대상그룹을 생성합니다.

2개의 대상그룹을 만들고 각 대상그룹에 API 서버들을 하나씩 지정합니다. 각 API 서버들의 실제 서비스 포트(예제에선 80)으로 연결되며 NLB는 TCP만을 지원하기 때문에 프로토콜은 TCP 입니다.

Step 3. API 서버들과 동일한 VPC에서 NLB를 생성합니다.

각각 대상그룹에 라우팅할 리스너를 추가합니다. 8080포트로 들어오는 요청은 TCP8080대상그룹으로, 8081 포트로 들어오는 요청은 TCP8081 대상그룹으로 라우팅됩니다.

Step 4. API Gateway에서 VPC Link를 생성합니다.

자동으로 대상 NLB의 목록에 뜨므로 선택합니다.

Step 5. API Gateway에서 VPC Link를 지정합니다.

각 API서버들의 GET 메소드를 호출하기 위해 리소스와 메소드를 만들고 VPC Link를 지정합니다. NLB에 연결된 대상그룹이 각각 8080과 8081 포트를 리스닝하고 있기 때문에 VPC Link의 엔드포인트 항목에는 NLB의 주소 앞에 http:// 또는 https:// 를 붙이고 마지막에 각 리스너 포트를 붙여서 설정합니다.

이제 API를 Deploy하고 테스트 해보겠습니다. GET 메소드이기 때문에 웹브라우저로 테스트 가능합니다. 각 메소드의 Invoke URL을 입력하고 출력을 확인합니다.

결론

이렇게 하나의 VPC에 하나의 VPC Link를 연결함으로서 VPC 내 다양한 API 서버들을 API Gateway와 쉽고 안전하며 빠르게 연결하게 되었습니다. 이로 인한 장점은 다음과 같습니다.

  1. API서버가 아닌, VPC가 증가하면 동일 비율로 VPC Link의 한도를 증가시키면 됩니다.
  2. 기본적으로 NLB는 서울리전 기준으로 사용량이 적더라도 켜놓고 있는 것 만으로도 1개의 NLB는 시간 당 0.0225 USD의 비용이 발생하게 됩니다. NLB를 VPC당 한 개씩만 생성하면 되므로, 여러 VPC Link를 이용할 때보다 많은 비용 절감이 됩니다.

단, NLB의 리스너 포트와 대상그룹의 포트를 관리해 줄 필요는 있습니다. API 서버의 증감이 빈번하게 이루어지지는 않으므로 큰 부담은 되지 않을 것이지만 관리를 해줘야하는 부분입니다.

이 글은 한국 AWS 기술팁을 전해 드리는 코너로, 김준형 AWS 솔루션즈 아키텍트께서 작성해 주셨습니다.