サブスクライバーは、さまざまな理由でメッセージを処理できない場合があります。たとえば、メッセージの処理に必要なデータを取得する際に一時的な問題が発生している可能性があります。サブスクライバーが想定していない形式のメッセージが含まれている場合もあります。
サブスクライバーが確認応答できない配信不能メッセージを管理するために、Pub/Sub はこれらのメッセージをデッドレター トピック(デッドレター キューとも呼ばれます)に転送できます。
始める前に
デッドレター トピック構成のトピックを作成します。
また、このページの手順をすべて実行する場合は、後続のステップでトピックを作成できます。
必要なロール
トピックとサブスクリプションの管理に必要な権限を取得するには、プロジェクトに対する Pub/Sub 編集者 (roles/pubsub.editor
)の IAM ロールを付与するように管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
アクセス制御は、プロジェクト レベルと個々のリソースレベルで構成できます。あるプロジェクトにサブスクリプションを作成し、別のプロジェクトにあるトピックにアタッチできます。プロジェクトごとに必要な権限があることを確認します。
デッドレター トピックの仕組み
サブスクライバー アプリケーションがメッセージを確認応答できない場合、Pub/Sub は確認応答期限に達するか、メッセージの有効期限が切れるまで配信を再試行します。構成された配信試行回数に達すると、Pub/Sub は配信不能メッセージをデッドレター トピックに転送できます。
Pub/Sub が配信不能メッセージを転送すると、元のメッセージが新しいメッセージでラップされ、送信元サブスクリプションを識別する属性が追加されます。メッセージは、指定されたデッドレター トピックに送信されます。デッドレター トピックにアタッチされた別のサブスクリプションは、転送されたこれらのメッセージを受信して、分析とオフライン デバッグを行うことができます。
配信の最大試行回数の計算方法
Pub/Sub は、デッドレター トピックが正しく構成され、正しい IAM 権限が含まれている場合にのみ、配信の試行回数をカウントします。
Pub/Sub では、ベスト エフォート方式でメッセージが転送されるため、配信の最大試行回数には誤差が生じる場合があります。サービスは、構成された試行回数よりも少ない回数でメッセージを転送したり、転送前に数回配信を試行したりする場合があります。
特に、非アクティブなサブスクライバーを持つ pull サブスクリプションの場合、メッセージの配信試行回数はゼロにリセットされることもあります。その結果、構成された最大配信試行回数を超えて、サブスクライバー クライアントにメッセージが配信される可能性があります。
デッドレター トピックのプロパティ
デッドレター トピックには、次のサブスクリプション プロパティを設定できます。
配信試行回数の上限: Pub/Sub が特定のメッセージに対して行う配信の試行回数を示す数値。構成された配信試行回数内にサブスクライバー クライアントがメッセージを確認応答できない場合、メッセージはデッドレター トピックに転送されます。
- デフォルト値 = 5
- 最大値 = 100
- 最小値 = 5
デッドレター トピックを含むプロジェクト: デッドレター トピックがサブスクリプションとは異なるプロジェクトにある場合、そのデッドレター トピックがあるプロジェクトを指定する必要があります。サブスクリプションが接続されているトピックとは異なるトピックに、デッドレター トピックを設定します。
デッドレター トピックを構成する
次の手順では、デッドレター トピックを使用するワークフローについて説明します。
トピックを作成します(デッドレター トピックとして使用するため)。
デッドレター トピックのサブスクリプションを作成します。
サブスクリプションでデッド レタリングを有効にします。
先ほど作成したトピックをサブスクリプションに関連付けます。
デッドレター トピックを使用するために必要なロールを Pub/Sub サービス アカウントに付与します。
デッドレター トピックで使用するトピックを作成する
サブスクリプションに使用するトピックをすでに作成している場合は、この手順をスキップできます。
Google Cloud コンソールで、[トピック] ページに移動します。
[トピックを作成] をクリックします。
トピック ID を入力します(例:
my-test-topic
)。デフォルトのサブスクリプションのオプションを保持し、[作成] をクリックします。
サブスクリプションにデッドレター トピックを設定する
デッドレター トピックは、新しいサブスクリプションまたは既存のサブスクリプションに設定できます。
新しいサブスクリプションにデッドレター トピックを設定する
Google Cloud コンソール、Google Cloud CLI、クライアント ライブラリ、または Pub/Sub API を使用して、サブスクリプションを作成してデッドレター トピックを設定できます。
コンソール
サブスクリプションを作成してデッドレター トピックを設定するには、次の手順を実行します。
Google Cloud コンソールで、[サブスクリプション] ページに移動します。
[サブスクリプションを作成] をクリックします。
[サブスクリプション ID] を入力します。
定期購入で使用するトピックを選択します。サブスクリプションがトピックからメッセージを受信します。これはデッドレター トピックではありません。これは次のステップで選択します。
[配信エラー]セクションで、[配信エラーを有効にする]を選択します。
プルダウン メニューからデッドレター トピックを選択します。
選択したデッドレター トピックにサブスクリプションがない場合、サブスクリプションを作成するように求められます。
[配信の最大試行回数] フィールドで、5〜100 の整数を指定します。
[作成] をクリックします。
[詳細パネル] をクリックして、実行可能なアクション アイテムを確認します。いずれかの項目にエラーアイコン
が表示されている場合は、操作項目をクリックして問題を解決します。
gcloud
サブスクリプションを作成してデッドレター トピックを設定するには、gcloud pubsub subscriptions create
コマンドを使用します。
gcloud pubsub subscriptions create subscription-id \ --topic=topic-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
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.js
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Node.js の設定手順を実施してください。詳細については、Pub/Sub Node.js API リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
Ruby
次のサンプルでは、Ruby Pub/Sub クライアント ライブラリ v3 を使用しています。v2 ライブラリをまだ使用している場合は、 v3 への移行ガイドをご覧ください。Ruby v2 のコードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。 詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
既存のサブスクリプションのデッドレター トピックを設定する
Google Cloud コンソール、gcloud CLI、クライアント ライブラリ、または Pub/Sub API を使用して、サブスクリプションを更新してデッドレター トピックを設定できます。
コンソール
サブスクリプションを更新してデッドレター トピックを設定するには、次の手順を実行します。
Google Cloud コンソールで、[サブスクリプション] ページに移動します。
更新するサブスクリプションの横にある [その他の操作] アイコン more_vert をクリックします。
コンテキスト メニューで [編集] を選択します。
[配信エラー]セクションで、[配信エラーを有効にする]を選択します。
プルダウン メニューからデッドレター トピックを選択します。
選択したデッドレター トピックにサブスクリプションがない場合、サブスクリプションを作成するように求められます。
[配信の最大試行回数] フィールドで、5〜100 の整数を指定します。
[更新] をクリックします。
[詳細パネル] をクリックして、実行可能なアクション アイテムを確認します。いずれかの項目にエラーアイコン
が表示されている場合は、操作項目をクリックして問題を解決します。
gcloud
サブスクリプションを更新してデッドレター トピックを設定するには、gcloud pubsub subscriptions update
コマンドを使用します。
gcloud pubsub subscriptions update subscription-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
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 リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
Ruby
次のサンプルでは、Ruby Pub/Sub クライアント ライブラリ v3 を使用しています。v2 ライブラリをまだ使用している場合は、 v3 への移行ガイドをご覧ください。Ruby v2 のコードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。 詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
デッドレター トピックを使用するための IAM ロールを付与する
配信不能メッセージをデッドレター トピックに転送するには、Pub/Sub に次の権限が付与されている必要があります。
- トピックにメッセージをパブリッシュする。
- メッセージに確認応答することにより、メッセージをサブスクリプションから削除します。
Pub/Sub は、プロジェクト service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com
ごとにサービス アカウントを作成して維持します。このサービス アカウントにパブリッシャーとサブスクライバーのロールを割り当てることで、転送権限を付与できます。
コンソール
デッドレター トピックにメッセージをパブリッシュする権限を Pub/Sub に付与する手順は次のとおりです。
Google Cloud コンソールで、[サブスクリプション] ページに移動します。
デッドレター トピックがあるサブスクリプションの名前をクリックします。
[デッド レタリング] タブをクリックします。
パブリッシャーのロールを割り当てるには、[パブリッシャーのロールを付与する] をクリックします。パブリッシャー ロールが正常に割り当てられていると、青いチェックマーク
が表示されます。サブスクライバーのロールを割り当てるには、[サブスクライバーのロールを付与する] をクリックします。パブリッシャー ロールが正常に割り当てられていると、青いチェックマーク
が表示されます。
gcloud
デッドレター トピックにメッセージをパブリッシュする権限を Pub/Sub に付与するには、次のコマンドを実行します。
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub topics add-iam-policy-binding dead-letter-topic-name \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.publisher"
転送された配信不能メッセージに確認応答する権限を Pub/Sub に付与するには、次のコマンドを実行します。
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub subscriptions add-iam-policy-binding subscription-id \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.subscriber"
配信試行の確認
サブスクリプションのデッドレター トピックを有効にすると、そのサブスクリプションのすべてのメッセージに配信試行回数を指定するフィールドが表示されます。
pull サブスクリプションから受信したメッセージには
delivery_attempt
フィールドが含まれます。push サブスクリプションから受信したメッセージには
deliveryAttempt
フィールドが含まれます。
次のサンプルは、配信の試行回数を取得する方法を示しています。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
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 リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
Ruby
次のサンプルでは、Ruby Pub/Sub クライアント ライブラリ v3 を使用しています。v2 ライブラリをまだ使用している場合は、 v3 への移行ガイドをご覧ください。Ruby v2 のコードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Pub/Sub が配信不能メッセージをデッドレター トピックに転送すると、次の属性がメッセージに追加されます。
CloudPubSubDeadLetterSourceDeliveryCount
: ソース サブスクリプションへの配信試行回数。CloudPubSubDeadLetterSourceSubscription
: ソース サブスクリプションの名前。CloudPubSubDeadLetterSourceSubscriptionProject
: ソース サブスクリプションを含むプロジェクトの名前。CloudPubSubDeadLetterSourceTopicPublishTime
: メッセージが最初にパブリッシュされたときのタイムスタンプ。CloudPubSubDeadLetterSourceDeliveryErrorMessage
: メッセージを元の宛先に配信できなかった理由。この属性は、サブスクリプションのエクスポートでのみ使用できます。
転送されたメッセージのモニタリング
配信不能メッセージを転送すると、Pub/Sub サービスは、サブスクリプションからメッセージを削除します。転送されるメッセージは、Cloud Monitoring を使用してモニタリングできます。
サブスクリプションをデッドレター トピックに接続すると、メッセージには、デッドレター トピック プロパティの有効期限ではなく、接続したサブスクリプションの有効期限ポリシーが使用されます。
subscription/dead_letter_message_count
指標には、Pub/Sub が転送するサブスクリプションの配信不能メッセージの数が記録されます。
詳細については、転送された配信不能メッセージのモニタリングをご覧ください。
デッドレター トピックを削除する
配信不能メッセージの転送を停止するには、サブスクリプションからデッドレター トピックを削除します。
サブスクリプションからデッドレター トピックを削除するには、Google Cloud コンソール、gcloud CLI、または Pub/Sub API を使用します。
コンソール
サブスクリプションからデッドレター トピックを削除するには、次の手順を行います。
Google Cloud コンソールで、[サブスクリプション] ページに移動します。
サブスクリプションのリストで、更新するサブスクリプションの横にある more_vert をクリックします。
コンテキスト メニューから [編集] を選択します。
[配信エラー]セクションで、[配信エラーを有効にする]をオフにします。
[更新] をクリックします。
gcloud
サブスクリプションからデッドレター トピックを削除するには、--clear-dead-letter-policy
フラグを付けた gcloud pubsub subscriptions update
コマンドを使用します。
gcloud pubsub subscriptions update subscription-id \ --clear-dead-letter-policy
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
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 リファレンス ドキュメントをご覧ください。
PHP
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の PHP の設定手順を実施してください。詳細については、Pub/Sub PHP API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API のリファレンス ドキュメントをご覧ください。
Ruby
次のサンプルでは、Ruby Pub/Sub クライアント ライブラリ v3 を使用しています。v2 ライブラリをまだ使用している場合は、 v3 への移行ガイドをご覧ください。Ruby v2 のコードサンプルの一覧については、 非推奨のコードサンプルをご覧ください。
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Ruby の設定手順を実施してください。詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Ruby
このサンプルを試す前に、Pub/Sub クイックスタート: クライアント ライブラリの使用にある Ruby 向けの手順に従って設定を行ってください。 詳細については、Pub/Sub Ruby API のリファレンス ドキュメントをご覧ください。
Pub/Sub に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
料金
Pub/Sub サービスが配信不能メッセージを転送すると、次の料金が適用されます。
- デッドレター トピックを含むプロジェクトの請求先アカウントに対して、パブリッシュ手数料。
- デッドレター トピック プロパティのあるサブスクリプションを含むプロジェクトに関連付けられた請求先アカウントに対して請求される送信メッセージの利用料金。
サブスクリプションのデッドレター トピック プロパティは設定しているが、デッドレター トピックのメッセージ ストレージ ロケーション ポリシーを設定しておらず、トピックでサブスクリプションを含むリージョンが許可されていな場合は、送信メッセージのパブリッシュ料金も適用されます。
送信メッセージのパブリッシュ料金は、デッドレター トピックを含むプロジェクトに対して請求されます。詳細については、料金をご覧ください。
## 次のステップ