Amazon Web Services 한국 블로그

Amazon VPC Lattice 미리 보기 – 서비스 간 통신을 위한 네트워킹 간소화 기능

현대적인 애플리케이션은 모듈식 분산형 구성 요소를 사용하여 구축됩니다. 각 구성 요소는 기능의 자체적인 하위 집합을 구현하는 서비스입니다. 이런 서비스가 서로 통신하도록 지원하기 위해서는 위치를 확인하고 액세스를 승인하며 트래픽을 라우팅할 수 있는 방법이 필요합니다. 문제를 해결하려면 통신 구성을 관리하여 애플리케이션, 서비스, 네트워크 수준에서 발생하는 상황을 빠르게 파악할 수 있어야 합니다. 여기에는 시간이 오래 걸릴 수 있습니다.

오늘부터 Amazon Virtual Private Cloud(VPC)의 새로운 기능인 Amazon VPC Lattice 미리 보기를 제공합니다. 이 기능을 사용하면 서비스 간 통신을 연결, 보안 및 모니터링하기 위한 일관적인 방법이 제공됩니다. VPC Lattice를 사용하면 트래픽 관리, 네트워크 액세스, 모니터링을 위한 정책을 정의하여 모든 AWS 컴퓨팅 서비스(인스턴스, 컨테이너, 서버리스 함수)에서 간단하고 일관적으로 애플리케이션을 연결할 수 있습니다. VPC Lattice는 VPC와 계정 사이의 네트워크 연결과 IPv4, IPv6 및 중첩되는 IP 주소 사이의 네트워크 주소 변환을 자동으로 처리합니다. VPC Lattice는 AWS Identity and Access Management(IAM)와 통합할 수 있어서 현재 AWS 서비스와 상호작용시 친숙하게 사용하던 것과 동일한 인증 및 승인 기능을 자체적인 서비스 간 통신에 그대로 사용할 수 있습니다. VPC Lattice는 요청이 있을 시 블루/그린 및 canary 스타일 배포에 대해 요청 특징과 가중치 기반 라우팅에 따른 트래픽 라우팅을 위한 공통적인 제어를 제공합니다. 예를 들어 VPC Lattice를 사용하면 특정 서비스에 대한 컴퓨팅 유형을 조합 및 결합할 수 있습니다. 이는 모놀리스 애플리케이션 아키텍처를 마이크로서비스로 현대화하는 데 도움이 됩니다.

VPC Lattice는 비침습적으로 설계되어 조직 내에서 각 팀이 시간이 지남에 따라 점진적으로 옵트인할 수 있습니다. 이런 방식을 통해 VPC Lattice가 서비스 간 네트워킹, 보안, 모니터링 요구 사항을 처리하는 동안 애플리케이션 로직에 집중해 더욱 빠르게 애플리케이션을 전달할 수 있습니다.

Amazon VPC Lattice의 사용 방법
VPC Lattice를 사용하면 서비스 네트워크라는 논리적 애플리케이션 계층 네트워크가 생성되는데, 이는 여러 VPC와 계정에서 클라이언트와 서비스를 연결하여 네트워크 복잡성을 추상화합니다. 서비스 네트워크는 하나의 논리적 경계로, 서비스 모음에 액세스 및 관찰 기능 정책을 적용하고 서비스 검색과 연결을 자동으로 구현합니다. VPC 내에서 HTTP/HTTPS 및 gRPC 프로토콜을 통해 애플리케이션 간 연결을 제공합니다.

VPC가 서비스 네트워크에 활성화되면 VPC의 클라이언트가 DNS를 통해 서비스 네트워크에서 서비스를 자동 검색하고 모든 애플리케이션 간 트래픽을 VPC Lattice를 통해 보냅니다. AWS Resource Access Manager(RAM)를 사용하여 계정, VPC를 제어하고, 애플리케이션은 VPC Lattice를 통해 통신을 설정할 수 있습니다.

서비스는 특정 작업이나 기능을 제공하는 소프트웨어의 독립적으로 배포 가능한 단위입니다. VPC Lattice에서 서비스는 VPC나 계정 내에서 실행할 수 있는 논리적 구성 요소이며, 결합된 컴퓨팅 유형(가상 머신, 컨테이너, 서버리스 함수)에서 실행할 수 있습니다. 서비스 구성은 다음과 같습니다.

  • 서비스에서 트래픽이 통과할 것으로 예측하는 포트와 프로토콜을 정의하는 리스너 1~2개. 지원되는 프로토콜은 HTTP/1.1, HTTP/2 및 gRPC(TLS 지원 서비스용 HTTPS 포함)입니다.
  • 리스너에는 우선 순위(규칙을 처리해야 하는 순서 지정), 규칙을 적용할 시점을 정의하는 1개 이상의 조건, 대상 그룹으로 트래픽을 포워딩하는 작업으로 구성된 규칙이 있습니다. 각 리스너는 추가적인 규칙이 구성되지 않았거나 조건이 충족되지 않을 때 적용되는 기본 규칙이 있습니다.
  • 대상 그룹대상 즉, 라우팅하려는 특정 워크로드를 실행 중인 컴퓨팅 리소스의 모음입니다. 대상은 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, IP 주소, Lambda 함수가 될 수 있습니다. Kubernetes 워크로드의 경우, VPC Lattice는 AWS Gateway Controller for Kubernetes를 통해 서비스와 포드를 대상으로 지정할 수 있습니다. AWS Gateway Controller for Kubernete에 액세스하려면 평가판에 참여하시기 바랍니다.

VPC Lattice 논리적 아키텍처.

서비스 액세스 제어를 구성하는 데 액세스 정책을 사용할 수 있습니다. 액세스 정책은 서비스 네트워크 및 개별 서비스와 연결할 수 있는 IAM 리소스 정책입니다. 액세스 정책에서는 ‘PARC'(주체(principal), 작업(action), 리소스(resource), 조건(condition)) 모델을 사용하여 서비스에 컨텍스트별 액세스 제어를 적용할 수 있습니다. 예를 들어, 액세스 정책을 사용하여 어떤 서비스가 개발자 소유의 서비스에 액세스할 수 있는지 정의할 수 있습니다. AWS Organizations를 사용하는 경우 서비스 네트워크를 특정 조직으로 제한할 수 있습니다.

또한, VPC Lattice는 직접 소유하거나 AWS RAM을 통해 공유된 서비스를 한 곳에서 볼 수 있는 서비스 디렉터리를 제공합니다.

Amazon VPC Lattice 사용 방법
다양한 역할의 사람들이 VPC Lattice를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 서비스 네트워크 관리자:
    • 서비스 네트워크를 만들고 관리합니다.
    • 서비스 네트워크에 대한 액세스 및 모니터링을 정의합니다.
    • 클라이언트와 서비스를 연결합니다.
    • 서비스 네트워크를 다른 AWS 계정과 공유합니다.
  • 서비스 소유자:
    • 액세스 및 모니터링을 포함한 서비스를 만들고 관리합니다.
    • 라우팅을 정의합니다. 예를 들어, 서비스를 실행 중인 대상 그룹을 가리키는 리스너와 규칙을 구성합니다.
    • 서비스를 서비스 네트워크와 연결합니다.

이제 실제로 어떻게 작동하는지 알아보겠습니다. 여기서는 이 두 가지 역할을 모두 소개합니다.

백엔드 서비스 2개 만들기
이 섹션에서는 VPC Lattice와 관련된 구체적인 내용은 나오지 않습니다. 몇 개의 서비스만 만들 예정인데, 하나는 Amazon EC2에서 실행되고 다른 하나는 AWS Lambda에서 실행됩니다. 이는 나중에 VPC Lattice로 네트워킹을 구성할 때 사용합니다.

Amazon Linux EC2 인스턴스에서 HTTP 요청에 ‘Hello from the instance’를 반환하는 웹 앱을 만듭니다. VPC Lattice를 통해 클라이언트에서 수신되는 인스턴스에 액세스할 수 있도록 VPC Lattice AWS 관리형 접두사 목록에서 포트 8080에 TCP 트래픽을 허용하는 인바운드 규칙을 보안 그룹에 추가합니다.

다음은 app.py 파일입니다. 저는 이 앱에서 PythonFlask를 사용하지만, 여러분께서는 이 언어를 몰라도 이 게시글을 따라올 수 있습니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
  return 'Hello from the instance'

@app.route('/<path>')
def somePath(path):
  return 'Hello from the instance at path "{}"'.format(path)

app.run(host='0.0.0.0', port=8080)

다음은 Python 종속성이 정리된 requirements.txt 파일입니다. 필요한 모듈은 flask뿐이므로 코드 한 줄이면 됩니다.

flask

다음과 같이 종속성을 설치합니다.

pip3 install -r requirements.txt

그런 다음, nohup 명령을 사용하여 웹 앱을 시작하고 인스턴스에서 로그아웃하더라도 계속 실행하도록 합니다.

nohup flask run --host=0.0.0.0 --port 8080 &

EC2 인스턴스에서 웹 서비스가 포트 8080을 통해 HTTP 트래픽을 수신합니다.

Lambda 콘솔에서 Node.js 18.x 런타임을 사용하여 모든 호출에 ‘Hello from the function’을 반환하는 간단한 함수를 만듭니다.

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from the function'),
    };
    return response;
};

이제 두 서비스가 모두 준비되었습니다. VPC Lattice를 사용하여 네트워킹을 구성해보겠습니다.

VPC Lattice 대상 그룹 만들기
먼저 두 개의 대상 그룹을 만들겠습니다. 하나는 EC2 인스턴스용이고, 나머지 하나는 Lambda 함수용입니다. VPC 콘솔의 탐색 창에 VPC Lattice 섹션이 새로 생겼습니다. 여기서 대상 그룹(Target groups)을 선택한 다음, 대상 그룹 만들기(Create target group)를 선택합니다.

첫 번째 대상 그룹의 경우, 인스턴스(Instances) 대상 유형을 선택하고 이름을 입력합니다.

콘솔 스크린샷.

인스턴스에서 실행 중인 웹 앱에서 사용한 프로토콜(HTTP) 및 포트(8080)를 선택합니다. 인스턴스가 실행 중인 VPC와 프로토콜 버전(HTTP1)을 선택합니다.

콘솔 스크린샷.

이제 대상 상태를 테스트하는 데 사용할 상태 확인을 구성하겠습니다. 이 경우에는 콘솔에서 추천한 기본값을 사용합니다.

콘솔 스크린샷.

다음 단계에서는 대상을 등록할 수 있습니다. 목록에서 웹 앱을 실행 중인 인스턴스를 선택한 다음, 이를 포함합니다.

콘솔 스크린샷.

선택한 대상(이 경우 인스턴스 1개)을 검토하고 제출(Submit)을 선택합니다.

이와 유사한 방식으로 Lambda 함수에 대한 대상 그룹을 만듭니다. 이번에는 목록에서 함수를 선택합니다. 사용할 함수 버전 또는 함수 별칭을 선택할 수 있습니다. 단순화를 위해 ${LATEST} 버전을 사용하겠습니다.

콘솔 스크린샷.

VPC Lattice 서비스 만들기
대상 그룹이 준비되었으므로 탐색 창에서 서비스(Services)를 선택한 다음, 서비스 만들기(Create service)를 선택합니다. 이름 및 설명을 입력합니다.

콘솔 스크린샷.

이제 인증 유형을 선택할 수 있습니다. 없음(None)을 선택할 경우, 서비스 네트워크는 클라이언트 액세스를 인증하거나 승인하지 않고 인증 정책(auth policy)(있을 경우)을 사용하지 않습니다. AWS IAM을 선택한 다음, 정책 템플릿 적용(Apply policy template) 드롭다운에서 인증된 액세스와 인증되지 않은 액세스를 모두 허용하는 템플릿을 선택합니다.

콘솔 스크린샷.

모니터링(Monitoring) 섹션에서 액세스 로그(Access logs)를 활성화합니다. 액세스 로그의 대상으로는 앞서 만들었던 Amazon CloudWatch 로그 그룹을 사용하겠습니다. 또한, Amazon Simple Storage Service(S3) 버킷이나 Amazon Kinesis Data Firehose 전송 스트림을 사용할 수도 있습니다.

콘솔 스크린샷.

다음 단계에서는 서비스에 대한 라우팅을 정의하겠습니다. 리스너 추가(Add listener)를 선택합니다. 프로토콜의 경우, HTTPS를 사용하여 수신할 서비스를 구성합니다. 기본 작업에서는 요청의 2/3(가중치 20)는 인스턴스 대상 그룹으로 보내고 1/3(가중치 10)은 함수 대상 그룹으로 보내도록 선택합니다.

콘솔 스크린샷.

다음으로 두 개의 규칙을 추가합니다. 첫 번째 규칙(우선 순위 10)은 경로가 /to-instance인 모든 요청을 인스턴스 대상 그룹으로 보냅니다.

콘솔 스크린샷.

두 번째 규칙(우선 순위 20)은 경로가 /to-function인 모든 트래픽을 함수 대상 그룹으로 보냅니다.

콘솔 스크린샷.

다음 단계에서는 서비스를 하나 이상의 서비스 네트워크와 연결해야 합니다. 아직 서비스 네트워크를 만들지 않았으므로 지금은 이 단계를 건너뛰고 다음(Next)을 선택합니다. 구성을 검토하고 서비스를 만듭니다.

VPC Lattice 서비스 네트워크 만들기
이제 서비스와 사용하고자 하는 VPC를 연결할 수 있도록 서비스 네트워크를 만듭니다. 탐색 창에서 서비스 네트워크(Service network)를 선택한 다음, 서비스 네트워크 만들기(Create service network)를 선택합니다. 서비스 네트워크의 이름과 설명을 입력합니다.

콘솔 스크린샷.

서비스 연결(Associate services)에서 방금 만든 서비스를 선택합니다.

콘솔 스크린샷.

VPC 연결(VPC associations)에서 웹 앱을 실행하는 인스턴스에서 사용한 VPC를 선택합니다. 그러면 웹 앱이 서비스 네트워크와 연결된 다른 서비스를 호출할 수 있으므로 나중에 도움이 될 수 있습니다.

콘솔 스크린샷.

그런 다음, 두 번째 VPC를 선택합니다. 여기에는 몇 가지 테스트를 실행하는 데 사용될 다른 EC2 인스턴스가 있습니다.

콘솔 스크린샷.

단순화하기 위해서 액세스(Access) 섹션에서 없음(None) 인증 유형을 선택합니다.

콘솔 스크린샷.

모니터링(Monitoring) 섹션에서 전체 서비스 네트워크에 대한 액세스 로그를 S3 버킷으로 보내는 것을 선택합니다.

콘솔 스크린샷.

구성 요약을 검토하고 서비스 네트워크를 만듭니다. 몇 초 후 모든 서비스와 VPC 연결이 활성화되고 서비스를 사용하기 시작할 수 있습니다.

서비스 연결 목록에서 서비스의 도메인 이름을 메모합니다.

콘솔 스크린샷.

VPC Lattice를 사용한 서비스 액세스 테스트
서비스의 라우팅(Routing) 탭에 리스너가 어떻게 서로 다른 대상 그룹에 대한 라우팅을 처리하는지 간단한 요약이 나와 있습니다.

콘솔 스크린샷.

그런 다음, 두 번째 VPC의 EC2 인스턴스로 로그인하고 curl을 사용하여 서비스 도메인 이름을 호출합니다. 예상한 것처럼 인스턴스에서 응답의 2/3 정도를 받고, 함수에서 응답의 1/3 정도를 받습니다.

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
Hello from the instance

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
Hello from the instance

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws
"Hello from the function"

/to-instance/to-function 경로를 호출하면 추가 규칙이 요청을 인스턴스와 함수로 각각 포워딩합니다.

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-instance
Hello from the instance "to-instance" path

curl https://my-service-03e92ee54968d87ca.7d67968.vpc-lattice-svcs.us-west-2.on.aws/to-function
"Hello from the function"

이제 앞서 구성한 액세스 로그 구독을 사용하여 서비스에 대한 액세스를 검토할 수 있습니다.

서비스의 경우, CloudWatch 로그 그룹을 검토합니다. 여기에서 서비스에 대한 자세한 액세스 정보가 들어 있는 로그 스트림을 찾습니다.

콘솔 스크린샷.

서비스 네트워크와 연결된 모든 서비스에 대한 액세스 로그는 S3 버킷에 있습니다. 지금은 서비스가 하나뿐이지만, 나중에 추가될 것입니다.

콘솔 스크린샷.

평가판 출시
Amazon VPC Lattice는 미국 서부(오레곤) 리전에서 평가판으로 제공됩니다.

VPC Lattice는 모든 AWS 컴퓨팅 유형에 배포 일관성을 제공하므로 인스턴스, 컨테이너, 서버리스 함수에서 서비스를 연결할 수 있습니다. VPC Lattice를 사용하여 세분화되고 자세한 트래픽 제어(예: 정책 기반 라우팅, 가중치 기반 대상)를 적용하여 블루/그린 및 canary 스타일 배포를 지원할 수 있습니다.

VPC Lattice를 사용하면 요청 유형, 트래픽 볼륨, 오류 발생률, 응답 시간 등을 수집하는 자세한 액세스 로그와 지표로 서비스 간 통신을 모니터링하고 문제를 해결할 수 있습니다. 이 블로그 게시글에서는 VPC Lattice의 기능을 극히 일부만 소개했을 뿐입니다.

Amazon VPC Lattice를 사용하여 서비스 간 통신의 연결, 보안 및 모니터링 방식을 단순화하세요.

Danilo Poccia