이 페이지에서는 crontab을 사용하여 일정에 따라 Cloud Run 작업을 실행하는 방법을 설명합니다.
필요한 역할
이 페이지에 설명된 작업에 필요한 권한을 얻으려면 관리자에게 Cloud Run 작업에 대한 다음 IAM 역할 중 하나를 부여해 달라고 요청하세요.
- Google Cloud CLI를 사용하여 작업 실행: Cloud Run 작업에 대한 Cloud Run 호출자(
roles/run.invoker) 역할 - Cloud de Confiance 콘솔을 사용하여 작업을 실행하거나, 작업 구성을 재정의하거나, 작업 실행을 취소: Cloud Run 작업에 대한 Cloud Run 개발자(
roles/run.developer) 역할
Cloud Run과 연결된 IAM 역할 및 권한 목록은 Cloud Run IAM 역할 및 Cloud Run IAM 권한을 참조하세요. Cloud Run 작업이 Cloud 클라이언트 라이브러리와 같은Cloud de Confiance API와 상호작용하는 경우에는 서비스 ID 구성 가이드를 참조하세요. 역할 부여에 대한 자세한 내용은 배포 권한 및 액세스 관리를 참조하세요.
서비스 계정에 프로젝트 액세스 권한 부여
Cloud Run 작업의 서비스 계정을 만들지 않은 경우 서비스 계정을 만듭니다. 예를 들면 다음과 같습니다.
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME을 서비스 계정의 이름(예: job-scheduler)으로 바꿉니다.
서비스 계정이 작업을 실행하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 작업 실행자(roles/run.jobsExecutor) 역할을 서비스 계정에 부여해 달라고 요청하세요. 예를 들면 다음과 같습니다.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:job-scheduler@PROJECT_ID.s3ns.iam.gserviceaccount.com \ --role roles/run.jobsExecutor
PROJECT_ID를 프로젝트 ID 이름으로 바꿉니다.
시작하기 전에
아직 만들지 않았다면 Cloud Run 작업을 만듭니다.
일정에 따라 실행되도록 Cloud Run 작업 구성
일정에 따라 Cloud Run 작업을 실행하려면 다음 안내를 따르세요.
cloud-run-jobs-sched라는 새 디렉터리를 만들고 이 디렉터리로 이동합니다.mkdir cloud-run-jobs-sched cd cloud-run-jobs-sched
Dockerfile파일을 만들고 다음 줄을 붙여넣습니다.FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:536.0.1 RUN apt-get update -y && \ apt-get install -y python3-dev python3-pip python3-venv && \ apt-get install -y cron ENV APP_HOME /app WORKDIR $APP_HOME COPY . ./ ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN pip install --no-cache-dir -r requirements.txt # Set up the cron schedule. RUN crontab /app/cron CMD /app/entrypoint.sh
entrypoint.sh파일을 만들고 다음 줄을 붙여넣습니다.gcloud config set project $PROJECT gcloud config set run/region $REGION cron gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
main.py파일을 만들고 다음 Python 코드를 붙여넣습니다.import os from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return "Hello World!" if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
requirements.txt파일을 만들고 다음 종속 항목을 붙여넣습니다.Flask==3.0.3 gunicorn==23.0.0 Werkzeug==3.0.3
디렉터리에
cron파일을 만들고 작업을 실행하는 cron 일정을 추가합니다. 예를 들면 다음과 같습니다.0 2 * * * gcloud run jobs execute --async test-job > /proc/1/fd/1 2>&1
이 명령어는 매일 오전 2시에
test-job이라는 작업을 실행합니다. 작업 실행을 시작할 때 발생하는 오류는 서비스 로그에 표시됩니다.여러 작업의 여러 일정을 만들려면 실행할 작업과 연결된 일정으로
cron파일을 업데이트합니다. 예를 들면 다음과 같습니다.${cron_schedule} gcloud run jobs execute --async ${job_1} > /proc/1/fd/1 2>&1 ${cron_schedule} gcloud run jobs execute --async ${job_2} > /proc/1/fd/1 2>&1 ...
작업 스케줄러 서비스를 배포합니다.
gcloud run deploy JOB_NAME \ --source . \ --region REGION \ --set-env-vars PROJECT=PROJECT_ID,REGION=REGION \ --service-account SERVICE_ACCOUNT \ --no-allow-unauthenticated \ --min-instances=1 \ --no-cpu-throttling
다음을 바꿉니다.
- JOB-NAME: Cloud Run 작업의 이름
- PROJECT_ID: 프로젝트 ID
- REGION: Cloud Run 작업의 리전(예:
europe-west1)
다음 단계
이 기능을 사용한 후에는 다음을 수행할 수 있습니다.