이 튜토리얼에서는 Eventarc를 사용하여 공개 BigQuery 데이터 세트에 대한 쿼리를 예약하고 데이터를 기반으로 차트를 생성하고 이메일을 통해 차트에 대한 링크를 공유하는 처리 파이프라인을 빌드하는 방법을 보여줍니다.
SendGrid API 키 만들기
SendGrid는 이메일 서버를 유지관리하지 않고도 이메일을 전송할 수 있는 클라우드 기반 이메일 제공업체입니다.
- SendGrid에 로그인하고 Settings(설정) > API Keys(API 키)로 이동합니다.
- API 키 만들기를 클릭합니다.
- 키의 권한을 선택합니다. 키에는 최소한 이메일을 전송할 수 있는 Mail send 권한이 필요합니다.
- Save(저장)를 클릭하여 키를 만듭니다.
- SendGrid에서 새로운 키가 생성됩니다. 이 키는 키의 유일한 사본이므로 나중을 위해 키를 복사하여 저장해 두세요.
GKE 클러스터 만들기
GKE 내에서 실행 중인 애플리케이션에서 Google Cloud 서비스에 액세스할 수 있도록 GKE용 워크로드 아이덴티티 제휴를 사용 설정하여 클러스터를 만듭니다. 또한 Eventarc를 사용해서 이벤트를 전달하려면 GKE용 워크로드 아이덴티티 제휴가 필요합니다.
CloudRun
,HttpLoadBalancing
,HorizontalPodAutoscaling
부가기능이 사용 설정된 상태에서 Knative serving용 GKE 클러스터를 만듭니다.gcloud beta container clusters create $CLUSTER_NAME \ --addons=HttpLoadBalancing,HorizontalPodAutoscaling,CloudRun \ --machine-type=n1-standard-4 \ --enable-autoscaling --min-nodes=2 --max-nodes=10 \ --no-issue-client-certificate --num-nodes=2 \ --logging=SYSTEM,WORKLOAD \ --monitoring=SYSTEM \ --scopes=cloud-platform,logging-write,monitoring-write,pubsub \ --zone us-central1 \ --release-channel=rapid \ --workload-pool=$PROJECT_ID.svc.id.goog
클러스터 만들기가 완료될 때까지 몇 분 정도 기다립니다. 만드는 과정에서 무시해도 안전한 경고가 표시될 수 있습니다. 클러스터가 만들어지면 다음과 유사한 출력이 표시됩니다.
Creating cluster ...done. Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/events-cluster].
Docker 컨테이너 이미지를 저장할 Artifact Registry 표준 저장소를 만듭니다.
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$CLUSTER_LOCATION
REPOSITORY
를 저장소의 고유한 이름으로 바꿉니다.
GKE 서비스 계정 구성
기본 컴퓨팅 서비스 계정 역할을 하도록 GKE 서비스 계정을 구성합니다.
서비스 계정 간에 Identity and Access Management(IAM) 바인딩을 만듭니다.
PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud iam service-accounts add-iam-policy-binding \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/default]" \ $PROJECT_NUMBER-compute@developer.gserviceaccount.com
컴퓨팅 서비스 계정의 이메일 주소를 사용하여 GKE 서비스 계정에
iam.gke.io/gcp-service-account
주석을 추가합니다.kubectl annotate serviceaccount \ --namespace default \ default \ iam.gke.io/gcp-service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
GKE 대상 사용 설정
Eventarc가 GKE 클러스터의 리소스를 관리할 수 있도록 하려면 GKE 대상을 사용 설정하고 Eventarc 서비스 계정을 필요한 역할과 결합합니다.
Eventarc에 GKE 대상을 사용 설정합니다.
gcloud eventarc gke-destinations init
필요한 역할을 결합하라는 메시지가 표시되면
y
를 입력합니다.다음 역할이 결합됩니다.
roles/compute.viewer
roles/container.developer
roles/iam.serviceAccountAdmin
서비스 계정 만들기 및 액세스 역할 바인딩
Eventarc 트리거를 만들기 전에 Eventarc가 Pub/Sub 이벤트를 전달할 수 있도록 사용자 관리 서비스 계정을 설정하고 특정 역할을 부여합니다.
TRIGGER_GSA
라는 서비스 계정을 만듭니다.TRIGGER_GSA=eventarc-bigquery-triggers gcloud iam service-accounts create $TRIGGER_GSA
서비스 계정에
pubsub.subscriber
,monitoring.metricWriter
,eventarc.eventReceiver
역할을 부여합니다.PROJECT_ID=$(gcloud config get-value project) gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/pubsub.subscriber" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/monitoring.metricWriter" gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/eventarc.eventReceiver"
Cloud Storage 버킷 만들기
Cloud Storage 버킷을 만들어 차트를 저장합니다. 버킷 및 차트를 공개적으로 사용할 수 있는지, GKE 서비스와 동일한 리전에 있는지 확인합니다.
export BUCKET="$(gcloud config get-value core/project)-charts" gcloud storage buckets create gs://${BUCKET} --location=$(gcloud config get-value run/region) gcloud storage buckets update gs://${BUCKET} --uniform-bucket-level-access gcloud storage buckets add-iam-policy-binding gs://${BUCKET} --member=allUsers --role=roles/storage.objectViewer
저장소 복제
GitHub 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines
Notifier 서비스 배포
bigquery/notifier/python
디렉터리에서 차트 생성자 이벤트를 수신하고 SendGrid를 사용하여 생성된 차트의 링크를 이메일로 보내는 Knative serving 서비스를 배포합니다.
컨테이너 이미지 빌드 및 푸시:
pushd bigquery/notifier/python export SERVICE_NAME=notifier docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
이메일을 전송할 주소와 SendGrid API 키를 전달하여 컨테이너 이미지를 Knative serving에 배포합니다.
export TO_EMAILS=EMAIL_ADDRESS export SENDGRID_API_KEY=YOUR_SENDGRID_API_KEY gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars TO_EMAILS=${TO_EMAILS},SENDGRID_API_KEY=${SENDGRID_API_KEY},BUCKET=${BUCKET}
다음을 바꿉니다.
EMAIL_ADDRESS
: 생성된 차트로 연결되는 링크를 보내기 위한 이메일 주소입니다.YOUR_SENDGRID_API_KEY
: 앞에서 기록한 SendGrid API 키입니다.
서비스 URL이 표시되면 배포가 완료된 것입니다.
Notifier 서비스의 트리거 만들기
methodName이 storage.objects.create
인 Cloud Storage 감사 로그의 Knative serving 필터에 배포된 Notifier 서비스의 Eventarc 트리거입니다.
트리거를 만듭니다.
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
그러면
trigger-notifier-gke
라는 트리거가 생성됩니다.
Chart Creator 서비스 배포
bigquery/chart-creator/python
디렉터리에서 쿼리 실행자 이벤트를 수신하고 특정 국가의 BigQuery 테이블에서 데이터를 검색한 후 해당 데이터로 Matplotlib을 사용하여 차트를 생성하는 Knative serving 서비스를 배포합니다. 차트는 Cloud Storage 버킷에 업로드됩니다.
컨테이너 이미지 빌드 및 푸시:
pushd bigquery/chart-creator/python export SERVICE_NAME=chart-creator docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 popd
BUCKET
을 전달하여 컨테이너 이미지를 Knative serving에 배포합니다.gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET}
서비스 URL이 표시되면 배포가 완료된 것입니다.
Chart Creator 서비스의 트리거 만들기
Knative serving에 배포된 차트 생성자 서비스의 Eventarc 트리거는 Pub/Sub 주제에 게시된 메시지를 필터링합니다.
트리거를 만듭니다.
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
그러면
trigger-chart-creator-gke
라는 트리거가 생성됩니다.Pub/Sub 주제 환경 변수를 설정합니다.
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)'))
Query Runner 서비스 배포
processing-pipelines
디렉터리에서 Cloud Scheduler 이벤트를 수신하고 공개 코로나19 데이터 세트에서 데이터를 검색한 후 결과를 새 BigQuery 테이블에 저장하는 Knative serving 서비스를 배포합니다.
컨테이너 이미지 빌드 및 푸시:
export SERVICE_NAME=query-runner docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile . docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
PROJECT_ID
및TOPIC_QUERY_COMPLETED
를 전달하여 컨테이너 이미지를 Knative serving에 배포합니다.gcloud run deploy ${SERVICE_NAME} \ --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars PROJECT_ID=$(gcloud config get-value project),TOPIC_ID=${TOPIC_QUERY_COMPLETED}
서비스 URL이 표시되면 배포가 완료된 것입니다.
Query Runner 서비스의 트리거 만들기
Knative serving에 배포된 Query Runner 서비스의 Eventarc 트리거는 Pub/Sub 주제에 게시된 메시지를 필터링합니다.
트리거를 만듭니다.
gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \ --destination-gke-cluster=$CLUSTER_NAME \ --destination-gke-location=$CLUSTER_LOCATION \ --destination-gke-namespace=default \ --destination-gke-service=$SERVICE_NAME \ --destination-gke-path=/ \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
그러면
trigger-query-runner-gke
라는 트리거가 생성됩니다.Pub/Sub 주제의 환경 변수를 설정합니다.
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)')
작업 예약
처리 파이프라인은 두 개의 Cloud Scheduler 작업에 의해 트리거됩니다.
Cloud Scheduler에 필요한 App Engine 앱을 만들고 적절한 위치(예:
europe-west
)를 지정합니다.export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
Pub/Sub 주제에 하루에 한 번 게시하는 Cloud Scheduler 작업 두 개를 만듭니다.
gcloud scheduler jobs create pubsub cre-scheduler-uk \ --schedule="0 16 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="United Kingdom"
gcloud scheduler jobs create pubsub cre-scheduler-cy \ --schedule="0 17 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="Cyprus"
일정은 unix-cron 형식으로 지정됩니다. 예를 들어
0 16 * * *
는 작업이 매일 UTC 16:00(오후 4시)에 실행됨을 의미합니다.
파이프라인 실행
모든 트리거가 성공적으로 생성되었는지 확인합니다.
gcloud eventarc triggers list
출력은 다음과 비슷하게 표시됩니다.
NAME TYPE DESTINATION ACTIVE LOCATION trigger-chart-creator-gke google.cloud.pubsub.topic.v1.messagePublished GKE:chart-creator Yes us-central1 trigger-notifier-gke google.cloud.audit.log.v1.written GKE:notifier Yes us-central1 trigger-query-runner-gke google.cloud.pubsub.topic.v1.messagePublished GKE:query-runner Yes us-central1
Cloud Scheduler 작업 ID를 검색합니다.
gcloud scheduler jobs list
출력은 다음과 비슷하게 표시됩니다.
ID LOCATION SCHEDULE (TZ) TARGET_TYPE STATE cre-scheduler-cy us-central1 0 17 * * * (Etc/UTC) Pub/Sub ENABLED cre-scheduler-uk us-central1 0 16 * * * (Etc/UTC) Pub/Sub ENABLED
작업이 매일 오후 4시, 5시에 실행되도록 예약되어 있지만 Cloud Scheduler 작업을 수동으로 실행할 수도 있습니다.
gcloud scheduler jobs run cre-scheduler-cy gcloud scheduler jobs run cre-scheduler-uk
몇 분 후 Cloud Storage 버킷에 차트가 두 개 있는지 확인합니다.
gcloud storage ls gs://${BUCKET}
출력은 다음과 비슷하게 표시됩니다.
gs://PROJECT_ID-charts/chart-cyprus.png gs://PROJECT_ID-charts/chart-unitedkingdom.png
수고하셨습니다. 차트 링크가 포함된 2개의 이메일도 받게 됩니다.