Cloud Scheduler の問題をトラブルシューティングする

このページでは、Cloud Scheduler の問題を解決する方法について説明します。

Cloud Scheduler は、各ジョブ実行の開始時と終了時にログを公開します。Cloud Scheduler で使用可能な監査ログなど、特定のジョブのログを取得、表示、分析できます。詳細については、ログの表示をご覧ください。

デフォルトでは、Cloud Scheduler ジョブがターゲット サービス(ジョブ リクエスト ハンドラ)から確認応答を受信しない場合、ジョブは失敗したと見なされます。Cloud Scheduler は、構成した指数バックオフに従ってジョブを再試行します。

Google Cloud サービスに影響するインシデントについては、Google Cloud Service Health ダッシュボードCloud Scheduler に関して報告されているすべてのインシデントをご覧ください。

ダウンストリーム サービスの問題によりジョブが失敗する

ジョブの失敗は、Cloud Scheduler 自体ではなく、Cloud Scheduler がターゲットとするダウンストリーム サービス(Cloud Run など)の問題が原因である可能性があります。次の条件が満たされている場合は、ダウンストリーム サービスの問題が疑われます。

  • Cloud Scheduler の権限が正しく設定されている。
  • Cloud Scheduler がターゲット サービスに正常に到達できる。
  • Cloud Scheduler 実行ログのエラー メッセージは、ダウンストリーム サービスから送信されます。

この問題を解決するには、次の操作を行います。

  1. ダウンストリーム サービスを直接呼び出す: Cloud Scheduler を使用せずにダウンストリーム サービスを正常に呼び出すことができることを確認します。呼び出しが成功した場合は、Cloud Scheduler が問題の原因である可能性が高くなります。呼び出しが失敗した場合は、ダウンストリーム サービスでさらにデバッグを行う必要があります。
  2. 宛先サービスログを調べる: 宛先サービスのログを調べて、出力されているエラーを特定し、それに応じてトリアージします。
  3. 長時間実行オペレーションを探す: Cloud Scheduler が長時間実行オペレーション(30 分以上)に対して HTTP 504 エラーを返す場合は、宛先サービスでリクエスト タイムアウトが長くなっている可能性があるため、宛先サービスログで実行が成功したか失敗したかを確認します。このようなシナリオでは、Cloud Scheduler はタイムアウトしますが、宛先サービスはタイムアウトしません。

ジョブが権限エラーで失敗する

権限は、どのプリンシパルがリソースにアクセスできるか、どのオペレーションが許可されるかを制御します。権限が正しく構成されていないと、ジョブの実行が中断され、権限拒否エラーが発生する可能性があります。監査ログには、すべての権限変更の詳細な記録が提供されるため、これらの問題の原因を特定できます。

Cloud Scheduler ジョブが権限エラーで失敗すると、実行ログに "debugInfo":"URL_ERROR-ERROR_OTHER. Original HTTP response code number = 403" のようなメッセージが表示されることがあります。

この問題を解決するには、次のいずれか 1 つ以上の確認を行います。

  • サービス エージェントに付与された IAM ロールを確認する: Cloud Scheduler サービス エージェントには、Cloud Scheduler サービス エージェントroles/cloudscheduler.serviceAgent)ロールが必要です。このロールがないと、Cloud Scheduler ジョブは失敗します。このロールは、Cloud Scheduler サービス エージェントに手動で付与できます。手動での付与が必要になるのは、Cloud Scheduler API を 2019 年 3 月 19 日より前に有効にした場合、または Cloud Scheduler サービス エージェントのロールを削除した場合のみです。詳細については、Cloud Scheduler サービス エージェントのロールを付与するをご覧ください。

  • サービス アカウントの権限を確認する: ジョブにアタッチされているサービス アカウントに、宛先サービスを呼び出すための正しい権限とスコープがあることを確認します。これには、ターゲットが別のプロジェクトにある場合や、中間サービスの最終ターゲットである場合も含まれます。ターゲットが Google Cloud内にある場合は、サービス アカウントに必要なロールが付与されていることを確認します。 Google Cloud 内の各サービスには特定のロールが必要です。生成されたトークンは受信側のサービスによって自動的に検証されます。たとえば、Cloud Run と Cloud Run functions の場合は、Cloud Run Invoker ロールを付与する必要があります。ターゲットが Google Cloudの外部にある場合、受信サービスはトークンを手動で確認する必要があります。詳細については、Cloud Scheduler に対して認証するHTTP ターゲットで認証を使用するをご覧ください。

  • VPC Service Controls の違反を確認する: VPC Service Controls は、データ漏洩を防ぐためのセキュアな境界を設定できる Google Cloudの機能です。VPC Service Controls に起因するエラーかどうかを特定するには、VPC Service Controls が有効で、使用するプロジェクトとサービスに適用されているかどうかを確認します。プロジェクトとサービスが VPC Service Controls で保護されているかどうかを確認するには、そのリソース階層レベルで VPC Service Controls ポリシーを確認します。

    問題の範囲を把握するには、監査ログから VPC Service Controls エラーを取得します。

    1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

      [ログ エクスプローラ] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが [Logging] の結果を選択します。

    2. 次の条件で監査ログをクエリします。

      severity="ERROR" AND protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"

      具体的には、エラー メッセージに次のテキストが含まれることがあります。

      • Request is prohibited by organization's policy
      • Request violates VPC Service Controls

    VPC Service Controls の構成時に発生する可能性のある問題の詳細については、一般的な問題のトラブルシューティングをご覧ください。

  • プライベート エンドポイントを確認する: Cloud Scheduler は、VPC Service Controls の境界内の Cloud Run、Cloud Run functions、 Google Cloud API などの特定のプライベート エンドポイントのみを呼び出すことができます。宛先サービスの上り(内向き)設定(Cloud Run での上り(内向き)ネットワークを制限するなど)と、アタッチされたサービス アカウントの権限を確認します。URL_ERROR-ERROR_DNS エラー メッセージが表示されることがあります。詳細については、このドキュメントの宛先ターゲットに到達できないためジョブが失敗するをご覧ください。

宛先ターゲットに到達できないため、ジョブが失敗する

この問題は、宛先ターゲットに到達できないため、Cloud Scheduler ジョブが失敗した場合に発生します。実行ログに URL_ERROR または URL_UNREACHABLE で始まるエラーが表示されます。

この問題を解決するには、受信したエラー メッセージに応じて、次のいずれかのチェックを行います。

  • URL_ERROR-ERROR_AUTHENTICATION: HTTP 401 (Unauthorized) または HTTP 407 (Proxy Authentication Required) エラーが返されます。宛先ターゲットで認証が必要ですが、Cloud Scheduler リクエストに有効な認証トークンが含まれていません。たとえば、リクエストに認可ヘッダーがないか、認証情報が無効です。ジョブの認証設定を確認します。詳細については、Cloud Scheduler に対して認証するHTTP ターゲットで認証を使用するをご覧ください。

  • URL_ERROR-ERROR_DNS: ドメイン ネーム システム(DNS)を使用してホスト名を解決できなかったため、URL の取得が失敗したことを示します。たとえば、ホスト名が存在しないか、関連付けられた IP アドレスがない場合などです。エラー メッセージに Original HTTP response code number = 0 というテキストが含まれる場合があります。ホスト名の有効性を確認し、プライベート エンドポイントを呼び出すときに、Cloud Scheduler でサポートされていることを確認して、上り(内向き)設定を確認します。

  • URL_ERROR-ERROR_NOT_FOUND: ウェブサーバーが HTTP 404 Not Found エラーを返します。ターゲット URL が正しく、リソースが存在するかどうかを確認します。

  • URL_ERROR-ERROR_OTHER: これは、以前に詳細が説明されていない一般的な HTTP 4xx エラーを指します。ログを調べて、元の HTTP レスポンス コードを取得します。HTTP 403 エラーが表示された場合は、このドキュメントの権限エラーでジョブが失敗するを参照してください。

  • URL_UNREACHABLE-UNREACHABLE_5xx: 宛先ターゲットが HTTP 5xx または 429 エラーを返します。これは一時的な状態(サーバーの過負荷など)である可能性があります。宛先ターゲットのログを確認して、問題をデバッグします。

  • URL_UNREACHABLE-UNREACHABLE_CONNECTION_RESET: ピアによって接続がリセットされました。外部サーバー側の問題を確認します。

  • URL_UNREACHABLE-UNREACHABLE_ERROR: ネットワーク エラーを示します。ターゲット URL が正しいかどうか、アクセスをブロックしているファイアウォール ルールがないかどうかを確認します。

ジョブの実行に関する問題

Cloud Scheduler ジョブは、定義された時刻または一定の間隔で実行されます。ジョブの実行中に次の問題が発生することがあります。

以前は機能していたジョブが実行を停止する

この問題は、Cloud Scheduler API が無効になっているため、以前に正常に実行された Cloud Scheduler ジョブの実行が停止した場合に発生します。API が無効になった時刻を確認するには、次の条件で監査ログをクエリします。

resource.type="audited_resource" AND
protoPayload.serviceName="cloudscheduler.googleapis.com" AND
operation.producer="serviceusage.googleapis.com" AND
protoPayload.authorizationInfo.permission="serviceusage.services.disable"

この問題を解決するには、Cloud Scheduler API を有効にします

夏時間によりジョブの実行が不規則になる

Google Cloud コンソールを使用して Cloud Scheduler ジョブを作成する場合は、タイムゾーンを指定する必要があります。Google Cloud CLI を使用する場合は、--time-zone フラグを使用してタイムゾーンを任意で指定できます。指定しない場合、使用されるデフォルトのタイムゾーンは協定世界時(UTC)です。

この問題は、ジョブが UTC 以外のタイムゾーンで構成され、夏時間(DST)の変更により実行が不規則になった場合に発生します。これは想定された挙動です。

ジョブで非常に正確な周期が必要な場合は、DST を検出しないタイムゾーンを選択する必要があります。特に、この問題を完全に回避するには、UTC タイムゾーンを使用するようにジョブ スケジュールを構成します。

詳細については、cron ジョブの形式とタイムゾーンをご覧ください。

次のステップ

Cloud Scheduler のドキュメントで問題の解決策が見つからない場合は、次のオプションを検討してください。

詳細については、Cloud Scheduler のサポートをご覧ください。