Pub/Sub の使用中に問題が発生した場合に役立つトラブルシューティング手順について説明します。
トピックを作成できない
必要な権限があることを確認します。Pub/Sub トピックを作成するには、プロジェクトに対する Pub/Sub 編集者(roles/pubsub.editor
)の Identity and Access Management ロールが必要です。このロールを付与されていない場合は、管理者にお問い合わせください。トピックに関するトラブルシューティングの詳細については、以下のページをご覧ください。
サブスクリプションを作成できない
以下を行ったことを確認します。
必要な権限があることを確認します。Pub/Sub サブスクリプションを作成するには、プロジェクトに対する Pub/Sub 編集者(roles/pubsub.editor)IAM ロールが必要です。このロールを付与されていない場合は、管理者にお問い合わせください。
サブスクリプションの名前を指定している。
サブスクリプションをアタッチする既存のトピックの名前を指定している。
push サブスクリプションを作成する場合、受信 URL のプロトコルとして、
pushEndpoint
フィールドにhttps://
を小文字で指定している(http://
やHTTPS://
は不可)。
定期購入に関するトラブルシューティングの詳細については、以下のページをご覧ください。
pull、push、BigQuery、または Cloud Storage のトラブルシューティング
権限に関する問題のトラブルシューティング
Pub/Sub 権限は、Pub/Sub リソースに対してアクションを実行できるユーザーとサービス アカウントを制御します。権限が正しく構成されていないと、権限拒否エラーが発生し、メッセージ フローが中断される可能性があります。監査ログには、すべての権限変更の詳細な記録が残るため、これらの問題の原因を特定できます。
監査ログで Pub/Sub の権限に関する問題のトラブルシューティングを行うには:
ログ エクスプローラを表示するために必要な権限を取得します。
詳細については、始める前にをご覧ください。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
既存の Google Cloud プロジェクト、フォルダ、または組織を選択します。
関連するログを見つけるために使用できるフィルタの一覧を次に示します。
resource.type="pubsub_topic" OR resource.type="pubsub_subscription"
: トピックまたはサブスクリプションの構成やアクセス制御の変更に関連する可能性のある問題のトラブルシューティングを行う場合は、このクエリを起点として使用します。他のフィルタと組み合わせて、検索結果をさらに絞り込むこともできます。protoPayload.methodName="google.iam.v1.SetIamPolicy"
: 権限の誤りや欠落が原因で問題が発生している疑いがある場合は、このクエリを使用します。これにより、IAM ポリシーの変更者と変更内容を追跡できます。これは、ユーザーがトピックにパブリッシュできない、サブスクリプションをサブスクライブできない、アプリケーションが Pub/Sub リソースへのアクセスを拒否された、アクセス制御の予期しない変更などの問題のトラブルシューティングに役立ちます。protoPayload.status.code=7
: 権限に明示的に関連するエラーが発生した場合は、このクエリを使用します。これにより、失敗しているアクションと、そのアクションを試みているユーザーを特定できます。このクエリを前のクエリと組み合わせて、権限拒否の原因となっている可能性のある特定のリソースと IAM ポリシーの変更を特定できます。
ログを分析して、イベントのタイムスタンプ、変更を行ったプリンシパル、行われた変更の種類などの要素を特定します。
監査ログから収集した情報に基づいて、是正措置を講じることができます。
サブスクリプションが削除された
Pub/Sub サブスクリプションは、主に次の 2 つの方法で削除できます。
十分な権限を持つユーザーまたはサービス アカウントが、サブスクリプションを意図的に削除します。
サブスクリプションは、一定期間(デフォルトでは 31 日間)非アクティブ状態が続くと自動的に削除されます。サブスクリプションの有効期限ポリシーの詳細については、有効期限をご覧ください。
削除されたサブスクリプションのトラブルシューティングを行うには、次の手順を行います。
Google Cloud コンソールで、Pub/Sub の [サブスクリプション] ページに移動し、サブスクリプションが一覧に表示されなくなったことを確認します。サブスクリプションを一覧表示する方法については、サブスクリプションを一覧表示するをご覧ください。
監査ログを確認します。ログ エクスプローラに移動します。フィルタ
protoPayload.methodName="google.pubsub.v1.Subscriber.DeleteSubscription"
を使用して、削除された定期購入を見つけます。ログを調べて、サブスクリプションが削除されたのか、非アクティブ状態が続いたために削除されたのかを確認します。InternalExpireInactiveSubscription
は、アクティビティがないためサブスクリプションが削除されたことを示します。トラブルシューティングに監査ログを使用する方法の詳細については、監査ログを使用して Pub/Sub の問題をトラブルシューティングするをご覧ください。
エラー 403 (Forbidden)
件
通常、403 エラーは、アクションを実行するための適切な権限がないことを意味します。たとえば、トピックに公開しようとしたときや、サブスクリプションから pull しようとしたときに、403 User not authorized
エラーが発生することがあります。
このエラーが発生した場合、以下を行ってください。
- 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
)を使用して、サブスクリプションが存在することを確認しています。GET
と CREATE
の両方が管理者オペレーションです。
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
}
次のコードサンプルを使用して、選択した言語でこのパターンを実装できます。
Go
次のサンプルでは、Go Pub/Sub クライアント ライブラリのメジャー バージョン(v2)を使用しています。まだ v1 ライブラリを使用している場合は、v2 への移行ガイドをご覧ください。v1 コードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API のリファレンス ドキュメントをご覧ください。
Node.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
Node.ts
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。