1. 소개
개요
GCP 프로젝트가 VPC SC 경계 내에 있는 경우 예약된 작업을 설정하려면 추가 단계를 수행해야 합니다. Cloud Scheduler는 VPC SC 경계 내에서 작업을 직접 트리거할 수 없으므로 다른 구성요소를 통해 요청을 프록시해야 합니다. Cloud Run 서비스를 이 프록시로 사용하는 것이 좋습니다.
아키텍처는 다음과 같습니다.
학습할 내용
- VPC SC 경계 내에서 일정에 따라 Cloud Run 작업을 실행하는 방법
- Cloud Run 클라이언트 라이브러리를 사용하여 Cloud Run 작업을 트리거하는 Cloud Run 서비스를 만드는 방법
- 일정에 따라 Cloud Run 서비스를 호출하도록 Cloud Scheduler를 구성하는 방법
2. 시작하기 전에
먼저 VPC 서비스 제어를 위해 Cloud Run을 설정하는 단계를 따랐는지 확인합니다.
그런 다음 이 Codelab 전체에서 사용할 환경 변수를 설정합니다.
PROJECT_ID=<YOUR_PROJECT_ID> REGION=<YOUR_REGION> AR_REPO=sample-job-repo CLOUD_RUN_SERVICE=job-runner-service CLOUD_RUN_JOB=sample-job CLOUD_SCHEDULER=job-scheduler SERVICE_ACCOUNT="cloud-run-invoker-sa" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com NETWORK=default SUBNET=default
3. Cloud Run 작업 만들기
이 Codelab에서는 샘플 Cloud Run 작업 컨테이너를 사용합니다.
먼저 Cloud Run 작업 컨테이너의 Artifact Registry 저장소를 만듭니다.
gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"
그런 다음 샘플 Cloud Run 작업 컨테이너를 VPC SC 구성 프로젝트 내의 Artifact Registry에 복사합니다. 설치 안내에 따라 gcrane 도구를 사용하여 이 작업을 할 수 있습니다. 저장소 간에 이미지를 복사하는 방법에 관한 문서에서 gcrane에 관해 자세히 알아보세요.
gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest
두 번째로 VPC 서비스 제어를 준수하는 Cloud Run 작업을 배포합니다.
gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \ --network=$NETWORK \ --subnet=$SUBNET \ --vpc-egress=all-traffic
작업 만들기에 관한 자세한 내용은 Cloud Run 작업 문서에 나와 있는 단계를 따르세요.
4. 서비스 계정 만들기
이 서비스 계정은 Cloud Run에서 Cloud Run 작업을 호출하는 데 사용됩니다.
먼저 다음 명령어를 실행하여 서비스 계정을 만듭니다.
gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Cloud Run to run a Cloud Run job"
두 번째로, 서비스 계정에 Cloud Run 호출자 역할과 Cloud Run 뷰어 역할을 부여합니다.
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.invoker gcloud projects add-iam-policy-binding $PROJECT_ID \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role=roles/run.viewer
5. Cloud Run 서비스 만들기
이 단계에서는 프록시 역할을 하는 Cloud Run 서비스를 배포합니다.
mkdir job-runner-service && cd $_
다음 코드를 사용하여 main.py
라는 파일을 만듭니다.
import os from flask import Flask app = Flask(__name__) # pip install google-cloud-run from google.cloud import run_v2 @app.route('/') def hello(): client = run_v2.JobsClient() # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' print("Triggering job...") request = run_v2.RunJobRequest(name=job_name) operation = client.run_job(request=request) response = operation.result() print(response) return "Done!" if __name__ == '__main__': app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
다음 코드를 사용하여 requirements.txt
라는 파일을 만듭니다.
google-cloud-run flask
마지막으로 Dockerfile
를 만듭니다.
FROM python:3.9-slim-buster # for logging purposes ENV PYTHONUNBUFFERED=True WORKDIR /app COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["python3", "main.py"]
그런 다음 다음 docker 명령어를 사용하여 컨테이너를 빌드합니다. VPC SC 환경에서는 소스 기반 배포를 설정하기 어려울 수 있습니다. 기존 빌드 및 배포 파이프라인이 있는 경우 이를 사용하여 소스 코드를 컨테이너에 빌드하고 컨테이너를 Cloud Run 서비스로 배포합니다.
docker build -t $CLOUD_RUN_SERVICE . docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE
이제 VPC 서비스 제어를 준수하는 Cloud Run 서비스를 배포합니다.
gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \ --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \ --service-account $SERVICE_ACCOUNT_ADDRESS \ --network=$NETWORK \ --subnet=$SUBNET \ --vpc-egress=all-traffic \ --no-allow-unauthenticated \ --ingress internal
다음 명령어를 실행하여 서비스 엔드포인트 URL을 저장합니다.
SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')
6. 서비스를 트리거하는 Cloud Scheduler 작업 만들기
# create the Cloud Scheduler job gcloud scheduler jobs create http $CLOUD_SCHEDULER \ --location=$REGION \ --schedule="0 0 1 * *" \ --uri=$SERVICE_URL \ --http-method=GET \ --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS
Cloud Scheduler 작업이 생성되면 다음 명령어를 실행하여 테스트 목적으로 Cloud Scheduler 작업을 즉시 실행할 수 있습니다.
gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION
참고:
작업 실행이 완료될 때까지 몇 분 정도 기다려야 할 수 있습니다. Cloud Run 스케줄러 페이지에서 상태를 추적할 수 있습니다.
다음 명령어를 실행하여 Cloud Run 작업이 실행되었는지 확인합니다.
EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)') gcloud run jobs executions describe $EXECUTION_NAME --region $REGION
다음과 같이 표시됩니다.
✔ Execution sample-job-w6hrj in region us-central1 1 task completed successfully Elapsed time: 28 seconds
7. 축하합니다.
Codelab을 완료했습니다. 축하합니다.
학습한 내용
- VPC SC 경계 내에서 일정에 따라 Cloud Run 작업을 실행하는 방법
- Cloud Run 클라이언트 라이브러리를 사용하여 Cloud Run 작업을 트리거하는 Cloud Run 서비스를 만드는 방법
- 일정에 따라 Cloud Run 서비스를 호출하도록 Cloud Scheduler를 구성하는 방법
8. 삭제
의도치 않은 요금 청구를 방지하려면(예: Cloud Run 서비스가 무료 등급의 월별 Cloud Run 호출 할당량보다 더 많은 횟수로 실수로 호출된 경우) GCP 서비스를 삭제하거나 2단계에서 만든 프로젝트를 삭제하면 됩니다.
Cloud Run 서비스 및 Cloud Run 작업을 삭제하려면 Cloud Run Cloud 콘솔(https://console.cloud.google.com/run)로 이동하여 서비스를 삭제합니다.
전체 프로젝트를 삭제하려면 https://console.cloud.google.com/cloud-resource-manager로 이동하여 2단계에서 만든 프로젝트를 선택하고 삭제를 선택합니다. 프로젝트를 삭제하면 Cloud SDK에서 프로젝트를 변경해야 합니다. gcloud projects list
를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.