このドキュメントでは、Pub/Sub で Bigtable サブスクリプションを作成する方法について説明します。Bigtable サブスクリプションを使用すると、 Pub/Sub メッセージを Bigtable テーブルに直接書き込むことができます。
このサブスクリプション タイプの詳細については、 Bigtable サブスクリプションをご覧ください。
始める前に
Pub/Sub メッセージを書き込む Bigtable テーブルがすでに存在している必要があります。詳細については、 テーブルの作成と管理をご覧ください。
テーブルには
dataという名前の列ファミリーが必要です。テーブルの作成時に列ファミリーを追加できます。メッセージ メタデータをテーブルに書き込む場合は、テーブルに
pubsub_metadataという名前の列ファミリーも必要です。
必要なロールと権限
Bigtable サブスクリプションの作成に必要な権限を取得するには、管理者にプロジェクトに対するPub/Sub 編集者 (roles/pubsub.editor)IAM ロールを付与するよう依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。
この事前定義ロールには Bigtable サブスクリプションの作成に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
Bigtable サブスクリプションを作成するには、次の権限が必要です。
-
プロジェクトに対するpubsub.subscriptions.create -
トピックに対するpubsub.topics.attachSubscription
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
プロジェクト間のサブスクリプション
別のプロジェクトのトピックに対して 1 つのプロジェクトでサブスクリプションを作成する場合は、サブスクリプションを作成するプロジェクトに対する pubsub.subscriptions.create 権限と、トピックに対する pubsub.topics.attachSubscription 権限が必要です。
サービス アカウントに IAM のロールを付与する
Pub/Sub は、Identity and Access Management(IAM)サービス アカウントを使用して
リソースにアクセスします Google Cloud 。Pub/Sub が Bigtable に書き込めるようにするには、このサービス アカウントにBigtable ユーザー (roles/bigtable.user)ロールを付与する必要があります。
デフォルトでは、Pub/Sub は Pub/Sub サービス エージェント
(service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com) を使用します。
Bigtable サブスクリプションを作成するときに、
ユーザー管理のサービス アカウント
を指定することもできます。
Pub/Sub サービス エージェントを使用する
必要なロールを Pub/Sub サービス エージェントに付与する手順は次のとおりです。ロールは、プロジェクトまたはテーブルを含む Bigtable インスタンスに付与できます。
プロジェクト
コンソールで、[IAM] ページに移動します。 Google Cloud
[Google 提供のロール付与を含む] を選択します。
[Cloud Pub/Sub サービス アカウント] の行を見つけて、 [プリンシパルの編集] をクリックします。
[別のロールを追加] をクリックし、[Bigtable ユーザー] ロールを選択します。
詳細については、 コンソールを使用して IAM ロールを付与するをご覧ください。
インスタンス
コンソールで、[Bigtable] [>] [インスタンス] ページに移動します。 Google Cloud
[インスタンス] ページで、インスタンス名の横にあるチェックボックスをオンにします。
情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。
[person_add**プリンシパルを追加**] をクリックし、次の形式でサービス アカウント識別子を入力します。
service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com。[ロールを割り当てる] リストで [Bigtable ユーザー] を選択します。
[保存] をクリックします。リソースのロールがプリンシパルに付与されます。
カスタム サービス アカウントを使用する
Pub/Sub サービス エージェントにBigtable ユーザー ロールを付与すると、プロジェクトでサブスクリプションを作成する権限を持つユーザーは誰でも Bigtable テーブルに書き込むことができます。より詳細な 権限を付与する場合は、代わりに ユーザー管理のサービス アカウント を構成します。
Bigtable に書き込むようにユーザー管理のサービス アカウントを構成するには、次の権限が必要です。
ユーザー管理のサービス アカウントには、Bigtable ユーザー ロールが必要です。
Cloud Pub/Sub サービス アカウントには、ユーザー管理のサービス アカウントに対する
iam.serviceAccounts.getAccessToken権限が必要です。サブスクリプションを作成するユーザーには、ユーザー管理のサービス アカウントに対する
iam.serviceAccounts.actAs権限が必要です。
サブスクリプションを作成するときに、ユーザー管理のサービス アカウントを指定します。 詳細については、 Bigtable サブスクリプションを作成するをご覧ください。
Bigtable テーブルの書き込み
このセクションでは、Bigtable サブスクリプションが Pub/Sub メッセージをテーブルに書き込む方法について説明します。
メッセージ データ
Bigtable サブスクリプションは、Pub/Sub メッセージ データを data という名前の列ファミリーに書き込みます。
各行には、1 つのメッセージのデータが含まれます。
行キーは、サブスクリプション ID、メッセージ ID ソルト接頭辞、メッセージ ID を次の形式で連結したものです。
"projects/PROJECT_NUMBER/subscriptions/SUBSCRIPTION_ID#SALT_PREFIX#MESSAGE_ID"メッセージ データは、
data列ファミリーの 1 つの列に書き込まれます。 この列には、空の文字列("")の列修飾子があります。データは
BYTES型として書き込まれます。セルのタイムスタンプは、メッセージの パブリッシュ時刻です。
メッセージのメタデータ
デフォルトでは、サブスクリプションはメッセージ メタデータをテーブルに書き込みません。 必要に応じて、Bigtable サブスクリプションを 作成するときにメタデータの書き込みを有効にできます。
メタデータの書き込みが有効になっている場合、サブスクリプションはメッセージ メタデータを pubsub_metadata という名前の列ファミリーに書き込みます。サブスクリプションを作成する前に、テーブルにこの名前の列ファミリーがあることを確認してください。
サブスクリプションは、メッセージごとに、pubsub_metadata 列ファミリーの下に次の列を含む新しい行を書き込みます。
| 列 | 値 | データ型 |
|---|---|---|
subscription_name |
サブスクリプションの名前 | 文字列 |
message_id |
メッセージ ID | 文字列 |
attributes |
メッセージ属性を含む JSON オブジェクト | 文字列 |
Bigtable サブスクリプションを作成する
Bigtable サブスクリプションを作成するには、
gcloud beta pubsub subscriptions create
コマンドを使用します。
gcloud beta pubsub subscriptions create SUBSCRIPTION_ID \
--topic=TOPIC_ID \
--bigtable-table=projects/PROJECT_ID/instances/INSTANCE_ID/tables/TABLE_ID
次のように置き換えます。
SUBSCRIPTION_ID: サブスクリプションの名前。TOPIC_ID: 読み取るトピックの名前または ID。PROJECT_ID: プロジェクト ID。INSTANCE_ID: テーブルが含まれている Bigtable インスタンスの ID。TABLE_ID: 書き込むテーブルの ID。テーブルにはdataという名前の列ファミリーが必要です。
次のフラグは省略可能です。
--bigtable-write-metadata: メッセージ メタデータを書き込むかどうかを指定します。このフラグを省略すると、サブスクリプションはメタデータを書き込みません。詳細については、メッセージのメタデータをご覧ください。--bigtable-app-profile-id=APP_PROFILE: Bigtable の書き込みに使用する アプリ プロファイルを指定します。アプリ プロファイルでは、 単一クラスタ ルーティングを使用する必要があります。このフラグが指定されていない場合、サブスクリプションはデフォルトのアプリ プロファイルを使用します。--bigtable-service-account-email: Bigtable への書き込み時に使用するサービス アカウントを指定します。指定しない場合、サブスクリプションは Pub/Sub サービス エージェントを使用します。詳細については、 カスタム サービス アカウントを使用するをご覧ください。
例: Pub/Sub から Bigtable への書き込み
次の例は、Bigtable サブスクリプションを作成し、そのサブスクリプションを使用して Pub/Sub メッセージを Bigtable テーブルに書き込み、テーブルにクエリを実行する方法を示しています。
my-instanceという名前の新しい Bigtable インスタンスを作成します。gcloud bigtable instances create my-instance --display-name="My instance" \ --cluster-config=id=my-cluster-1,zone=ZONE,nodes=1ZONE は、クラスタが実行される ゾーン に置き換えます。例:
us-central1-bdataという名前の列ファミリーを持つtable-1という名前の Bigtable テーブルを作成します。gcloud bigtable instances tables create table-1 \ --instance=my-instance \ --column-families=datatopic-1という名前の Pub/Sub トピックを作成します。gcloud pubsub topics create topic-1トピックから読み取る Bigtable サブスクリプションを作成します。
gcloud beta pubsub subscriptions create bigtable-sub \ --topic=topic-1 \ --bigtable-table=projects/PROJECT_ID/instances/my-instance/tables/table-1PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。
メッセージをトピックにパブリッシュします。
gcloud pubsub topics publish topic-1 --message='{"name":"Alice"}'メッセージが正常にパブリッシュされると、出力はメッセージ ID になります。
messageIds: - 'MESSAGE_ID'
Bigtable サブスクリプションは、メッセージ データを data 列ファミリーに書き込みます。データをクエリする手順は次のとおりです。
コンソールで、Bigtable の [インスタンス] ページに移動します。 Google Cloud
my-cluster-1という名前のインスタンスをクリックします。ナビゲーション メニューで [Bigtable Studio] をクリックします。
クエリエディタで、 次の SQL クエリを実行します。
SELECT _key, JSON_VALUE(CAST(data[''] AS STRING), '$.name') AS name FROM table-1;クエリ結果は次のようになります。
+-------------------+ | _key | name | +-----------|-------+ | "ROW_KEY" | Alice | +-------------------+メッセージ データは
BYTES型として保存されます。この例では、データは JSON 文字列であるため、クエリは GoogleSQL JSON 関数を使用して データを解析できます。
Bigtable サブスクリプションをモニタリングする
Cloud Monitoring には、サブスクリプションを モニタリングするための指標が多数用意されています。
Pub/Sub に関連する使用可能なすべての指標のリストとその説明については、Pub/Sub のモニタリング ドキュメントをご覧ください。
Pub/Sub 内からサブスクリプションをモニタリングすることもできます。
次のステップ
- Bigtable サブスクリプションの詳細を確認する 。
- サブスクリプション タイプを選択する。
- Bigtable サブスクリプションのトラブルシューティングを行う