[Google Cloud] Cloud Run 서비스 간 내부 통신하기 — Private Google Access 활용

Kiwon Lee
google-cloud-apac
Published in
14 min readApr 19, 2023

안녕하세요, 이기원 입니다.

Cloud Run 을 사용하면 서버리스로 컨테이너 기반 워크로드들을 쉽고 빠르게 실행할 수 있습니다.

특히, MSA(Micro Service Architecture)로 구성된 컨테이너 워크로드들을 Cloud Run 에 배포하는 경우, Cloud Run 서비스 간에 내부 통신이 필요한 경우가 있습니다. 예를 들자면 Cloud Run 서비스 A 에서 Cloud Run 서비스 B 를 호출하는 경우입니다.

이번 글에서는 Serverless VPC Access 와 Private Google Access 기능을 사용하여 Cloud Run 서비스 간에 내부 통신 하는 방법에 대해 알아보겠습니다.

참고로, 아래 블로그 글들을 먼저 보시면 Cloud Run 서비스 간의 다른 통신 방식에 대해서도 이해하실수 있습니다.

먼저 본 글에서 나오는 핵심 기술들에 대해 알아보겠습니다.

  • Serverless VPC Access

Serverless VPC Access 는 Cloud Run 과 같은 서버리스(Cloud Functions, App Engine 등)가 VPC 네트워크에 연결할 수 있는 방법을 제공 하고, 이것을 통하면 Cloud Run 에서 내부 DNS 나 사설 IP 를 사용하여 VPC 네트워크에 액세스 가능합니다. 참고로, 이 기능은 Cloud Run 이 내부 통신을 하기 위해 가장 필수적인 기능이기 때문에, 이후 연관 글 에서도 계속 등장할 기능 입니다.

https://cloud.google.com/vpc/docs/serverless-vpc-access?hl=ko

생성한 Serverless VPC Access 는 Cloud Run 서비스 생성 시 다음 두 가지 옵션 중 하나를 선택 해서 연동할 수 있습니다.

https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ko#manage

  • Route only requests to private IPs through the VPC connector (기본값)
    — VPC connector 가 연결되어 있는 경우, Cloud Run 에서 나가는 트래픽의 목적지가 다음에 해당 되는 경우, VPC connector 를 통하여 VPC 네트워크로 라우팅 되고, 그 외의 요청은 VPC 네트워크를 통하지 않고 외부 인터넷으로 라우팅 됩니다.
    — RFC1918, RFC6598, 199.36.153.4/30, 199.36.153.8/30
  • Route all traffic through the VPC connector
    — VPC connector 가 연결되어 있는 경우, Cloud Run 에서 나가는 모든 트래픽은 항상 VPC Connector 를 통해 VPC 네트워크로 라우팅 됩니다.

그리고, 이정운 님께서 포스팅 하신 다음 글에서 Serverless VPC Access 에 대한 내용을 더 확인하실 수 있습니다.

​​[GCP]Serverless 서비스인 Cloud Run 알아보기4부 — 서버리스VPC액세스

  • Private Google Access

두 번째 설명드릴 기능은 Private Google Access 입니다. Private Google Access는 외부 IP 주소 없이 내부 IP 주소만 가진 리소스들이 Google API 및 서비스에 접근 할 수 있는 기능을 제공합니다.

https://cloud.google.com/vpc/docs/private-google-access?hl=ko

Private Google Access 는 Cloud Run 서비스 생성 시 자동으로 할당되는 *.run.app 도메인을 지원하고 있기 때문에, 이것을 활용하면 내부 IP 만 가진 Serverless VPC Connector 에서 Cloud Run 의 URL 에 접근 가능합니다. 또한 Private Google Access를 통해 Google API 에 접근하는 통신은 Google 네트워크에 내에만 유지됩니다.

https://cloud.google.com/vpc/docs/configure-private-google-access?hl=ko#domain-options

위에서 설명 드린 두 가지 기능을 조합해 보면,

1. Cloud Run 에서 Serverless VPC Access 를 통해 VPC 네트워크에 접근

2. 이 때, Serverless VPC Access 를 생성한 Subnet 에 Private Google Access 를 설정

3. 2번으로 인해 내부 IP 만 가진 Serverless VPC Access 커넥터에서 Cloud Run 서비스의 URL(*.run.app) 에 접근 가능하고, 이 경우 트래픽은 Google 네트워크 내에만 유지됩니다.

https://cloud.google.com/run/docs/securing/private-networking#from-vpc

즉, Serverless VPC Access 와 Private Google Connect 를 활용하면 트래픽이 Google 내부에만 유지되는 방식으로 Cloud Run 간 내부 통신이 가능합니다.

이 내용을 Bookinfo 샘플 애플리케이션을 통해 확인 해 보겠습니다. Bookinfo는 MSA 구조로 여러 컨테이너들로 구성되어 있습니다. 사용자가 productpage 를 호출하면 내부에서 details 와 reviews 를 호출 한 후 응답값으로 페이지를 구성한 후 응답하는 구조입니다.

https://github.com/istio/istio/tree/master/samples/bookinfo

이 애플리케이션을 Cloud Run 에 배포해 보겠습니다.

  1. VPC 네트워크를 생성합니다.
gcloud compute networks create lb-network \
--subnet-mode=custom

2. 생성된 VPC 네트워크에 Subnet 을 추가합니다.

  • Private Google Access 는 Subnet 생성 시 활성화 할 수 있기 때문에 해당 옵션을 On 합니다.
  • 생성한 Subnet 을 Serverless VPC Access 에서 사용하기 위해서는 “사용되지 않는 /28 의 CIDR 범위가 필요” 합니다. 그렇기 때문에 /28 범위의 CIDR 을 입력해서 Subnet 을 생성합니다.

https://cloud.google.com/vpc/docs/configure-private-google-access?hl=ko#enabling-pga

3. 1 에서 생성된 VPC 네트워크(lb-network-pga)와 2 에서 생성된 Subnet(subnet-sva) 정보를 참조 하여 Serverless VPC access 를 생성합니다.

  • 생성 시 할당할 IP 범위를 지정하는 방식과, 기 생성된 Subnet 범위를 선택하는 두가지의 방식을 지원하는데, 반드시 2번에서 생성한 Subnet 을 선택 해야 Private Google Access 가 적용된 Subnet 에 Serverless VPC Access 를 생성할 수 있습니다.

https://cloud.google.com/vpc/docs/configure-serverless-vpc-access?hl=ko#create-connector

4. reviews 를 Cloud Run 서비스에 배포합니다. Ingress 옵션은 internal 로 설정합니다.

gcloud run deploy reviews \
--image=docker.io/istio/examples-bookinfo-reviews-v1:1.17.0 \
--allow-unauthenticated \
--ingress=internal \
--port=9080 \
--region=us-central1

5. details 를 Cloud Run 서비스에 배포합니다. Ingress 옵션은 internal 로 설정합니다.

gcloud run deploy details \
--image=docker.io/istio/examples-bookinfo-details-v1:1.17.0 \
--allow-unauthenticated \
--ingress=internal \
--port=9080 \
--region=us-central1

6. productpage 는 details 와 reviews 호출을 위한 접속정보를 환경변수로 받고 있습니다. 배포된 Cloud Run(details) 와 Cloud Run(reviews) 의 상세 정보에 들어가면 각각 생성된 URL 을 확인할 수 있습니다.

7. Cloud Run(reviews), Cloud Run(details)를 호출하는 productpage 를 Cloud Run 서비스로 배포합니다.

  • Ingress 옵션은 All (productpage 는 외부에서 접근해야 하기 때문에 All 로 설정합니다.)
  • details 와 reviews 호출을 위한 접속정보를 환경변수로 전달
    — Cloud Run의 Environment variables 를 통해 Key = Value 로 등록
    — 6번에서 확인된 Cloud Run 의 URL 정보를 아래와 같이 ( — set-env-vars 를 사용하여) 환경변수로 전달합니다.
  • Cloud Run 서비스 생성 시, Networking 탭에서 Serverless VPC Connector 의 연결과 옵션을 선택합니다.
    https://cloud.google.com/run/docs/configuring/connecting-vpc?hl=ko#configuring
    — 3번에서 생성한 Serverless VPC Connector (bookinfo-sva) 를 선택합니다. — 기본 연결 옵션(Route only requests to private IPs through the VPC connector)으로 설정하는 경우, VPC 내부를 목적지로 하는 트래픽만 Serverless VPC Connector 를 통하게 되는데, Cloud Run 은 VPC 네트워크 내에 있는 리소스가 아니다 보니 Serverless VPC Access 로 라우팅 되지 않습니다. 그렇기 때문에 (Route all traffic through the VPC connector) 를 선택해서 모든 트래픽을 Serverless VPC Connector 를 통하도록 설정합니다.
    https://cloud.google.com/run/docs/securing/private-networking?hl=ko#from-gcp-serverless
gcloud run deploy productpage \
--image=us-central1-docker.pkg.dev/kwlee-app-eco-sandbox/docker-repo/bookinfo-productpage-v1:1.17.0 \
--allow-unauthenticated \
--port=9080 \
--set-env-vars=\
DETAILS_HOSTNAME=details-cvw6q7xtiq-uc.a.run.app,\
DETAILS_SERVICE_PORT=80,\
REVIEWS_HOSTNAME=reviews-cvw6q7xtiq-uc.a.run.app,\
REVIEWS_SERVICE_PORT=80 \
--ingress=all \
--vpc-connector=projects/kwlee-app-eco-sandbox/locations/us-central1/connectors/bookinfo-sva \
--vpc-egress=all-traffic \
--region=us-central1

다음과 같이 3개의 Cloud Run 서비스를 배포했고, details 와 reviews 는 내부 네트워크로 부터의 요청만 허용되고, productpage는 인터넷으로 부터 들어오는 요청 포함하여 모든 요청이 허용됩니다.

Ingress 옵션 관련해서는 다음에서 추가 확인 가능합니다.

https://cloud.google.com/run/docs/securing/ingress?hl=ko#settings

배포된 워크로드의 정상 동작 확인을 위해 Cloud Run(productpage)서비스의 URL 을 확인합니다.

Cloud Run(productpage) 의 URL 로 접속해 보면, 아래와 같이 환경변수로 전달한 Cloud Run(details) 와 Cloud Run(reviews) 의 URL 정보가 정상적으로 확인됩니다.

Cloud Run(productpage) 서비스 URL 에 path 를 추가해서 접속해 보면 아래와 같이 정상적으로 Cloud Run(details) 와 Cloud Run(reviews) 의 값을 가져와서 노출되는 것을 볼 수 있습니다. 화면의 오른쪽 박스가 Cloud Run(details) 를 호출해서 받은 정보이고, 왼쪽 박스가 Cloud Run(reviews) 를 호출해서 받은 정보입니다.

마지막으로, Ingress 설정이 internal 로 되어 있기 때문에, Cloud Run(details)을 인터넷 구간에서 직접 호출하면 다음과 같이 Error 결과를 확인할 수 있습니다.

이번 글에서는 Private Google Access 기능을 사용하여 Cloud Run 서비스 간 내부 통신 하는 방식에 대해 알아 보았습니다.

감사합니다.

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google Cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

--

--