ベスト プラクティス: VPC Service Controls の境界でスケジュールされたジョブを実行する

このページでは、VPC Service Controls 境界を使用する場合に、プロジェクトのスケジュール設定された Cloud Run ジョブを実行するためのベスト プラクティスについて説明します。 Google Cloud

Cloud Scheduler は、VPC Service Controls の境界内でジョブをトリガーできません。スケジュール設定されたジョブを設定するには、追加の手順が必要です。特に、別のコンポーネントを介してリクエストをプロキシする必要があります。プロキシとして Cloud Run サービスを使用することをおすすめします。

次の図にアーキテクチャを示します。

Cloud Run vpc sc 境界

始める前に

VPC Service Controls 用に Cloud Run を設定する。これは、後続のすべてのスケジュール設定されたジョブで使用される 1 回限りの設定です。また、後でサービスごとに設定を行う必要があります。この設定については、後述します。

スケジュールされたジョブを設定する

VPC Service Controls の境界内にスケジュールされたジョブを設定するには:

  1. ジョブを作成し、ジョブの名前をメモします。

  2. ジョブごとの Cloud Run 固有の VPC Service Controls の設定を完了します。ジョブを VPC ネットワークに接続し、すべてのトラフィックをそのネットワーク経由で転送する必要があります。

    トリガーする既存の Cloud Run ジョブがない場合は、サンプルの Cloud Run ジョブ コンテナ us-docker.pkg.dev/cloudrun/container/job:latest を Cloud Run にデプロイして、この機能をテストします。

  3. プロキシとして機能する Cloud Run サービスをデプロイします。リクエストに応答して Cloud Run ジョブをトリガーするサンプル サービスについては、サンプル プロキシ サービスをご覧ください。デプロイが完了すると、コンソールに「URL:」というテキストの横にサービスの URL が表示されます。

  4. サービスごとの Cloud Run 固有の VPC Service Controls の設定を完了します。サービスを VPC ネットワークに接続し、そのネットワーク経由ですべてのトラフィックを転送する必要があります。ingress は必ず [内部] に設定してください。

  5. Cloud Run プロキシ サービスをトリガーする Cloud Scheduler cron ジョブを作成します。

    1. Cloud Scheduler ジョブのコンソール ページに移動

    2. [ジョブを作成] をクリックします。

    3. [名前]、[リージョン]、[頻度]、[タイムゾーン] の各フィールドに必要な値を入力します。詳細については、Cloud Scheduler を使用して cron ジョブを作成するをご覧ください。

    4. [実行内容を構成する] をクリックします。

    5. ターゲット タイプとして [HTTP] を選択します。

    6. [URL] に、前の手順でメモした Cloud Run プロキシ サービスの URL を入力します。

    7. HTTP メソッドとして [Get] を選択します。

    8. Auth ヘッダーで [OIDC トークンを追加] を選択します。

    9. [サービス アカウント] で、Compute Engine のデフォルトのサービス アカウントまたは、run.routes.invoke 権限または Cloud Run Invoker ロールを持つカスタム サービス アカウントを選択します。

    10. [オーディエンス] に、前の手順でメモした Cloud Run プロキシ サービス URL を入力します。

    11. その他のフィールドは空欄のままにします。

    12. [作成] をクリックして、Cloud Scheduler cron ジョブを作成します。

サンプル プロキシ サービス

次のセクションでは、リクエストをプロキシし、Cloud Run ジョブをトリガーする Python サービスのサンプルを示します。

  1. main.py という名前のファイルを作成し、次のコードを貼り付けます。ジョブ名、リージョン、プロジェクト ID を必要な値に更新します。

    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)))
  2. requirements.txt という名前のファイルを作成し、次のコードを貼り付けます。

    google-cloud-run
    flask
  3. 次の内容の Dockerfile を作成します。

    FROM python:3.9-slim-buster
    
    WORKDIR /app
    
    COPY requirements.txt requirements.txt
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . .
    
    CMD ["python3", "main.py"]
  4. コンテナをビルドしてデプロイします。ソースベースのデプロイは、Cloud Build カスタム ワーカーを設定する必要があり、VPC Service Controls 環境で設定するのが難しい場合があります。既存のビルド デプロイ パイプラインがある場合は、そのパイプラインを使用してソースコードをコンテナにビルドし、コンテナを Cloud Run サービスとしてデプロイします。

    既存のビルドとデプロイの設定がない場合は、コンテナをローカルでビルドして Artifact Registry に push します。次に例を示します。

    PROJECT_ID=YOUR_PROJECT_ID
    REGION=YOUR_REGION
    AR_REPO=YOUR_AR_REPO
    CLOUD_RUN_SERVICE=job-runner-service
    
    docker build -t $CLOUD_RUN_SERVICE .
    
    docker tag $CLOUD_RUN_SERVICE $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE
    
    docker push $REGION_ID-docker.pkg.dev/$PROJECT_ID/AR_REPO/$CLOUD_RUN_SERVICE

    deploy コマンドから返されたサービス URL をメモします。

次のステップ

この機能の使用後に、以下を読んで詳細を確認してください。