VPC 서비스 제어 경계 내에서 Cloud Run 작업을 예약하는 방법

1. 소개

개요

GCP 프로젝트가 VPC SC 경계 내에 있는 경우 예약된 작업을 설정하려면 추가 단계를 수행해야 합니다. Cloud Scheduler는 VPC SC 경계 내에서 작업을 직접 트리거할 수 없으므로 다른 구성요소를 통해 요청을 프록시해야 합니다. Cloud Run 서비스를 이 프록시로 사용하는 것이 좋습니다.

아키텍처는 다음과 같습니다.

Cloud Run 작업을 실행하는 Cloud Run 서비스를 트리거하는 Cloud Scheduler의 다이어그램

학습할 내용

  • 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를 실행하여 사용 가능한 모든 프로젝트 목록을 볼 수 있습니다.