Claudeの挙動がおかしいと感じたら障害を疑え!ステータス確認から対処法まで
「さっきまで普通に動いてたのに、なんかClaudeの返答が変…」「APIのレスポンスが異常に遅い、それとも自分のコードのバグ?」
こういった経験、Claude APIを使って開発していると必ず一度は遭遇します。自分のコードを何時間もデバッグした挙句、実はAnthropicのサーバー側の問題だった、というのはよくある「あるある」な落とし穴です。本記事では、Claudeの挙動がおかしいと感じたときの確認手順と、障害時の実践的な対処法を紹介します。
まず疑うべき:Anthropicの公式ステータスページ
コードを触る前に、まず公式のステータスページを確認することを強くおすすめします。
🔗 Anthropic Status Page 👉 https://status.anthropic.com(status.claude.com にリダイレクトされます)
このページでは以下の情報がリアルタイムで確認できます。
- API Availability:APIエンドポイントが正常に応答しているか
- Claude.ai Web:Webインターフェースの状態
- 過去のインシデント履歴:直近の障害レポートと復旧状況
ページが全てグリーンなのに挙動がおかしい場合は、初めて自分のコードやネットワーク環境を疑うフェーズに入りましょう。
URLについて: ブラウザでは
status.anthropic.comでもstatus.claude.comでも同じページに到達します。ただしstatus.anthropic.comは302でstatus.claude.comへリダイレクトされるため、後述のステータスAPIをプログラムから取得する場合はstatus.claude.comを直接指定してください(HTTPクライアントによってはリダイレクトを追わずJSONの取得に失敗します)。
よくある「おかしい」症状と原因の切り分け
症状① レスポンスが異常に遅い・タイムアウトする
import anthropic
import time
client = anthropic.Anthropic()
start = time.time()
try:
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
timeout=30.0 # タイムアウトを明示的に設定
)
elapsed = time.time() - start
print(f"Response time: {elapsed:.2f}s")
except anthropic.APITimeoutError:
print("Timeout! APIの応答が遅延している可能性があります")
原因の可能性:
- Anthropic側の高負荷・障害
- ネットワークの問題
max_tokensの設定が大きすぎる
症状② エラーレスポンスが増えている
HTTPステータスコード別の原因を把握しておくと素早く切り分けできます。
| ステータスコード | エラー種別(公式) | SDK例外クラス | 疑うべき原因 |
|---|---|---|---|
429 | rate_limit_error | RateLimitError | リクエスト頻度が高すぎる |
500 | api_error | InternalServerError | Anthropic側の障害 |
529 | overloaded_error | OverloadedError | APIの一時的な過負荷 |
401 | authentication_error | AuthenticationError | APIキーの問題 |
529は全ユーザー横断でトラフィックが集中した際に返されることがあり、Python SDKでは InternalServerError とは別の OverloadedError として投げられます(Errors)。
import anthropic
client = anthropic.Anthropic()
try:
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
except anthropic.OverloadedError as e:
# 529: APIが一時的に過負荷
print(f"API過負荷: {e.status_code} - しばらく待ってからリトライしてください")
except anthropic.InternalServerError as e:
# 500: Anthropicサーバー側の問題
print(f"サーバーエラー: {e.status_code} - ステータスページを確認してください")
except anthropic.RateLimitError as e:
print(f"レート制限: リトライロジックを実装しましょう")
except anthropic.APIStatusError as e:
print(f"APIエラー: {e.status_code} - {e.message}")
症状③ 返答の品質が明らかに低下している
モデルの挙動が突然おかしくなった場合、以下を確認してください。
- モデル名の指定ミス:
claude-opus-4-5など、正確なモデル名を使っているか - プロンプトの変更:自分または同僚がシステムプロンプトを変更していないか
- Anthropicのモデルアップデート:稀にモデルのマイナーアップデートが入ることがあります
障害時の実践的な対処法
リトライロジックを実装する
本番環境では、指数バックオフ付きのリトライロジックは必須です。Python SDKは429や500番台(529を含む)をデフォルトで自動リトライします(max_retries=2 がデフォルト)。アプリケーション側でもリトライを実装する場合は、二重にリトライが走らないよう Anthropic(max_retries=0) でSDKの自動リトライを無効化してください(Python SDK - Retries)。
import anthropic
import time
import random
def call_claude_with_retry(prompt: str, max_retries: int = 3) -> str:
# アプリ側でリトライするため、SDKの自動リトライは無効化
client = anthropic.Anthropic(max_retries=0)
for attempt in range(max_retries):
try:
message = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": prompt}],
)
return message.content[0].text
except anthropic.RateLimitError as e:
if attempt == max_retries - 1:
raise
# Retry-Afterヘッダーがあればそれに従う
retry_after = float(e.response.headers.get("retry-after", 60))
wait_time = retry_after + random.uniform(0, 1)
print(f"Rate limited. Retrying in {wait_time:.1f}s...")
time.sleep(wait_time)
except (anthropic.InternalServerError, anthropic.OverloadedError, anthropic.APITimeoutError):
if attempt == max_retries - 1:
raise
# 指数バックオフ + ジッター
wait_time = (2 ** attempt) + random.uniform(0, 1)
print(f"Attempt {attempt + 1} failed. Retrying in {wait_time:.1f}s...")
time.sleep(wait_time)
raise RuntimeError("Max retries exceeded")
モニタリングに組み込む
定期的なヘルスチェックをCIや監視ツールに組み込むことで、障害をいち早く検知できます。エンドポイントは https://status.claude.com/api/v2/status.json を使います(status.anthropic.com はリダイレクトされるため、コードからは直接叩かない方が確実です)。
import httpx
def check_anthropic_status() -> bool:
"""Anthropicのステータスページから状態を確認する"""
try:
response = httpx.get(
"https://status.claude.com/api/v2/status.json",
timeout=10.0
)
data = response.json()
indicator = data["status"]["indicator"]
description = data["status"]["description"]
print(f"Anthropic Status: {indicator} - {description}")
return indicator == "none" # "none" = 問題なし
except Exception as e:
print(f"ステータス確認に失敗: {e}")
return False
情報収集に役立つチャンネル
障害時は公式チャンネルを素早く確認することが重要です。
- 公式ステータスページ:status.anthropic.com / status.claude.com(同一ページ)
- Anthropic Twitter/X:@AnthropicAI
- Anthropic Developer Discord:コミュニティで同様の症状が報告されていないか確認
エンジニア同士でX(Twitter)で共有し合うのも、障害の早期検知に非常に有効です。「自分だけ?」と思ったらまず検索してみましょう。
まとめ
Claudeの挙動がおかしいと感じたときのチェックリストをまとめます。
- まずstatus.anthropic.comをブラウザで確認する(コードを触る前に!)
- HTTPステータスコードを確認し、
5xx系なら障害を疑う - X(Twitter)で他のユーザーの報告を検索する
- 本番環境にはリトライロジックを実装しておく
- モニタリングには
https://status.claude.com/api/v2/status.jsonを使う
「コードのバグ探しに何時間も費やした後に障害だったと気づく」という体験は、一度やれば忘れられません。障害の可能性を最初に排除する習慣をつけるだけで、デバッグ効率は大きく改善されます。