[GCP]Serverless 서비스인 Cloud Run 알아보기 6부 — Cloud logging 과 Eventarc 를 통한 이벤트 처리

이정운 (Jungwoon Lee)
google-cloud-apac
Published in
12 min readSep 6, 2021

안녕하세요 이정운 입니다.

Google Cloud 에서 제공하는 컨테이너 기반의 Serverless 솔루션인 Cloud Run 에 대해서 살펴보고 실제 테스트해보면서 써볼 수 있는 시간을 가져보는 시리즈를 하단과 같이 진행하고 있습니다.

[GCP]Serverless 서비스인 Cloud Run 알아보기 1부 — Cloud Run 개요
[GCP]Serverless 서비스인 Cloud Run 알아보기 2부 — 로컬에서 개발하기(Cloud Code)
[GCP]Serverless 서비스인 Cloud Run 알아보기 3부 — 업데이트 및 트래픽 조정
[GCP]Serverless 서비스인 Cloud Run 알아보기 4부 — 서버리스 VPC 액세스
[GCP]Serverless 서비스인 Cloud Run 알아보기 5부 — Eventarc 를 통한 이벤트 받기

이번 이야기에서 살펴볼 것은 지난 이야기에서 살펴본 Eventarc 를 다른 GCP 솔루션과 연동하여 좀 더 다양한 이벤트를 받을 수 있는 방법에 대해서 이야기를 해보려고 합니다. 해당 구성을 위한 여러가지 방법이 있을 수 있겠지만 이번 이야기에서는 Cloud Logging 을 활용해서 VM, GKE 와 같은 인프라스트럭처나 애플리케이션에서 발생될 수 있는 다양한 로그를 기반으로 Cloud Run 에서 이벤트 처리를 하는 구조를 한번 살펴보도록 하겠습니다.

Google Cloud Console을 사용하여 로그 내보내기
https://cloud.google.com/logging/docs/export/configure_export_v2

간단한 예제 구성을 위해서 GKE 의 pod 이벤트가 발생되면 log 가 발생되는데 이를 활용하여 pod 상태 변경시 Eventarc 로 이벤트를 받아서 Cloud Run 에서 필요한 로직을 처리하는 아키텍처를 구성하고 살펴보도록 하겠습니다. 해당 부분을 좀 더 이해하기 쉽게 도식화하면 하단과 같은 흐름이 되지 않을까 합니다.

그럼 이번에도 역시 설명보다는 실제 테스트를 직접 해보면서 Cloud logging 과 Eventarc 를 통한 이벤트 처리에 대한 부분을 살펴볼 수 있는 시간을 가져보도록 하겠습니다.

#1) GKE 및 Cloud Logging 구성 및 이벤트 전송 확인

컨테이너화된 웹 애플리케이션 배포
https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app

GKE 공식 튜토리얼을 활용해서 샘플로 활용할 GKE 환경을 구성합니다. 또는, 기존 GKE 환경이 있다면 해당 GKE 를 활용해도 됩니다.

테스트를 위한 GKE 환경이 필요한 경우에는 하단과 같이 GCP 관리콘솔 > Kubernetes Engine 메뉴로 가서 디폴트 형태로 간단하게 하나 생성합니다.

정상적으로 생성되었는지 확인을 위해서 credential 을 받은 후 kubectl 명령이 동작하는지 확인합니다.

gcloud container clusters get-credentials hello-cluster-1 --zone asia-northeast3-a --project jwlee-myproject-01
kubectl get nodes -o wide

그리고 간단한 테스트를 위해서 샘플 nginx 컨테이너를 deployment 로 배포합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

배포된 nginx 의 deployments 의 replicas 의 개수를 1개, 3개등으로 변경해보면서 Cloud Logging 으로 확인해 보면 하단과 같이 pod 의 Life cycle 과 동일하게 업데이트 이벤트가 로깅되는 것을 확인할 수 있습니다.

resource.type="k8s_pod"
jsonPayload.involvedObject.kind="Pod"
jsonPayload.kind="Event"
jsonPayload.metadata.managedFields.operation="Update"

참고로 pod 의 event 발생시 생성되는 로그의 형태는 일반적으로 하단과 같습니다.

예) pod 의 start 관련 event log

예) pod 의 stop 관련 event log

예) pod 의 BackOff 관련 event log

테스트를 위한 기본 GKE 구성이 완료되었으므로 pod 의 event 를 받고 처리하기 위해서 GCP 관리콘솔 > Pub/Sub 메뉴에서 Pubsub 토픽을 하나 기본값으로 생성합니다.

다음으로 Cloud Logging 으로 돌아가서 event 를 받을 log 를 이전과 동일하게 확인후에 해당 이벤트를 Cloud Pubsub 으로 내보내기 위해서 Create Sync 버튼을 클릭합니다.

이때 Sink 의 Destination 을 미리 만들어둔 Pubsub 의 Topic 이름으로 지정만 하면 됩니다.

설정이 완료되었으면 정상적으로 수행되는지 확인하기 위해서 pod 에서 event 를 발생시킵니다. (예: pod 삭제와 생성 또는 replica 개수 변경)

GCP 관리콘솔 > Pubsub > 생성한 topic 이름의 메뉴로 가서 ‘view messages’ 메뉴를 클릭해서 정상적으로 event 메세지가 Pubsub topic 에 도착하는지 확인합니다. (처음에는 약간의 시간 필요)

#2) Eventarc 설정 및 테스트

Receiving a Pub/Sub event
https://cloud.google.com/eventarc/docs/run/pubsub#existing-pubsub-topic

Cloud Logging 을 활용해서 GKE 의 Pod 이벤트가 정상적으로 Pubsub 에 수신된 것을 확인했으면 이를 받아서 로직을 처리할 Cloud Run 이 필요하기 때문에 상단의 튜토리얼에 있는 샘플을 활용하도록 하겠습니다.(해당 샘플 애플리케이션은 간단하게 받은 이벤트를 그대로 로그로 찍는 애플리케이션입니다.) Github 에서 샘플 코드를 받아서 컨테이너 이미지를 빌드하고 Cloud Run 에 배포합니다.

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd nodejs-docs-samples/eventarc/pubsub/
gcloud builds submit --tag gcr.io/$(gcloud config get-value project)/events-pubsub
gcloud run deploy helloworld-events-pubsub-tutorial \
--image gcr.io/$(gcloud config get-value project)/events-pubsub \
--allow-unauthenticated \
--region=asia-northeast3

Cloud Run 배포가 완료되면 이제 Pubsub 이벤트를 받기 위해서 Eventarc trigger 설정을 하단과 같이 생성합니다.

gcloud eventarc triggers create events-pubsub-trigger --location=asia-northeast3 --destination-run-service=helloworld-events-pubsub-tutorial --destination-run-region=asia-northeast3 --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" --transport-topic=projects/jwlee-myproject-01/topics/pod-event-topic-01

설정 작업이 완료되었으면 기존에 배포된 nginx 컨테이너의 개수를 조정하여 pod 이벤트를 발생시켜 봅니다.

Cloud Logging 에서 이전에 배포한 Cloud Run 의 로그를 살펴보면 GKE 환경에서 pod 이벤트 발생이 정상적으로 트리거되어 Cloud Run 으로 배포한 샘플 애플리케이션에서 원하는 로직이 수행되고 해당 이벤트가 로그로 출력되는 것을 확인 가능합니다.

resource.type="cloud_run_revision" resource.labels.service_name="helloworld-events-pubsub-tutorial"

추신 #1) Cloud Run 의 최대 동시 처리 요청(concurrency)이 최대 1000 까지 증가되었습니다.

Concurrency
https://cloud.google.com/run/docs/about-concurrency

추신 #2) 이제 Cloud Run 에서 기본적으로 trace 를 생성하게 되어서 Cloud Trace 를 통해서 성능 분석을 좀 더 쉽게 수행가능해졌습니다.

Zero effort performance insights for popular serverless offerings
https://cloud.google.com/blog/products/operations/find-serverless-application-performance-issues-easier

추신 #3) 소스 코드에서 바로 Cloud Run 으로 배포가능한 ‘Deploying from source code’ 기능이 GA 되었습니다.

Deploying from source code
https://cloud.google.com/run/docs/deploying-source-code

지금까지 Cloud Logging 과 Eventarc 를 통해서 GKE 에서 발생된 pod 이벤트를 캐치하여 원하는 로직을 수행하는 Cloud Run 을 트리거하는 테스트를 수행해봤습니다. 특히, Cloud Logging 의 Sync 기능을 사용하였기 때문에 GCE(VM), GKE 등 다양한 로그를 활용해서 이벤트를 발생시켜서 Cloud Run 을 수행할 수 있기 때문에 다양한 형태의 이벤트 시스템 구성에 유용하지 않을까 합니다. 그럼 이번 포스팅은 여기서 마무리하고 다음에 다른 포스팅으로 다시 돌아오겠습니다.

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

참고 자료 #1

Google Cloud Console을 사용하여 로그 내보내기
https://cloud.google.com/logging/docs/export/configure_export_v2

컨테이너화된 웹 애플리케이션 배포
https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app

Receiving a Pub/Sub event
https://cloud.google.com/eventarc/docs/run/pubsub#existing-pubsub-topic

Concurrency
https://cloud.google.com/run/docs/about-concurrency

Zero effort performance insights for popular serverless offerings
https://cloud.google.com/blog/products/operations/find-serverless-application-performance-issues-easier

--

--

이정운 (Jungwoon Lee)
google-cloud-apac

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)