一般的なトラブルシューティング

Pub/Sub の使用中に問題が発生した場合に役立つトラブルシューティング手順について説明します。

トピックを作成できない

必要な権限があることを確認します。Pub/Sub トピックを作成するには、プロジェクトに対する Pub/Sub 編集者roles/pubsub.editor)の Identity and Access Management ロールが必要です。このロールを付与されていない場合は、管理者にお問い合わせください。トピックに関するトラブルシューティングの詳細については、トピックのトラブルシューティングトピックのインポートのトラブルシューティングをご覧ください。

サブスクリプションを作成できない

以下を行ったことを確認します。

  • 必要な権限があることを確認します。Pub/Sub サブスクリプションを作成するには、プロジェクトに対する Pub/Sub 編集者(roles/pubsub.editor)IAM ロールが必要です。このロールを付与されていない場合は、管理者にお問い合わせください。

  • サブスクリプションの名前を指定している。

  • サブスクリプションをアタッチする既存のトピックの名前を指定している。

  • プッシュ サブスクリプションを作成する場合、受信 URL のプロトコルとして、pushEndpoint フィールドに https:// を小文字で指定している(http://HTTPS:// は不可)。

サブスクリプションのトラブルシューティングについて詳しくは、pull サブスクリプションのトラブルシューティングpush サブスクリプションのトラブルシューティングBigQuery サブスクリプションのトラブルシューティングCloud Storage サブスクリプションのトラブルシューティングをご覧ください。

エラー 403 (Forbidden)

このエラーが発生した場合、以下を行ってください。

  • Google Cloud コンソールで Pub/Sub API が有効になっていることを確認します。
  • プロジェクト間の通信に Pub/Sub API を使用する場合は、リクエストを行うプリンシパルが、関連する Pub/Sub API リソースに必要な権限を持っていることを確認します。

  • Dataflow を使用している場合は、{PROJECT_NUMBER}@cloudservices.gserviceaccount.com と Compute Engine サービス アカウントの {PROJECT_NUMBER}-compute@developer.gserviceaccount.com の両方が、関連する Pub/Sub API リソースに対して必要な権限を持っていることを確認します。詳細については、Dataflow のセキュリティと権限をご覧ください。

  • App Engine を使用している場合、プロジェクトの権限ページで、App Engine サービス アカウントが Pub/Sub 編集者としてリストされているかどうか確認します。リストされていない場合は、App Engine サービス アカウントを Pub/Sub 編集者として追加します。通常、App Engine サービス アカウントは <project-id>@appspot.gserviceaccount.com という形式になります。

その他の一般的なエラーコード

Pub/Sub API に関連するその他の一般的なエラーコードとその説明については、エラーコードをご覧ください。

過剰な管理オペレーションの使用

管理オペレーションの割り当てを過剰に消費している場合、コードのリファクタリングが必要な可能性があります。ここでは、以下の疑似コードに基づいて説明します。この例では、リソースの消費を試行する前に、管理オペレーション(GET)を使用して、サブスクリプションが存在することを確認しています。GETCREATE はどちらも管理者オペレーションです。

if !GetSubscription my-sub {
  CreateSubscription my-sub
}
Consume from subscription my-sub

サブスクリプションからメッセージを利用すると、より効率的になります(ただし、サブスクリプションの名前がある程度確実にわかる場合に限ります)。この楽観的なアプローチでは、エラーが発生した場合にのみサブスクリプションが取得または作成されます。次の例を考えてみましょう。

try {
  Consume from subscription my-sub
} catch NotFoundError {
  CreateSubscription my-sub
  Consume from subscription my-sub
}