このドキュメントでは、Pub/Sub トピックのスキーマを関連付ける方法について説明します。
準備
- Pub/Sub スキーマの仕組みを理解する。
- スキーマの作成
必要なロールと権限
スキーマの関連付けと管理に必要な権限を取得するには、プロジェクトに対する Pub/Sub 編集者 (roles/pubsub.editor
) IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
この事前定義ロールには、スキーマの関連付けと管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
スキーマを関連付けて管理するには、次の権限が必要です。
-
スキーマを作成します:
pubsub.schemas.create
-
スキーマをトピックに添付します:
pubsub.schemas.attach
-
スキーマのリビジョンを commit します:
pubsub.schemas.commit
-
スキーマまたはスキーマ リビジョンを削除します:
pubsub.schemas.delete
-
スキーマまたはスキーマのリビジョンを取得します:
pubsub.schemas.get
-
スキーマを一覧表示します:
pubsub.schemas.list
-
スキーマのリビジョンを一覧表示します:
pubsub.schemas.listRevisions
-
スキーマをロールバックします:
pubsub.schemas.rollback
-
メッセージを検証します:
pubsub.schemas.validate
-
スキーマの IAM ポリシーを取得します:
pubsub.schemas.getIamPolicy
-
スキーマの IAM ポリシーを構成します:
pubsub.schemas.setIamPolicy
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
ユーザー、グループ、ドメイン、サービス アカウントなどのプリンシパルにロールと権限を付与できます。あるプロジェクトにスキーマを作成し、別のプロジェクトにあるトピックにアタッチできます。プロジェクトごとに必要な権限があることを確認します。
スキーマをトピックに関連付けるためのガイドライン
トピックの作成時または編集時に、スキーマをトピックに関連付けることができます。スキーマをトピックに関連付ける際のガイドラインは次のとおりです。
スキーマを 1 つ以上のトピックに関連付けることができます。
スキーマがトピックに関連付けられた後、トピックがパブリッシャーから受信するすべてのメッセージはそのスキーマに従う必要があります。
スキーマをトピックに関連付ける場合は、
BINARY
またはJSON
として公開されるメッセージのエンコードも指定する必要があります。Avro スキーマで JSON を使用する場合は、ユニオンのエンコード ルールに十分注意してください。トピックに関連付けられたスキーマにリビジョンがある場合、メッセージはエンコードと一致している必要があり、使用可能な範囲内のリビジョンに対して検証する必要があります。検証が行われない場合、メッセージはパブリッシュに失敗します。
リビジョンは作成日時に基づいて、日付の新しい順に試行されます。スキーマ・リビジョンを作成するには、スキーマ・リビジョンを commit するを参照してください。
メッセージ スキーマの検証ロジック
スキーマをトピックに関連付ける際、スキーマにリビジョンがある場合は、使用するリビジョンのサブセット範囲を指定できます。範囲を指定しない場合は、範囲全体が検証に使用されます。
リビジョンを [使用可能な最初のリビジョン] として指定しない場合、スキーマの既存の最も古いリビジョンが検証に使用されます。リビジョンを [使用可能な最後のリビジョン] として指定しない場合、スキーマの既存の最新のリビジョンが使用されます。
トピック T
にアタッチされているスキーマ S
の例を見てみましょう。
スキーマ S
には、リビジョン ID A
、B
、C
、D
が順番に作成されます。ここで、A
は最初または最も古いリビジョンです。スキーマが同一でないか、または既存のスキーマをロールバックしていません。
[使用可能な最初のリビジョン] フィールドを
B
に設定した場合にのみ、スキーマA
のみに準拠するメッセージは拒否され、スキーマB
、C
、D
に準拠するメッセージは受け入れられます。[使用可能な最後のリビジョン] フィールドを
C
に設定した場合にのみ、スキーマA
、B
、C
に準拠するメッセージが受け入れられ、スキーマD
のみに準拠するメッセージは拒否されます。[使用可能な最初のリビジョン] フィールドを
B
、[使用可能な最後のリビジョン] フィールドをC
に設定した場合、スキーマB
とC
に準拠するメッセージが受け入れられます。また、最初のリビジョンと最後のリビジョンを同じリビジョン ID に設定することもできます。この場合、そのリビジョンに準拠したメッセージのみが受け入れられます。
トピックの作成時にスキーマを作成して関連付ける
スキーマを含むトピックは、Google Cloud コンソール、gcloud CLI、Pub/Sub API、または Cloud クライアント ライブラリを使用して作成できます。
Console
Google Cloud コンソールで、Pub/Sub の [トピック] ページに移動します。
[トピックを作成] をクリックします。
[トピック ID] に、トピックの ID を入力します。
トピックの命名については、ガイドラインをご覧ください。
[スキーマを使用する] チェックボックスをオンにします。
残りのフィールドはデフォルト設定のままにします。
スキーマを作成するか、既存のスキーマを使用します。
スキーマを作成する場合は、次の手順を行います。 `
- [Pub/Sub スキーマを選択] で、[新しいスキーマを作成] を選択します。
2 番目のタブに [スキーマの作成] ページが表示されます。
スキーマを作成するの手順に従います。
[トピックの作成] タブに戻り、[更新] をクリックします。
[Pub/Sub スキーマを選択] フィールドでスキーマを検索します。
メッセージのエンコードを [JSON] または [バイナリ] として選択します。
作成したスキーマにはリビジョン ID があります。スキーマ リビジョンを commit するで説明したように、追加のスキーマ リビジョンを作成できます。
作成済みのスキーマを関連付ける場合は、次の操作を行います。
[Pub/Sub スキーマを選択] で、既存のスキーマを選択します。
メッセージのエンコードを [JSON] または [バイナリ] として選択します。
省略可: 選択したスキーマにリビジョンがある場合、[リビジョン範囲] で、[使用可能な最初のリビジョン] と [使用可能な最後のリビジョン] のプルダウン メニューを使用します。
両方のフィールドを指定することも、1 つのみを指定することも、要件に基づいてデフォルト設定を保持することもできます。
残りのフィールドはデフォルト設定のままにします。
[作成] をクリックしてトピックを保存し、選択したスキーマに割り当てます。
gcloud
以前に作成したスキーマが割り当てられたトピックを作成するには、次の gcloud pubsub topics create
コマンドを実行します。
gcloud pubsub topics create TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_ID \ --first-revision-id=FIRST_REVISION_ID \ --last-revision-id=LAST_REVISION_ID \
ここで
- TOPIC_ID は、作成するトピックの ID です。
- ENCODING_TYPE は、スキーマに対して検証されるメッセージのエンコードです。この値は
JSON
またはBINARY
に設定する必要があります。 - SCHEMA_ID は、既存のスキーマの ID です。
- FIRST_REVISION_ID は、検証する最も古いリビジョンの ID です。
- LAST_REVISION_ID は、検証する最新のリビジョンの ID です。
--first-revision-id
と --last-revision-id
はどちらも省略可能です。
別の Google Cloud プロジェクトからスキーマを割り当てることもできます。
gcloud pubsub topics create TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_ID \ --schema-project=SCHEMA_PROJECT \ --project=TOPIC_PROJECT
ここで
- SCHEMA_PROJECT は、スキーマの Google Cloud プロジェクトのプロジェクト ID です。
- TOPIC_PROJECT は、トピックの Google Cloud プロジェクトのプロジェクト ID です。
REST
トピックを作成するには、projects.topics.create
メソッドを使用します。
リクエスト:
リクエストは、Authorization
ヘッダー内のアクセス トークンにより認証を受ける必要があります。現在のアプリケーションのデフォルト認証情報のアクセス トークンを取得する場合は、gcloud auth application-default print-access-token
を使用します。
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID Authorization: Bearer ACCESS_TOKEN
リクエストの本文:
{ "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
ここで
- PROJECT_ID はプロジェクト ID です。
- TOPIC_ID はトピック ID です。
- SCHEMA_NAME は、公開されたメッセージが検証される必要があるスキーマの名前です。形式は
projects/PROJECT_ID/schemas/SCHEMA_ID
です。 - ENCODING_TYPE は、スキーマに対して検証されるメッセージのエンコードです。
JSON
またはBINARY
に設定する必要があります。 - FIRST_REVISION_ID は、検証する最も古いリビジョンの ID です。
- LAST_REVISION_ID は、検証する最新のリビジョンの ID です。
firstRevisionId
と lastRevisionId
はどちらも省略可能です。
レスポンス:
{ "name": "projects/PROJECT_ID/topics/TOPIC_ID", "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
firstRevisionId
と lastRevisionId
がリクエストに指定されていない場合、どちらも省略されます。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
C#
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、Pub/Sub C# API リファレンス ドキュメントをご覧ください。
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の 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 Ruby API リファレンス ドキュメントをご覧ください。
トピックに関連付けられたスキーマを編集する
トピックを編集して、スキーマのアタッチ、スキーマの削除、メッセージの検証に使用するリビジョン範囲の更新を行うことができます。一般に、使用しているスキーマに対して変更を計画している場合は、新しいリビジョンを commit し、トピックに使用されるリビジョンの範囲を更新します。
トピックに関連付けられたスキーマは、Google Cloud コンソール、gcloud CLI、Pub/Sub API、Cloud クライアント ライブラリを使用して編集できます。
Console
Google Cloud コンソールで、Pub/Sub の [トピック] ページに移動します。
トピックのトピック ID をクリックします。
[トピックの詳細] ページで、[編集] をクリックします。
スキーマを次のように変更できます。
変更が反映されるまで数分かかることがあります。
トピックからスキーマを削除する場合は、[トピックの編集] ページで [スキーマを使用する] チェックボックスをオフにします。
スキーマを変更する場合は、[スキーマ] セクションでスキーマの名前を選択します。
必要に応じて他のフィールドを更新します。
- リビジョン範囲を更新する場合、[リビジョン範囲] で、[使用可能な最初のリビジョン] と [使用可能な最後のリビジョン] のプルダウン メニューを使用します。
両方のフィールドを指定することも、1 つのみを指定することも、要件に基づいてデフォルト設定を保持することもできます。
[更新] をクリックして変更を保存します。
gcloud
gcloud pubsub topics update TOPIC_ID \ --message-encoding=ENCODING_TYPE \ --schema=SCHEMA_NAME \ --first-revision-id=FIRST_REVISION_ID \ --last-revision-id=LAST_REVISION_ID \
ここで
- TOPIC_ID は、作成するトピックの ID です。
- ENCODING_TYPE は、スキーマに対して検証されるメッセージのエンコードです。この値は
JSON
またはBINARY
に設定する必要があります。 - SCHEMA_NAME は、既存のサブネットの名前です。
- FIRST_REVISION_ID は、検証する最も古いリビジョンの ID です。
- LAST_REVISION_ID は、検証する最新のリビジョンの ID です。
--first-revision-id
と --last-revision-id
はどちらも省略可能です。
REST
トピックを更新するには、projects.topics.patch
メソッドを使用します。
リクエスト:
リクエストは、Authorization
ヘッダー内のアクセス トークンにより認証を受ける必要があります。現在のアプリケーションのデフォルト認証情報のアクセス トークンを取得する場合は、gcloud auth application-default print-access-token
を使用します。
PATCH https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID Authorization: Bearer ACCESS_TOKEN
リクエストの本文:
{ "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" "update_mask": } }
ここで
- PROJECT_ID はプロジェクト ID です。
- TOPIC_ID はトピック ID です。
- SCHEMA_NAME は、公開されたメッセージが検証される必要があるスキーマの名前です。形式は
projects/PROJECT_ID/schemas/SCHEMA_ID
です。 - ENCODING_TYPE は、スキーマに対して検証されるメッセージのエンコードです。
JSON
またはBINARY
に設定する必要があります。 - FIRST_REVISION_ID は、検証する最も古いリビジョンの ID です。
- LAST_REVISION_ID は、検証する最新のリビジョンの ID です。
firstRevisionId
と lastRevisionId
はどちらも省略可能です。
レスポンス:
{ "name": "projects/PROJECT_ID/topics/TOPIC_ID", "schemaSettings": { "schema": "SCHEMA_NAME", "encoding": "ENCODING_TYPE" "firstRevisionId": "FIRST_REVISION_ID" "lastRevisionId": "LAST_REVISION_ID" } }
firstRevisionId
と lastRevisionId
はどちらも、更新後には設定されません。
C++
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の C++ の設定手順を実施してください。詳細については、Pub/Sub C++ API リファレンス ドキュメントをご覧ください。
Go
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Go の設定手順を実施してください。詳細については、Pub/Sub Go API リファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、Pub/Sub Java API リファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、クイックスタート: クライアント ライブラリの使用の Python の設定手順を実施してください。詳細については、Pub/Sub Python API リファレンス ドキュメントをご覧ください。
0