GCP(Google Cloud Platform)で503エラーが発生した場合、Google Cloudサービス側が一時的に利用できない状態です。このエラーは、サービスのメンテナンスや過負荷、またはサーバーレスサービスの起動遅延が主な原因です。

よくある原因

GCPサービスのメンテナンスまたは過負荷状態

Google Cloud全体またはあなたが利用しているサービス(Cloud Run、Cloud Functions、Cloud SQL等)がメンテナンス中または過負荷状態に陥っている場合に503エラーが発生します。これはGCP側の問題であり、ユーザーのアプリケーションコードには原因がありません。

Cloud Runのコールドスタート時のタイムアウト

Cloud Runでは、デプロイ直後またはしばらくリクエストがない状態から新しいリクエストが来た場合、インスタンスの起動に時間がかかります。この起動中(コールドスタート)にリクエストタイムアウトすると、503エラーが返されます。デフォルト設定では最小インスタンス数が0に設定されているため、起動待ちの間にリクエストが失敗しやすくなります。

リージョンの容量不足

特定のGCPリージョンで一時的に容量が足りなくなり、新しいインスタンスやリソースを作成できない状態に陥ることがあります。この場合も503エラーが返されます。

解決手順

ステップ1:GCPサービスの状態を確認する

まず、GCP側で障害が発生していないか確認します。status.cloud.google.comにアクセスしてください。

# または curl コマンドでサービス状態ページを確認
curl https://status.cloud.google.com

ページ上で「Service Status」から各サービスの状態を確認します。赤色やオレンジ色の警告が表示されている場合は、GCP側の問題です。この場合は復旧を待つしかありません。

ステップ2:Cloud Runの場合は min-instances を設定する

Cloud Runを使用している場合、最小インスタンス数をを1以上に設定してコールドスタートを根絶します。

gcloud run deploy <your-service-name> \
  --min-instances=1 \
  --region=<your-region> \
  --project=<your-project-id>

既存サービスの設定を変更する場合は以下を実行します。

gcloud run services update <your-service-name> \
  --min-instances=1 \
  --region=<your-region> \
  --project=<your-project-id>

Cloud Consoleから設定する場合は、Cloud Run → サービス一覧 → 対象サービスをクリック → 「編集して新しいリビジョンをデプロイ」 → 「詳細設定」→「最小インスタンス数」を1に変更します。

ステップ3:数分待機してから再試行する

GCP側の過負荷状態である場合、通常は数分~数十分で復旧します。指数バックオフ(最初は短い待機時間、失敗するたびに待機時間を増やす)を実装して自動再試行します。

import requests
import time

def fetch_with_retry(url, max_retries=5):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, timeout=10)
            response.raise_for_status()
            return response
        except requests.exceptions.HTTPError as e:
            if e.response.status_code == 503:
                wait_time = 2 ** attempt  # 1秒、2秒、4秒、8秒、16秒...
                print(f"503エラー発生。{wait_time}秒後に再試行します...")
                time.sleep(wait_time)
            else:
                raise
    raise Exception("最大リトライ回数に達しました")

ステップ4:ログを確認してアプリケーションの問題がないか確認する

Cloud Logging(旧 Stackdriver Logging)でアプリケーションログを確認します。

gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=<your-service-name>" \
  --limit=50 \
  --format=json \
  --project=<your-project-id>

Cloud Consoleから確認する場合は、Cloud Logging → ログエクスプローラ → リソースフィルタで「Cloud Run」を選択し、サービス名で絞り込みます。

それでも解決しない場合

503エラーが頻繁に発生し続ける場合は、以下を確認してください。

  • Cloud Runのメモリ設定:メモリが不足していないか確認します。通常は256MB以上を推奨します。
  • リージョンの変更:特定リージョンで容量不足が続く場合は、別のリージョンへのデプロイを検討します。
  • Cloud Runの同時実行数制限:「最大同時実行数」が低く設定されていないか確認し、必要に応じて引き上げます。
  • GCP公式サポートへの連絡:持続的な問題の場合はGoogle Cloudサポートに問い合わせます。Cloud Consoleのサポート → 「新しいケースを作成」から報告できます。

免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。