スケジュールに従ってジョブを実行する

このページでは、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 ジョブを実行するには:

  1. cloud-run-jobs-sched という名前の新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. 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
  3. 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
  4. 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)))
  5. requirements.txt ファイルを作成し、次の依存関係を貼り付けます。

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. ディレクトリに 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
    ...
  7. ジョブ スケジューラ サービスをデプロイします。

    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)。

次のステップ

この機能の使用後に、次の操作を行うことができます。