BigQuery へのエクスポート

このトピックでは、組織、フォルダ、またはプロジェクトのアセット メタデータを BigQuery テーブルにエクスポートし、インベントリに対してデータ分析を行う方法を説明します。BigQuery は、カスタム スクリプトを使用しなくてもデータを分析し、有用な分析情報を提供できる SQL のような操作性を備えています。

始める前に

始める前に、次の手順を行います。

  1. API コマンドを実行するプロジェクトで Cloud Asset Inventory API を有効にします。
    Cloud Asset Inventory API を有効にする

  2. gcloud ツールまたは API を使用して Cloud Asset Inventory API を呼び出すために必要な権限を構成します。

  3. 環境を設定するには、次の手順を実行します。

    gcloud

    gcloud ツールを使用して Cloud Asset Inventory API を呼び出すように環境を設定するには、ローカル クライアントに Cloud SDK をインストールします。

    API

    Unix の curl コマンドで Cloud Asset Inventory API を呼び出すように環境を設定するには、次の手順を行います。

    1. ローカルマシンに oauth2l をインストールし、Google OAuth システムを操作できるようにします。
    2. Unix curl コマンドにアクセスできるかを確認します。
    3. プロジェクト、フォルダ、組織で、次のいずれかのロールがアカウントに付与されていることを確認します。

      • Cloud Asset 閲覧者のロール(roles/cloudasset.viewer
      • オーナーの基本ロール(roles/owner
  4. Cloud Asset Inventory API が有効になっていないプロジェクト内の BigQuery データセットにエクスポートする場合は、宛先プロジェクトの service-${CONSUMER_PROJECT_NUMBER}@gcp-sa-cloudasset.iam.gserviceaccount.com サービス アカウントに次のロールを付与する必要もあります。

    • BigQuery データ編集者のロール(roles/bigquery.dataEditor
    • BigQuery ユーザーのロール(roles/bigquery.user

    サービス アカウントは、API を 1 回呼び出すことで作成されます。または、次のコマンドを使用してサービス アカウントを作成し、サービス エージェントのロールを手動で付与することもできます。

      gcloud beta services identity create --service=cloudasset.googleapis.com --project=PROJECT_ID
      gcloud projects add-iam-policy-binding PROJECT_ID --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com --role=roles/cloudasset.serviceAgent
    

  5. BigQuery データセットを作成します。

アセット スナップショットのエクスポート

任意のタイムスタンプにおけるアセット スナップショットをエクスポートするには、次の手順を行います。

gcloud

プロジェクト内のアセットをエクスポートするには、次のコマンドを実行します。このコマンドは、エクスポートされたスナップショットを BIGQUERY_TABLE の BigQuery テーブルに保存します。

  gcloud asset export \
     --content-type CONTENT_TYPE \
     --project 'PROJECT_ID' \
     --snapshot-time 'SNAPSHOT_TIME' \
     --bigquery-table 'BIGQUERY_TABLE' \
     --output-bigquery-force

ここで

  • CONTENT_TYPE はアセットのコンテンツ タイプです。
  • PROJECT_ID は、メタデータをエクスポートするプロジェクトの ID です。このプロジェクトは、エクスポートの実行元のプロジェクトまたは別のプロジェクトに設定できます。
  • SNAPSHOT_TIME(省略可)は、アセットのスナップショットを作成する時刻です。値は、現在の時刻または過去の時刻に指定する必要があります。デフォルトでは、現在の時刻にスナップショットが作成されます。時刻形式の詳細については、gcloud topic datetimes をご覧ください。
  • BIGQUERY_TABLE は、メタデータのエクスポート先のテーブルです。形式は projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME です。
  • --output-bigquery-force は、宛先テーブルが存在する場合に宛先テーブルを上書きします。

組織またはフォルダのアセットをエクスポートするには、--project の代わりに次のいずれかのフラグを使用します。

access-policy--organization に対してのみエクスポートできます。

API

プロジェクト内のアセット メタデータをエクスポートするには、次のコマンドを実行します。このコマンドは、エクスポートされたスナップショットを TABLE_NAME という BigQuery テーブルに保存します。詳細については、exportAssets メソッドをご覧ください。

gcurl -d '{"contentType":"CONTENT_TYPE", \
  "outputConfig":{ \
    "bigqueryDestination": { \
      "dataset": "projects/PROJECT_ID/datasets/DATASET_ID",\
      "table": "TABLE_NAME", \
      "force": true \
    } \
  }}' \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets

コンテンツ タイプの設定

すべての BigQuery テーブルは、列名、データ型、その他の情報を記述するスキーマによって定義されます。エクスポート中にコンテンツ タイプを設定すると、テーブルのスキーマが決まります。

  • RESOURCE または未指定: コンテンツ タイプを RESOURCE に設定するか、コンテンツ タイプを設定しなかった場合、図 1 に示すスキーマを含む BigQuery テーブルを作成します。Resource.data は、JSON 文字列として表現されるリソース メタデータです。

  • IAM ポリシー: コンテンツ タイプをREST API で IAM_POLICY または gcloud ツールで iam-policy に設定した場合、図 2 に示すスキーマを含む BigQuery テーブルを作成します。iam_policy RECORD は完全に展開されています。

  • 組織のポリシー: コンテンツ タイプをREST API で ORG_POLICY または gcloud ツールで org-policy に設定した場合、図 3 に示すスキーマを含む BigQuery テーブルを作成します。

  • VPCSC ポリシー: コンテンツ タイプをREST API で ACCESS_POLICY または gcloud ツールで access-policy に設定した場合、図 4 に示すスキーマを含む BigQuery テーブルを作成します。

  • OSConfig インスタンス インベントリ: コンテンツ タイプを REST API で OS_INVENTORY または gcloud ツールで os-inventory に設定した場合、図 5 に示すスキーマを含む BigQuery テーブルを作成します。

リソースタイプごとにテーブルを分割する

リソースタイプごとに所定のタイムスタンプでアセットのスナップショットをエクスポートするには、次の手順を行います。

gcloud

リソースタイプごとにプロジェクト内のアセットをエクスポートするには、次のコマンドを実行します。このコマンドでは、スナップショットの結果が空の場合、または複数の BigQuery テーブルにエクスポートされている場合、エクスポートされるスナップショットが 0 のテーブルに保存されます。各テーブルには 1 つのアセットタイプの結果が含まれ、BIGQUERY_TABLE には _(アンダースコア)とアセットタイプ名が連結されます。英数字以外の文字は _ に置き換えられます。

  gcloud asset export \
     --content-type CONTENT_TYPE \
     --project 'PROJECT_ID' \
     --snapshot-time 'SNAPSHOT_TIME' \
     --bigquery-table 'BIGQUERY_TABLE' \
     --output-bigquery-force \
     --per-asset-type

ここで

  • CONTENT_TYPE はアセットのコンテンツ タイプです。
  • PROJECT_ID は、メタデータをエクスポートするプロジェクトの ID です。このプロジェクトは、エクスポートの実行元のプロジェクトまたは別のプロジェクトに設定できます。
  • SNAPSHOT_TIME(省略可)は、アセットのスナップショットを作成する時刻です。値は、現在の時刻または過去の時刻に指定する必要があります。デフォルトでは、現在の時刻にスナップショットが作成されます。有効な時間形式の詳細については、gcloud topic datetimes をご覧ください。
  • BIGQUERY_TABLE は、メタデータのエクスポート先のテーブルです。形式は projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME です。
  • --output-bigquery-force は、宛先テーブルが存在する場合に宛先テーブルを上書きします。
  • --per-asset-type は、リソースタイプごとに複数の BigQuery テーブルにエクスポートします。

API

リソースタイプごとにプロジェクト内のアセットをエクスポートするには、次のコマンドを実行します。このコマンドでは、スナップショットの結果が空の場合、または複数の BigQuery テーブルにエクスポートされている場合、エクスポートされるスナップショットが 0 のテーブルに保存されます。各テーブルには 1 つのアセットタイプの結果が含まれ、BIGQUERY_TABLE には _(アンダースコア)とアセットタイプ名が連結されます。英数字以外の文字は _ に置き換えられます。詳細については、exportAssets メソッドをご覧ください。

gcurl -d '{"contentType":"CONTENT_TYPE", \
  "outputConfig":{ \
    "bigqueryDestination": { \
      "dataset": "projects/PROJECT_ID/datasets/DATASET_ID",\
      "table": "TABLE_NAME", \
      "force": true \
      "separateTablesPerAssetType": true \
    } \
  }}' \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets

いずれかのテーブルへのエクスポートが失敗すると、エクスポート操作全体が失敗し、最初のエラーが返されます。ただし、成功したエクスポートの結果は保持されます。

エクスポート中にコンテンツ タイプを設定すると、各テーブルのスキーマが決まります。

  • リソース: コンテンツ タイプを RESOURCE に設定すると、各テーブルのスキーマには、そのアセットタイプの Resource.data フィールドのネストされたフィールド(BigQuery でサポートされる最大 15 のネストレベルまで)にマッピングされた RECORD 型の列が含まれます。projects/export-assets-examples/datasets/structured_export で、タイプごとの bigquery スキーマのテーブルの例をご覧ください。

  • IAM ポリシー、組織ポリシー、VPCSC ポリシー、未指定: コンテンツ タイプを IAM_POLICYORG_POLICYACCESS_POLICY に設定するか、コンテンツ タイプを設定しない場合、各テーブルは per-asset-type を False に設定する場合と同じスキーマになります。詳しくは、コンテンツ タイプの設定セクションで、各スキーマをご覧ください。

次のタイプは、JSON3BigQuery の型との互換性の問題を解決するために、JSON 文字列でパックしています。

  • google.protobuf.Timestamp
  • google.protobuf.Duration
  • google.protobuf.FieldMask
  • google.protobuf.ListValue
  • google.protobuf.Value
  • google.protobuf.Struct
  • google.api.*

パーティション分割テーブルにエクスポートする

パーティション分割テーブル内の特定のタイムスタンプでアセット スナップショットをエクスポートするには、次の手順を行います。

gcloud

パーティション分割テーブルのプロジェクト内のアセットをエクスポートするには、次のコマンドを実行します。このコマンドは、エクスポートされたスナップショットを BigQuery テーブル BIGQUERY_TABLE に 1 日単位で 2 つのタイムスタンプ列(readTimerequestTime)に格納します。これらの列のうち 1 つは partition-key パラメータに従ってパーティション キーになります。

  gcloud asset export \
     --content-type CONTENT_TYPE \
     --project 'PROJECT_ID' \
     --snapshot-time 'SNAPSHOT_TIME' \
     --bigquery-table 'BIGQUERY_TABLE' \
     --partition-key 'PARTITION_KEY' \
     --output-bigquery-force \

ここで

  • CONTENT_TYPE はアセットのコンテンツ タイプです。
  • PROJECT_ID は、メタデータがエクスポートされるプロジェクトの ID です。このプロジェクトは、エクスポートの実行元のプロジェクトまたは別のプロジェクトに設定できます。
  • SNAPSHOT_TIME(省略可)は、アセットのスナップショットを作成する時刻です。値は、現在の時刻または過去の時刻に指定する必要があります。デフォルトでは、現在の時刻にスナップショットが作成されます。時刻形式の詳細については、gcloud topic datetimes をご覧ください。
  • BIGQUERY_TABLE は、メタデータのエクスポート先のテーブルです。形式は projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME です。
  • PARTITION_KEY は、BigQuery パーティション分割テーブルへのエクスポート時のパーティション キー列です。
  • --output-bigquery-force は、宛先テーブルが存在する場合に宛先テーブルを上書きします。

API

パーティション分割テーブルのプロジェクト内のアセットをエクスポートするには、次のコマンドを実行します。このコマンドは、エクスポートされたスナップショットを BigQuery テーブル BIGQUERY_TABLE に 1 日単位で 2 つのタイムスタンプ列(readTimerequestTime)に格納します。これらの列のうち 1 つは partition-key パラメータに従ってパーティション キーになります。詳細については、exportAssets メソッドをご覧ください。

gcurl -d '{"contentType":"CONTENT_TYPE", \
  "outputConfig":{ \
    "bigqueryDestination": { \
      "dataset": "projects/PROJECT_ID/datasets/DATASET_ID",\
      "table": "TABLE_NAME", \
      "force": true \
      "partitionSpec": {"partitionKey": "PARTITION_KEY"} \
    } \
  }}' \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets

宛先テーブルがすでに存在している場合、さらに列を追加することで、必要に応じて既存のテーブルのスキーマが更新されます。繰り返しのオプションなど、列の種類やモードが変更された場合、このスキーマ更新は失敗します。次に、output-bigquery-force フラグを TRUE に設定すると、対応するパーティションはスナップショットの結果によって上書きされますが、1 つ以上の別のパーティション内のデータはそのまま残ります。output-bigquery-force が未設定または FALSE の場合、対応するパーティションにデータが追加されます。

スキーマの更新またはデータの追加が失敗すると、エクスポート操作は失敗します。

エクスポートのステータスの確認

エクスポートのステータスを確認するには、次のコマンドを実行します。

gcloud

エクスポートのステータスを確認するには、次のコマンドを実行します。これは、エクスポート コマンドを実行すると、gcloud ツールに表示されます。

gcloud asset operations describe OPERATION_ID

API

エクスポートのステータスを表示するには、エクスポートに対するレスポンスで返されたオペレーション ID を使用して次のコマンドを実行します。

  1. OPERATION_ID は、エクスポートに対するレスポンスの name フィールドにあります。形式は次のとおりです。

    "name": "projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID"
    
  2. エクスポートのステータスを確認するには、OPERATION_ID を指定して次のコマンドを実行します。

    gcurl https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
    

アセット スナップショットの表示

アセット スナップショットのメタデータを含むテーブルを表示するには、次の手順を行います。

コンソール

  1. Cloud Console の BigQuery ページに移動します。
    BigQuery ページに移動

  2. データセット内のテーブルとビューを表示するには、ナビゲーション パネルを開きます。[リソース] セクションでプロジェクトを展開し、データセットを選択します。

  3. リストからテーブルを選択します。

  4. [詳細] を選択し、[行数] の値を書き留めます。gcloud ツールまたは API を使用して結果の開始点を制御するために、この値が必要になることがあります。

  5. データのサンプルセットを表示するには、[プレビュー] を選択します。

API

テーブルのデータを閲覧するには、tabledata.list を呼び出します。tableId パラメータで、テーブルの名前を指定します。

次の省略可能パラメータを構成すると、出力を制御できます。

  • maxResults は返される結果の最大数です。
  • selectedFields は返される列のカンマ区切りのリストです。指定しなければ、すべての列が返されます。
  • startIndex は、読み取りを開始する行を指し示す、ゼロから始まるインデックスです。

値は 1 つの JSON オブジェクトにラップされて返されます。このオブジェクトは、tabledata.list リファレンス ドキュメントに記載されている手順に従って解析する必要があります。

エクスポートは、アセットとそのリソース名の一覧を表示します。

アセット スナップショットの照会

スナップショットを BigQuery にエクスポートすると、アセットのメタデータに対してクエリを実行できます。一般的なユースケースの詳細については、BigQuery サンプルクエリへのエクスポートをご覧ください。

デフォルトでは、BigQuery によってインタラクティブな、すなわちオンデマンド型のクエリジョブが実行されます。すなわち、クエリは可能な限り速やかに実行されます。インタラクティブ クエリは、同時実行のレート制限と毎日の制限に対してカウントされます。

クエリの結果は、一時テーブルまたは永続テーブルのいずれかに保存されます。既存のテーブルにデータを追加するか、既存のテーブルのデータを上書きするか、同じ名前のテーブルが存在しない場合は新しいテーブルを作成できます。

出力を一時テーブルに書き込むインタラクティブ クエリを実行するには、次の手順を実行します。

コンソール

  1. Cloud Console の BigQuery ページに移動します。
    BigQuery ページに移動

  2. [クエリを新規作成] を選択します。

  3. [クエリエディタ] テキスト領域に、有効な BigQuery SQL クエリを入力します。

  4. (省略可)データ処理ロケーションを変更するには、次の手順を実行します。

    1. [展開]、[クエリの設定] の順に選択します。
    2. [処理を行うロケーション] で [自動選択] を選択してから、データの ロケーション を選択します。
    3. クエリの設定を更新するには、[保存] を選択します。
  5. [実行] を選択します。

API

  1. 新しいジョブを開始するには、jobs.insert メソッドを呼び出します。ジョブリソースで、次のパラメータを設定します。

    • configuration フィールドで、query フィールドを、BigQuery クエリジョブを記述する JobConfigurationQuery に設定します。

    • jobReference フィールドで、ジョブに適した location フィールドを設定します。

  2. 結果を取得するには、getQueryResults を呼び出します。jobCompletetrue と等しくなるまで取得を続けます。エラーと警告は、errors リストで確認できます。