このページでは、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 de Confiance API(Cloud クライアント ライブラリなど)と連携している場合は、サービス 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)。
次のステップ
この機能の使用後に、次の操作を行うことができます。