목표
이 튜토리얼에서는 다음 단계를 진행합니다.
- Pub/Sub 주제 및 구독을 만들어 주제에 메시지를 푸시합니다.
- Pub/Sub에서 메시지를 사용하는 Cloud Run 작업자 풀을 배포합니다.
- 자동 확장 처리 CREMA 서비스를 배포하여 작업자 풀을 확장합니다.
- Python 스크립트를 로컬에서 실행하여 부하를 생성하여자동 확장 서비스를 테스트합니다.
비용
이 문서에서는 비용이 청구될 수 있는 구성요소를 사용합니다 Google Cloud.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
시작하기 전에
- 계정에 로그인합니다. Google Cloud 를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. Google Cloud신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
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.
-
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권한이 포함된 서비스 사용량 관리자 IAM 역할(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_ID풀 구독을 만들어 Pub/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.iam.gserviceaccount.com" \ --role="roles/parametermanager.parameterViewer"작업자 풀을 확장할 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.developer"서비스 계정 사용자 역할을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"측정항목을 볼 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.viewer"측정항목을 쓸 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.metricWriter"Pub/Sub 메시지를 볼 수 있는 권한을 CREMA 서비스 계정에 부여합니다.
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.viewer"구독에서 메시지를 가져올 수 있는 권한을 소비자 서비스 계정에 부여합니다.
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --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 beta run worker-pools deploy $CONSUMER_WORKER_POOL_NAME \ --source . \ --region $REGION \ --service-account="$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --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 beta 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 beta 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 확장 처리 구성