목표
이 튜토리얼에서는 다음 단계를 진행합니다.
- 주제에 메시지를 푸시하는 Pub/Sub 주제 및 구독을 만듭니다.
- Pub/Sub에서 메시지를 사용하는 Cloud Run 작업자 풀을 배포합니다.
- 작업자 풀을 확장하기 위해 자동 확장 처리 CREMA 서비스를 배포합니다.
- 로컬에서 Python 스크립트를 실행하여 부하를 생성하여 자동 확장 서비스를 테스트합니다.
비용
이 문서에서는 비용이 청구될 수 있는 구성요소를 사용합니다 Google Cloud.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Cloud Run, Parameter Manager, Artifact Registry, Pub/Sub, Cloud Build API를 사용 설정합니다.
API 사용 설정에 필요한 역할
API를 사용 설정하려면
serviceusage.services.enable권한이 필요합니다. 프로젝트를 만든 경우 소유자 역할 (roles/owner)을 통해 이 권한을 이미 보유하고 있을 가능성이 높습니다. 그렇지 않은 경우 서비스 사용량 관리자 역할 (roles/serviceusage.serviceUsageAdmin)을 통해 이 권한을 얻을 수 있습니다. 역할을 부여하는 방법을 알아보세요.- gcloud CLI를 설치하고 초기화합니다.
- 구성요소를 업데이트합니다.
gcloud components update
- 이 튜토리얼에서는 여러 환경 변수를 사용합니다. 디버깅을 개선하려면 다음 명령어를 실행하여 설정되지 않은 로컬 환경 변수를 참조할 때 오류를 생성합니다.
set -u
- 이 튜토리얼에서 사용되는 CREMA의 다음 구성 변수를 설정합니다.
PROJECT_ID를 프로젝트 ID로 바꿉니다. Google Cloudexport PROJECT_ID=PROJECT_ID export REGION=us-central1 export TOPIC_ID=crema-pubsub-topic export SUBSCRIPTION_ID=crema-subscription export CREMA_SA_NAME=crema-service-account export CONSUMER_SA_NAME=consumer-service-account export CONSUMER_WORKER_POOL_NAME=worker-pool-consumer export CREMA_SERVICE_NAME=my-crema-service
- 다음 명령어를 실행하여 프로젝트 ID를 설정합니다.
gcloud config set project $PROJECT_ID
- 확장 트리거 빈도에 따라 Cloud Run 확장 서비스에 요금이 청구됩니다. 자세한 내용은 가격 계산기로 비용을 예상해 보세요.
필요한 역할
튜토리얼을 완료하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- Artifact Registry 저장소 관리자(
roles/artifactregistry.repoAdmin) - Cloud Build 편집자(
roles/cloudbuild.builds.editor) - Cloud Run 관리자 (
roles/run.admin) - 서비스 계정 만들기 (
roles/iam.serviceAccountCreator) - Pub/Sub 관리자 (
roles/pubsub.admin) - 서비스 계정 사용자 (
roles/iam.serviceAccountUser) - 서비스 사용량 소비자 (
roles/serviceusage.serviceUsageConsumer) - Parameter Manager 관리자 (
roles/parametermanager.admin)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
Pub/Sub 주제 및 구독 만들기
작업자를 자동 확장하려면 다음 단계에 따라 소비자 애플리케이션의 풀 구독을 만듭니다.
메시지 피드를 나타내는 Pub/Sub 주제를 만듭니다.
gcloud pubsub topics create $TOPIC_IDPub/Sub 주제에서 메시지를 사용하는 풀 구독을 만듭니다.
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID
커스텀 서비스 계정 만들기
이 튜토리얼에는 프로비저닝된 리소스를 사용하는 데 필요한 최소 권한이 있는 다음 두 서비스 계정이 필요합니다.
소비자 서비스 계정: 메시지를 처리하는 소비자 작업자 풀의 ID입니다. 다음 명령어를 실행하여 소비자 서비스 계정을 만듭니다.
gcloud iam service-accounts create $CONSUMER_SA_NAME \ --display-name="Pub/Sub consumer service account"CREMA 서비스 계정: 자동 확장 처리의 ID입니다. 다음 명령어를 실행하여 CREMA 서비스 계정을 만듭니다.
gcloud iam service-accounts create $CREMA_SA_NAME \ --display-name="CREMA service account"
커스텀 서비스 계정에 추가 권한 부여
작업자 풀을 확장하려면 커스텀 서비스 계정에 다음 권한을 부여합니다.
Parameter Manager에서 읽을 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/parametermanager.parameterViewer"작업자 풀을 확장할 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/run.developer"서비스 계정 사용자 역할을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/iam.serviceAccountUser"측정항목을 볼 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/monitoring.viewer"측정항목을 쓸 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/monitoring.metricWriter"Pub/Sub 메시지를 볼 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID." \ --role="roles/pubsub.viewer"구독에서 메시지를 가져올 수 있는 권한을 소비자 서비스 계정에 부여합니다.
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID." \ --role="roles/pubsub.subscriber"
Cloud Run 작업자 풀 배포
Pub/Sub 구독에서 메시지를 사용하는 작업자 풀을 배포하려면 다음 단계를 따르세요.
consumer라는 폴더를 만들고 디렉터리를 변경합니다.mkdir consumer cd consumerworker.py라는 파일을 만들고 다음 코드를 추가합니다.import os import time from google.cloud import pubsub_v1 from concurrent.futures import TimeoutError # Configuration PROJECT_ID = os.environ.get('PROJECT_ID') SUBSCRIPTION_ID = os.environ.get('SUBSCRIPTION_ID') subscription_path = f"projects/{PROJECT_ID}/subscriptions/{SUBSCRIPTION_ID}" print(f"Worker Pool instance starting. Watching {subscription_path}...") subscriber = pubsub_v1.SubscriberClient() def callback(message): try: data = message.data.decode("utf-8") print(f"Processing job: {data}") time.sleep(5) # Simulate work print(f"Done {data}") message.ack() except Exception as e: print(f"Error processing message: {e}") message.nack() streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback) print(f"Listening for messages on {subscription_path}...") # Wrap subscriber in a 'with' block to automatically call close() when done. with subscriber: try: # When `timeout` is not set, result() will block indefinitely, # unless an exception is encountered first. streaming_pull_future.result() except TimeoutError: streaming_pull_future.cancel() # Trigger the shutdown. streaming_pull_future.result() # Block until the shutdown is complete. except Exception as e: print(f"Streaming pull failed: {e}")Dockerfile을 만들고 다음 코드를 추가합니다.
FROM python:3.12-slim RUN pip install google-cloud-pubsub COPY worker.py . CMD ["python", "-u", "worker.py"]CREMA가 수직 확장할 수 있도록 인스턴스가 0인 소비자 작업자 풀을 배포합니다.
gcloud run worker-pools deploy $CONSUMER_WORKER_POOL_NAME \ --source . \ --region $REGION \ --service-account="$CONSUMER_SA_NAME@$PROJECT_ID." \ --instances=0 \ --set-env-vars PROJECT_ID=$PROJECT_ID,SUBSCRIPTION_ID=$SUBSCRIPTION_ID
자동 확장 처리 CREMA 서비스 배포
Pub/Sub에서 메시지를 사용하도록 작업자 풀을 배포한 후 메시지 볼륨을 기반으로 작업자 인스턴스를 프로비저닝하도록 CREMA 자동 확장 처리를 구성합니다.
자동 확장 처리 구성
이 튜토리얼에서는 Parameter Manager를 사용하여 CREMA의 YAML 구성 파일을 저장합니다.
Parameter Manager에서 CREMA의 파라미터 버전을 저장할 파라미터를 만듭니다.
PARAMETER_ID=crema-config PARAMETER_REGION=global gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAML다음 명령어를 실행하여 프로젝트의 루트 디렉터리로 이동합니다.
cd루트 디렉터리에서 YAML 파일
my-crema-config.yaml을 만들어 자동 확장 처리 구성을 정의합니다.apiVersion: crema/v1 kind: CremaConfig spec: pollingInterval: 30 triggerAuthentications: - metadata: name: adc-trigger-auth spec: podIdentity: provider: gcp scaledObjects: - spec: scaleTargetRef: name: projects/PROJECT_ID/locations/us-central1/workerpools/worker-pool-consumer triggers: - type: gcp-pubsub metadata: subscriptionName: "crema-subscription" # Target number of undelivered messages per worker instance value: "10" mode: "SubscriptionSize" authenticationRef: name: adc-trigger-authPROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
로컬 YAML 파일을 새 파라미터 버전으로 업로드합니다.
LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml PARAMETER_VERSION=1 gcloud parametermanager parameters versions create $PARAMETER_VERSION \ --location=$PARAMETER_REGION \ --parameter=$PARAMETER_ID \ --payload-data-from-file=$LOCAL_YAML_CONFIG_FILE다음 명령어를 실행하여 파라미터 추가가 성공했는지 확인합니다.
gcloud parametermanager parameters versions list \ --parameter=$PARAMETER_ID \ --location=$PARAMETER_REGIONprojects/PROJECT_ID/locations/global/parameters/crema-config/versions/1과 같은 파라미터 경로가 표시됩니다.
워크로드를 확장하도록 서비스 배포
작업자 풀을 확장하도록 서비스를 배포하려면 미리 빌드된 컨테이너 이미지로 다음 명령어를 실행합니다.
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
gcloud run deploy $CREMA_SERVICE_NAME \
--image=${IMAGE} \
--region=${REGION} \
--service-account="${CREMA_SA_NAME}" \
--no-allow-unauthenticated \
--no-cpu-throttling \
--base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
--labels=created-by=crema \
--set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"
자동 확장 서비스 테스트
100개의 메시지를 생성하고 Pub/Sub 큐로 푸시하는 스크립트를 만들어 CREMA 서비스를 테스트합니다.
루트 디렉터리에서
load-pubsub.sh라는 파일을 만들고 다음 코드를 추가합니다.#!/bin/bash TOPIC_ID=${TOPIC_ID} PROJECT_ID=${PROJECT_ID} NUM_MESSAGES=100 echo "Publishing $NUM_MESSAGES messages to topic $TOPIC_ID..." for i in $(seq 1 $NUM_MESSAGES); do gcloud pubsub topics publish $TOPIC_ID --message="job-$i" --project=$PROJECT_ID & if (( $i % 10 == 0 )); then wait echo "Published $i messages..." fi done wait echo "Done. All messages published."부하 테스트를 실행합니다.
chmod +x load-pubsub.sh ./load-pubsub.sh
이 명령어는 100개의 메시지를 생성하고 Pub/Sub 구독으로 푸시합니다.
확장 모니터링
load-pubsub.sh 스크립트가 완료된 후 3~4분 정도 기다린 후
서비스 my-crema-service의 로그를 확인합니다. CREMA 자동 확장 처리 서비스는 소비자 작업자 인스턴스를 0에서 확장합니다.
다음 로그가 표시됩니다.
각 로그 메시지에는 메시지를 내보낸 구성요소가 라벨링됩니다.
[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...
또는 다음 명령어를 실행하여 CREMA 서비스가 큐 깊이를 기반으로 인스턴스를 추천하는지 확인합니다.
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$CREMA_SERVICE_NAME AND textPayload:SCALER" \
--limit=20 \
--format="value(textPayload)" \
--freshness=5m
메시지를 사용하는 소비자 로그를 보려면 다음 명령어를 실행합니다.
gcloud run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION
Done job-100 형식을 따르는 로그가 표시됩니다.
정리
Google Cloud 계정에 추가 비용이 청구되지 않게 하려면 이 튜토리얼에서 배포한 모든 리소스를 삭제합니다.
프로젝트 삭제
이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용했고 이 튜토리얼에 추가된 변경사항을 제외하고 보존하려면 튜토리얼을 위해 만든 리소스를 삭제합니다.
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- 콘솔에서 리소스 관리 페이지로 이동합니다. Google Cloud
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료 를 클릭하여 프로젝트를 삭제합니다.
튜토리얼 리소스 삭제
이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다. Cloud Run 서비스는 요청을 수신할 때까지 비용을 청구하지 않습니다.
Cloud Run 서비스를 삭제하려면 다음 명령어를 실행합니다.
gcloud run services delete SERVICE-NAME
SERVICE-NAME를 서비스 이름으로 바꿉니다.
Google Cloud 콘솔에서 Cloud Run 서비스를 삭제할 수도 있습니다.
튜토리얼 설정 중에 추가한
gcloud기본 리전 구성을 삭제합니다.gcloud config unset run/region프로젝트 구성을 삭제합니다.
gcloud config unset projectPub/Sub 리소스를 삭제합니다.
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID gcloud pubsub topics delete $TOPIC_ID이 튜토리얼에서 만든 다른 Google Cloud 리소스를 삭제합니다.
다음 단계
- 이 튜토리얼의 자세한 안내는 Codelab CREMA를 사용하여 Pub/Sub 큐 볼륨을 기반으로 Cloud Run 작업자 풀 자동 확장을 참고하세요.
- Cloud Run 작업자 풀 자세히 알아보기
- 다른 Cloud Run 데모, 튜토리얼, 샘플 살펴보기
- CREMA로 다른 KEDA 확장 처리 구성