このトピックでは、組織、フォルダ、またはプロジェクトのアセット メタデータを BigQuery テーブルにエクスポートし、インベントリに対してデータ分析を行う方法を説明します。BigQuery は、カスタム スクリプトを使用しなくてもデータを分析し、有用な分析情報を提供できる SQL のような操作性を備えています。
始める前に
始める前に、次の手順を行います。
API コマンドを実行するプロジェクトで Cloud Asset Inventory API を有効にします。
Cloud Asset Inventory API を有効にするgcloud
ツールまたは API を使用して Cloud Asset Inventory API を呼び出すために必要な権限を構成します。環境を設定するには、次の手順を実行します。
gcloud
gcloud
ツールを使用して Cloud Asset Inventory API を呼び出すように環境を設定するには、ローカル クライアントに Cloud SDK をインストールします。API
Unix の
curl
コマンドで Cloud Asset Inventory API を呼び出すように環境を設定するには、次の手順を行います。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
- 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
の代わりに次のいずれかのフラグを使用します。
--organization=ORGANIZATION_ID
--folder=FOLDER_ID
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_POLICY
、ORG_POLICY
、ACCESS_POLICY
に設定するか、コンテンツ タイプを設定しない場合、各テーブルは per-asset-type を False に設定する場合と同じスキーマになります。詳しくは、コンテンツ タイプの設定セクションで、各スキーマをご覧ください。
次のタイプは、JSON3 と BigQuery の型との互換性の問題を解決するために、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 つのタイムスタンプ列(readTime
と requestTime
)に格納します。これらの列のうち 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 つのタイムスタンプ列(readTime
と requestTime
)に格納します。これらの列のうち 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 を使用して次のコマンドを実行します。
OPERATION_ID は、エクスポートに対するレスポンスの
name
フィールドにあります。形式は次のとおりです。"name": "projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID"
エクスポートのステータスを確認するには、OPERATION_ID を指定して次のコマンドを実行します。
gcurl https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
アセット スナップショットの表示
アセット スナップショットのメタデータを含むテーブルを表示するには、次の手順を行います。
コンソール
Cloud Console の BigQuery ページに移動します。
BigQuery ページに移動データセット内のテーブルとビューを表示するには、ナビゲーション パネルを開きます。[リソース] セクションでプロジェクトを展開し、データセットを選択します。
リストからテーブルを選択します。
[詳細] を選択し、[行数] の値を書き留めます。
gcloud
ツールまたは API を使用して結果の開始点を制御するために、この値が必要になることがあります。データのサンプルセットを表示するには、[プレビュー] を選択します。
API
テーブルのデータを閲覧するには、tabledata.list
を呼び出します。tableId
パラメータで、テーブルの名前を指定します。
次の省略可能パラメータを構成すると、出力を制御できます。
maxResults
は返される結果の最大数です。selectedFields
は返される列のカンマ区切りのリストです。指定しなければ、すべての列が返されます。startIndex
は、読み取りを開始する行を指し示す、ゼロから始まるインデックスです。
値は 1 つの JSON オブジェクトにラップされて返されます。このオブジェクトは、tabledata.list
リファレンス ドキュメントに記載されている手順に従って解析する必要があります。
エクスポートは、アセットとそのリソース名の一覧を表示します。
アセット スナップショットの照会
スナップショットを BigQuery にエクスポートすると、アセットのメタデータに対してクエリを実行できます。 一般的なユースケースの詳細については、BigQuery サンプルクエリへのエクスポートをご覧ください。
デフォルトでは、BigQuery によってインタラクティブな、すなわちオンデマンド型のクエリジョブが実行されます。すなわち、クエリは可能な限り速やかに実行されます。インタラクティブ クエリは、同時実行のレート制限と毎日の制限に対してカウントされます。
クエリの結果は、一時テーブルまたは永続テーブルのいずれかに保存されます。既存のテーブルにデータを追加するか、既存のテーブルのデータを上書きするか、同じ名前のテーブルが存在しない場合は新しいテーブルを作成できます。
出力を一時テーブルに書き込むインタラクティブ クエリを実行するには、次の手順を実行します。
コンソール
Cloud Console の BigQuery ページに移動します。
BigQuery ページに移動[クエリを新規作成] を選択します。
[クエリエディタ] テキスト領域に、有効な BigQuery SQL クエリを入力します。
(省略可)データ処理ロケーションを変更するには、次の手順を実行します。
- [展開]、[クエリの設定] の順に選択します。
- [処理を行うロケーション] で [自動選択] を選択し、データのロケーションを選択します。
- クエリの設定を更新するには、[保存] を選択します。
[実行] を選択します。
API
新しいジョブを開始するには、
jobs.insert
メソッドを呼び出します。ジョブリソースで、次のパラメータを設定します。configuration
フィールドで、query
フィールドを、BigQuery クエリジョブを記述する JobConfigurationQuery に設定します。jobReference
フィールドで、ジョブに適したlocation
フィールドを設定します。
結果を取得するには、
getQueryResults
を呼び出します。jobComplete
がtrue
と等しくなるまで取得を続けます。エラーと警告は、errors
リストで確認できます。