Bigtable サブスクリプションを作成する

このドキュメントでは、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 インスタンスに付与できます。

プロジェクト

  1. コンソールで、[IAM] ページに移動します。 Google Cloud

    [IAM] に移動

  2. [Google 提供のロール付与を含む] を選択します。

  3. [Cloud Pub/Sub サービス アカウント] の行を見つけて、 [プリンシパルの編集] をクリックします。

  4. [別のロールを追加] をクリックし、[Bigtable ユーザー] ロールを選択します。

詳細については、 コンソールを使用して IAM ロールを付与するをご覧ください。

インスタンス

  1. コンソールで、[Bigtable] [>] [インスタンス] ページに移動します。 Google Cloud

    [インスタンス] に移動

  2. [インスタンス] ページで、インスタンス名の横にあるチェックボックスをオンにします。

  3. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。

  4. [person_add**プリンシパルを追加**] をクリックし、次の形式でサービス アカウント識別子を入力します。

    service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com

  5. [ロールを割り当てる] リストで [Bigtable ユーザー] を選択します。

  6. [保存] をクリックします。リソースのロールがプリンシパルに付与されます。

カスタム サービス アカウントを使用する

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 テーブルに書き込み、テーブルにクエリを実行する方法を示しています。

  1. my-instance という名前の新しい Bigtable インスタンスを作成します。

    gcloud bigtable instances create my-instance --display-name="My instance" \
      --cluster-config=id=my-cluster-1,zone=ZONE,nodes=1
    

    ZONE は、クラスタが実行される ゾーン に置き換えます。例: us-central1-b

  2. data という名前の列ファミリーを持つ table-1 という名前の Bigtable テーブルを作成します。

    gcloud bigtable instances tables create table-1 \
      --instance=my-instance \
      --column-families=data
    
  3. topic-1 という名前の Pub/Sub トピックを作成します。

    gcloud pubsub topics create topic-1
    
  4. トピックから読み取る Bigtable サブスクリプションを作成します。

    gcloud beta pubsub subscriptions create bigtable-sub \
      --topic=topic-1 \
      --bigtable-table=projects/PROJECT_ID/instances/my-instance/tables/table-1
    

    PROJECT_ID は、実際の Google Cloud プロジェクト ID に置き換えます。

  5. メッセージをトピックにパブリッシュします。

    gcloud pubsub topics publish topic-1 --message='{"name":"Alice"}'
    

    メッセージが正常にパブリッシュされると、出力はメッセージ ID になります。

    messageIds:
    - 'MESSAGE_ID'
    

Bigtable サブスクリプションは、メッセージ データを data 列ファミリーに書き込みます。データをクエリする手順は次のとおりです。

  1. コンソールで、Bigtable の [インスタンス] ページに移動します。 Google Cloud

    [インスタンス] に移動

  2. my-cluster-1 という名前のインスタンスをクリックします。

  3. ナビゲーション メニューで [Bigtable Studio] をクリックします。

  4. クエリエディタで、 次の 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 内からサブスクリプションをモニタリングすることもできます。

次のステップ