Amazon Web Services 한국 블로그

Amazon CloudFront, gRPC 직접 호출 지원

오늘부터 글로벌 콘텐츠 전송 네트워크(CDN)인 Amazon CloudFront를 gRPC API 엔드포인트 전면에 배포할 수 있습니다.

gRPC는 API 구축을 위한 현대적이고 효율적이며 언어에 구애받지 않는 프레임워크입니다. 프로토콜 버퍼(protobuf)를 인터페이스 정의 언어(IDL)로 사용하므로 플랫폼에 구애받지 않는 방식으로 서비스와 메시지 유형을 정의할 수 있습니다. gRPC를 사용하면 HTTP/2 기반의 간단한 고성능 원격 프로시저 호출(RPC)을 통해 서비스 간 통신이 가능합니다. 이는 서비스 전반에서 효율적이고 지연 시간이 짧은 통신을 지원하므로 마이크로서비스 아키텍처에 이상적입니다.

gRPC는 다양한 프로그래밍 언어를 위한 양방향 스트리밍, 흐름 제어, 자동 코드 생성 등의 기능을 제공합니다. 고성능, 효율적인 통신 및 실시간 데이터 스트리밍이 필요한 시나리오에 적합합니다. 애플리케이션에서 대량의 데이터를 처리해야 하거나 클라이언트와 서버 간에 지연 시간이 짧은 통신이 요구되는 경우 gRPC가 좋은 옵션이 될 수 있습니다. 하지만 gRPC는 REST에 비해 배우기가 더 어려울 수 있습니다. 예를 들어 gRPC는 protobuf 직렬화 형식을 사용하므로 개발자는 .proto 파일에서 데이터 구조와 서비스 메서드를 정의해야 합니다.

gRPC API 엔드포인트 전면에 를 배포하면 두 가지 이점이 있습니다.

첫째, 클라이언트 애플리케이션과 API 구현 간의 지연 시간을 줄일 수 있습니다. CloudFront는 가장 가까운 엣지로의 지능형 라우팅 기능과 함께 600개 이상의 엣지 로케이션으로 구성된 글로벌 네트워크를 제공합니다. 엣지 로케이션은 정적 콘텐츠에 대한 TLS 종료 및 선택적 캐싱 기능을 제공합니다. CloudFront는 지연 시간이 짧은 고대역폭 완전관리형 프라이빗 AWS 네트워크를 통해 gRPC 오리진에 클라이언트 애플리케이션 요청을 전송합니다.

둘째, 트래픽 암호화, AWS Web Application Firewall을 통한 HTTP 헤더 검증, 분산 서비스 거부(DDoS) 공격에 대한 AWS Shield Standard 보호 등 엣지 로케이션에 배포된 추가 보안 서비스의 이점을 애플리케이션에 적용할 수 있습니다.

실제 작동 모습을 살펴보겠습니다.
이 데모를 시작하기 위해 공식 gRPC 코드 리포지토리gRPC route-guide demo를 사용합니다. 쉽게 배포할 수 있도록 이 예시 애플리케이션을 컨테이너에 배포합니다(다른 배포 옵션도 지원됨).

Dockerfile을 사용합니다.

FROM python:3.7
RUN pip install protobuf grpcio
COPY ./grpc/examples/python/route_guide .
CMD python route_guide_server.py
EXPOSE 50051

또한 AWS Copilot 명령줄을 사용하여 Amazon Elastic Container Service(Amazon ECS)에 컨테이너를 배포합니다. Copilot 명령을 실행하면 컨테이너를 빌드하고 배포하는 데 필요한 정보를 수집하라는 메시지가 표시됩니다. 그런 다음 ECS 클러스터, ECS 서비스ECS 작업이 자동으로 생성됩니다. 또한 TLS 인증서와 로드 밸런서도 생성됩니다. 로드 밸런서 리스너 엔드포인트의 DNS 이름을 사용하도록 122행을 수정하여 클라이언트 애플리케이션을 테스트합니다. 로드 밸런서가 애플리케이션에 HTTPS 엔드포인트를 제공하므로, grpc.insecure_channel 대신 grpc.secure_channel을 사용하도록 클라이언트 애플리케이션 코드를 변경합니다.

gRPC 클라이언트 애플리케이션 데모 - ALB를 사용한 소스 코드

API가 제대로 배포되고 작동한다고 확신할 경우 계속해서 를 구성합니다.

먼저 AWS Management ConsoleCloudFront 섹션에서 배포판 생성을 선택합니다.

오리진에서 gRPC 엔드포인트 DNS 이름을 오리진 도메인으로 입력합니다. 프로토콜에서 HTTPS만을 활성화하고 HTTPS 포트(443)를 그대로 둡니다. 그런 다음 배포판의 이름을 선택합니다.

CloudFront - 오리진 및 이름 추가

뷰어에서 뷰어 프로토콜 정책으로 HTTPS만을 선택합니다. 그런 다음 허용되는 HTTP 메서드GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE를 선택합니다. HTTP/2를 통한 gRPC 요청 허용에서 활성화를 선택합니다.

CloudFront - 뷰어 정책

캐시 키 및 오리진 요청에서 AllViewer오리진 요청 정책으로 선택합니다.

기본 캐시 정책은 CacheOptimized이지만 gRPC는 캐싱 가능한 API 트래픽이 아닙니다. 따라서 CachingDisabled캐시 정책으로 선택합니다.

CloudFront - 캐시 정책

AWS WAF는 가용성에 영향을 미치거나 보안을 침해하거나 과도한 리소스를 소비할 수 있는 일반적인 웹 익스플로잇 및 봇으로부터 사용자를 보호하는 데 도움이 됩니다. AWS WAF는 gRPC 트래픽에서 요청의 HTTP 헤더를 검사하고 액세스 제어를 적용할 수 있습니다. protobuf 형식의 요청 본문은 검사하지 않습니다.

이 데모에서는 AWS WAF를 사용하지 않기로 합니다. Web Application Firewall(WAF)에서 보안 보호 활성화 안 함을 선택합니다.

CloudFront - 보안

다른 옵션도 모두 기본값으로 유지합니다. HTTP/2 지원이 기본적으로 선택되어 있습니다. gRPC에 필요하므로 비활성화하지 마세요.

마지막으로 배포판 생성을 선택합니다.

CloudFront - 배포판 생성

일반적인 설정 외에는 gRPC를 활성화하는 스위치 하나밖에 없습니다. 이 스위치를 켜면 HTTP/2 및 HTTP POST가 활성화된 경우 CloudFront가 gRPC 클라이언트 트래픽을 감지하여 gRPC 오리진으로 전달합니다.

몇 분 후 배포판이 준비됩니다. CloudFront 배포판의 엔드포인트 URL을 복사하여 붙여 넣고, 앞서 생성한 로드 밸런서 대신 CloudFront를 가리키도록 클라이언트 측 앱을 변경합니다.

gRPC 클라이언트 애플리케이션 데모 - 소스 코드

애플리케이션을 다시 테스트하면, 잘 작동하는 것을 확인할 수 있습니다.

gRPC 클라이언트 애플리케이션 데모 - 실행

요금 및 가용성
추가 비용 없이 600개가 넘는 모든 CloudFront 엣지 로케이션에서 gRPC 오리진을 사용할 수 있습니다. 일반적인 요청 및 데이터 전송 요금이 적용됩니다.

지금 바로 CloudFront 오리진을 gRPC 엔드포인트로 설정하세요.

— seb