Eventarc 및 Workflows로 이벤트 기반 조정 구현

1. 소개

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

Eventarc를 사용하면 Cloud Run 서비스를 다양한 소스의 이벤트와 쉽게 연결할 수 있습니다. 마이크로서비스가 느슨하게 결합 및 분산된 이벤트 기반 아키텍처를 빌드할 수 있습니다. 이벤트 수집, 전송, 보안, 승인, 오류 처리를 자동으로 처리합니다.

Workflows는 사용자가 정의한 워크플로에 따라 서비스를 실행하는 완전 관리형 조정 플랫폼입니다. 이러한 워크플로는 Cloud Run 또는 Cloud Functions에서 호스팅되는 서비스, Cloud Vision AI 및 BigQuery와 같은 Google Cloud 서비스와 HTTP 기반 API를 결합할 수 있습니다.

이 Codelab에서는 이미지 처리를 위해 마이크로서비스의 이벤트 기반 조정을 빌드합니다. Workflows를 사용하여 이미지 처리 Cloud Functions 4개의 순서, 입력, 출력을 조정합니다. 그런 다음 Eventarc를 사용하여 느슨하게 결합된 방식으로 Cloud Storage 이벤트에 응답하도록 조정을 사용 설정합니다.

최종적으로는 이미지 처리를 위한 유연하면서도 구조화된 서버리스 아키텍처를 완성하게 됩니다.

e372ceed8c26c5fb.png

학습할 내용

  • Eventarc 및 Workflows 개요
  • Cloud Functions 서비스 배포 방법
  • Workflows를 사용하여 서비스를 조정하는 방법
  • Eventarc를 사용하여 Workflows에서 Cloud Storage 이벤트에 응답하는 방법

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

55efc1aaa7a4d3ad.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

7ffe5cbb04455448.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab의 모든 작업은 브라우저 내에서 수행할 수 있습니다. 아무것도 설치할 필요가 없습니다.

gcloud 설정

Cloud Shell에서 프로젝트 ID와 애플리케이션을 배포할 리전을 설정합니다. 이러한 변수를 PROJECT_IDREGION 변수로 저장합니다. 사용 가능한 리전은 Cloud Functions 위치를 참조하세요.

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

소스 코드 가져오기

애플리케이션의 소스 코드는 eventarc-samples 저장소의 processing-pipelines 폴더에 있습니다.

저장소를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git

eventarc-samples/processing-pipelines 폴더로 이동합니다.

cd eventarc-samples/processing-pipelines

3. 아키텍처 개요

애플리케이션의 아키텍처는 다음과 같습니다.

6aa6fbc7721dd6b6.png

  1. Cloud Storage 생성 이벤트를 생성하는 입력 버킷에 이미지가 저장됩니다.
  2. Cloud Storage 생성 이벤트는 Cloud Storage 트리거를 통해 Eventarc에서 읽고 Workflows에 CloudEvent로 전달됩니다.
  3. 워크플로의 첫 번째 단계인 Cloud 함수 서비스인 필터는 Vision API를 사용하여 이미지가 안전한지 확인합니다. 이미지가 안전한 경우 Workflows에서 다음 단계를 계속 진행합니다.
  4. 워크플로의 두 번째 단계인 Cloud 함수 서비스인 Labeler에서는 Vision API를 사용하여 이미지의 라벨을 추출하고 출력 버킷에 라벨을 저장합니다.
  5. 세 번째 단계인 또 다른 Cloud 함수 서비스인 Reducer는 ImageSharp를 사용하여 이미지의 크기를 조절하고, 크기가 조절된 이미지를 출력 버킷에 저장합니다.
  6. 마지막 단계인 또 다른 Cloud 함수 서비스인 Watermarker는 ImageSharp를 사용하여 크기가 조절된 이미지에 라벨러의 라벨 워터마크를 추가하고 이미지를 출력 버킷에 저장합니다.

애플리케이션은 Cloud Storage 이벤트에 의해 트리거되므로 이벤트 기반입니다. 이미지 처리는 워크플로에서 이루어지므로 이는 조정입니다. 결국 이는 이미지를 처리하기 위한 유연하면서도 구조화된 서버리스 아키텍처를 위한 이벤트 기반 조정입니다.

4. 버킷 만들기

사용자가 이미지를 업로드할 입력 버킷과 이미지 처리 파이프라인을 위한 출력 버킷을 만들어 처리된 이미지를 저장합니다.

Cloud Shell에서 다음 명령어를 실행해 보세요.

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. 필터 서비스 배포

먼저 첫 번째 서비스를 배포해 보겠습니다. 이 Cloud Functions 서비스는 버킷 및 파일 정보를 수신하고 Vision API를 사용하여 이미지가 안전한지 확인하며 결과를 반환합니다.

먼저 Cloud Functions gen2 및 Vision API에 필요한 서비스를 사용 설정합니다.

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com

최상위 processing-pipelines 폴더 내에서 서비스를 배포합니다.

SERVICE_NAME=filter

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

함수가 배포되면 나중에 이 URL이 필요하므로 변수에 서비스 URL을 설정합니다.

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. 라벨러 서비스 배포

두 번째 Cloud Functions 서비스가 버킷 및 파일 정보를 수신하고 Vision API로 이미지 라벨을 추출한 후 출력 버킷에 라벨을 저장합니다.

최상위 processing-pipelines 폴더 내에서 서비스를 배포합니다.

SERVICE_NAME=labeler

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

함수가 배포되면 나중에 이 URL이 필요하므로 변수에 서비스 URL을 설정합니다.

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. 크기 조절 서비스 배포

이 Cloud Functions 서비스는 버킷 및 파일 정보를 수신하고, ImageSharp를 사용하여 이미지 크기를 조절하고, 이미지를 출력 버킷에 저장합니다.

최상위 processing-pipelines 폴더 내에서 서비스를 배포합니다.

SERVICE_NAME=resizer

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \
  --timeout=120s

크기 조절 함수가 처리하는 데 추가 시간을 허용하도록 timeout 값 2분에 유의하세요.

함수가 배포되면 나중에 이 URL이 필요하므로 변수에 서비스 URL을 설정합니다.

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. 워터마크 서비스 배포

이 Cloud Functions 서비스는 버킷, 파일, 라벨 정보를 수신하고 파일을 읽은 후 ImageSharp를 사용하여 이미지에 라벨을 워터마크로 추가하고 이미지를 출력 버킷에 저장합니다.

최상위 processing-pipelines 폴더 내에서 서비스를 배포합니다.

SERVICE_NAME=watermarker

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

함수가 배포되면 나중에 이 URL이 필요하므로 변수에 서비스 URL을 설정합니다.

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

이 시점에서 네 가지 Cloud Functions를 모두 배포하고 실행해야 합니다.

76a218568982c90c.png

9. 워크플로 정의 및 배포

Workflows를 사용하여 필터, 라벨러, 크기 조절, 워터마크 처리 서비스를 워크플로에 통합합니다. Workflows는 정의된 매개변수를 사용하여 순서대로 이러한 서비스를 호출하는 과정을 조정합니다.

먼저 Workflows에 필요한 서비스를 사용 설정합니다.

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

정의

Workflows는 CloudEvent를 매개변수로 수신합니다. 트리거를 만들면 Eventarc에서 가져옵니다. 처음 두 단계에서 Workflows는 이벤트를 기록하고 이벤트에서 버킷 및 파일 정보를 추출합니다.

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

filter 단계에서 Workflows는 앞서 배포한 필터 서비스를 호출합니다. 그런 다음 파일 안전을 로깅하고 확인합니다.

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

label 단계에서 Workflows는 라벨러 서비스를 호출하고 응답 (상위 3개 라벨)을 캡처합니다.

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

resize 단계에서 Workflows는 크기 조절 서비스를 호출하고 응답 (크기가 조절된 이미지의 버킷 및 파일)을 캡처합니다.

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

watermark 단계에서 Workflows는 크기가 조절된 이미지와 라벨을 사용하여 워터마커 서비스를 호출하고 결과 (크기가 조절되고 워터마크가 적용된 이미지)를 캡처합니다.

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

final 단계에서 Workflows는 라벨러, 크기 조절, 워터마크 처리 서비스에서 HTTP 상태 코드를 반환합니다.

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

배포

워크플로를 배포하기 전에 서비스 URL을 수동으로 또는 sed를 사용하여 배포된 함수의 URL로 바꿉니다.

최상위 processing-pipelines 폴더에서 workflows.yaml 파일이 있는 image-v3 폴더로 이동합니다.

cd image-v3/

sed를 실행하여 자리표시자 URL을 배포된 서비스의 실제 URL로 바꿉니다.

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

워크플로를 배포합니다.

WORKFLOW_NAME=image-processing

gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

몇 초 후 콘솔에 배포된 워크플로가 표시됩니다.

92cf4e758bdc3dde.png

10. 트리거 만들기

이제 워크플로가 배포되었으므로 마지막 단계는 Eventarc 트리거를 사용하여 워크플로를 Cloud Storage 이벤트에 연결하는 것입니다.

1회 설정

먼저 Eventarc에 필요한 서비스를 사용 설정합니다.

gcloud services enable \
 eventarc.googleapis.com

Eventarc 트리거에서 사용할 서비스 계정을 만듭니다.

SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Eventarc trigger image processing service account"

서비스 계정을 사용하여 Eventarc에서 Workflows를 호출할 수 있도록 workflows.invoker 역할을 부여합니다.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/workflows.invoker \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

eventarc.eventReceiver 역할을 부여합니다. 서비스 계정은

Cloud Storage 트리거:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Cloud Storage 서비스 계정에 pubsub.publisher 역할을 부여합니다. 이는 Eventarc의 Cloud Storage 트리거에 필요합니다.

STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$STORAGE_SERVICE_ACCOUNT \
    --role roles/pubsub.publisher

만들기

다음 명령어를 실행하여 트리거를 만듭니다. 이 트리거는 입력 Cloud Storage 버킷에서 새 파일 생성 이벤트를 필터링하여 앞에서 정의한 워크플로로 전달합니다.

TRIGGER_NAME=trigger-image-processing

gcloud eventarc triggers create $TRIGGER_NAME \
  --location=$REGION \
  --destination-workflow=$WORKFLOW_NAME \
  --destination-workflow-location=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET1" \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Cloud 콘솔의 Eventarc 섹션에서 트리거가 생성되고 준비되는 것을 확인할 수 있습니다.

14330c4fa2451bc0.png

11. 파이프라인 테스트

이미지 처리 파이프라인이 Cloud Storage에서 이벤트를 수신할 준비가 되었습니다. 파이프라인을 테스트하려면 입력 버킷에 이미지를 업로드합니다.

gsutil cp beach.jpg gs://$BUCKET1

사진을 업로드하는 즉시 워크플로 실행이 활성 상태로 표시됩니다.

36d07cb63c39e7d9.png

1분 정도 지나면 실행이 성공했음을 확인할 수 있습니다. 워크플로의 입력과 출력도 확인할 수 있습니다.

229200c79d989c25.png

출력 버킷의 콘텐츠를 나열하면 크기가 조절된 이미지, 크기가 조절된 이미지 및 워터마크가 적용된 이미지, 이미지 라벨이 표시됩니다.

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

크기가 조정되고 워터마크가 적용된 이미지를 열어 결과를 다시 확인해 보세요.

75f3c0019ca842ce.jpeg

12. 축하합니다

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • Eventarc 및 Workflows 개요
  • Cloud Functions 서비스 배포 방법
  • Workflows를 사용하여 서비스를 조정하는 방법
  • Eventarc를 사용하여 Workflows에서 Cloud Storage 이벤트에 응답하는 방법