SQL を使用してアセットにクエリを実行する

プロジェクト、フォルダ、組織内のアセットをクエリするには、BigQuery SQL 互換の言語を使用します。

始める前に

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

    Cloud Asset Inventory API を有効にする

  2. アカウントに Cloud Asset Inventory API を呼び出すための適切なロールがあることを確認します。通話タイプごとの個々の権限については、権限をご覧ください。

制限事項

クエリ可能なテーブル

次のテーブルにクエリを実行できます。

  • RESOURCE コンテンツ タイプの場合、データセット内のテーブル名は、アセットタイプが存在することを前提として、アセットタイプ名に対応しています。たとえば、compute_googleapis_com_Instance テーブルには Compute Engine インスタンスのメタデータが含まれています。

  • RESOURCE 以外のコンテンツ タイプの場合、データセット内のテーブル名は RPC/REST コンテンツ タイプ名に対応しています。例: ACCESS_POLICY

  • リソースタイプ間でリソース標準メタデータをクエリするには、テーブル名 STANDARD_METADATA を使用します。これには、各リソースタイプに固有の resource.DATA を除くすべてのフィールドが含まれます。

アセットのメタデータをクエリする

Console

プロジェクト、フォルダ、組織のアセット メタデータをクエリするには、次の手順を実行します。

  1. Google Cloud コンソールの Security Command Center の [アセット] ページに移動します。

    アセットに移動

  2. クエリするプロジェクト、フォルダ、または組織に変更します。
  3. [アセットクエリ] タブをクリックします。
  4. アセットのメタデータをクエリするには、サンプルクエリを使用するか、独自のクエリを作成します。

    • サンプルを使用するには、[クエリ ライブラリ] タブでエントリをクリックして、クエリをプレビューします。**適用** をクリックしてそのサンプルを [クエリを編集] ボックスにコピーし、クエリを編集するか、[実行] をクリックして実行します。
    • 独自のクエリを作成するには、[クエリを編集] ボックスにクエリテキストを直接入力し、[実行] をクリックして実行します。独自のクエリを簡単に作成するには、[テーブルを選択] ペインでテーブルをクリックして、スキーマとコンテンツをプレビューします。クエリの作成方法については、 クエリ構文をご覧ください。

    クエリに一致するアセット メタデータが [クエリ結果] タブに表示されます。

  5. 省略可: クエリ結果セットを CSV 形式でダウンロードするには、[エクスポート] をクリックします。

    CSV ファイルの最大サイズは 2 MB です。ファイルサイズがこの制限を超え、ダウンロード リクエストが失敗した場合は、結果全体をエクスポートする手順を示すメッセージが表示されます。

gcloud

gcloud asset query \
    --SCOPE \
    --statement="SQL_SELECT_QUERY" \
    --timeout="TIMEOUTs"

次の値を指定します。

  • SCOPE: 次のいずれかの値を使用できます。

    • project=PROJECT_ID。ここで、PROJECT_ID はクエリするアセットを含むプロジェクトの ID です。
    • folder=FOLDER_ID。ここで、FOLDER_ID はクエリするアセットを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID。ここで、ORGANIZATION_ID はクエリするアセットを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY: SQL SELECT クエリ。
  • TIMEOUT: 省略可。 クライアントがクエリの完了を待機してから続行するまでの最大時間(秒)。タイムアウトを使用してクエリを非同期で実行し、ジョブリファレンスを使用して後で結果を取得します。

すべてのオプションについては、gcloud CLI リファレンスをご覧ください。

次のコマンドを実行して、my-project プロジェクトの最初の 2 つの Compute Engine インスタンスの名前とアセットタイプを取得します。

gcloud asset query \
    --project=my-project \
    --statement="
      SELECT
        name, assetType
      FROM
        compute_googleapis_com_Instance
      LIMIT 2"

完了したジョブのレスポンス

次のサンプルは、前の例のクエリに対するレスポンスを示しています。レスポンスにはジョブ参照が含まれ、ジョブが完了したかどうか(done: true)が示されます。ジョブが完了している場合は、queryResult オブジェクトに適切なデータが入力され、その後に結果が一覧表示されます。

done: true
jobReference: 0000000000000000000000000000000000000000000000000000000000000000
queryResult:
  nextPageToken: ''
  totalRows: '2'

name: //compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-1
assetType: compute.googleapis.com/Instance

name: //compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/instance-2
assetType: compute.googleapis.com/Instance

未完了のジョブのレスポンス

リクエストでタイムアウトを設定すると、クエリは非同期で実行され、ジョブが未完了であることを示すレスポンス(done: false)が送信されます。このようなレスポンスには、ジョブ参照と未入力の queryResult オブジェクトが含まれます。

done: false
jobReference: 0000000000000000000000000000000000000000000000000000000000000000
queryResult:
  nextPageToken: ''
  totalRows: '0'

jobReference 値を使用すると、ジョブが完了してデータが利用可能になった後で、クエリ結果を後で取得できます。

REST

HTTP メソッドと URL:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

JSON 本文のリクエスト:

{
  "statement": "SQL_SELECT_QUERY",
  "timeout": "TIMEOUTs",
  "pageSize": "PAGE_SIZE",
  "pageToken": "PAGE_TOKEN"
}

次の値を指定します。

  • SCOPE_PATH: 次のいずれかの値を使用できます。

    使用できる値は次のとおりです。

    • projects/PROJECT_ID。ここで、PROJECT_ID はクエリするアセットを含むプロジェクトの ID です。
    • projects/PROJECT_NUMBER。ここで、PROJECT_NUMBER はクエリするアセットを含むプロジェクトの数です。

      Google Cloud プロジェクト番号を確認する方法

      Google Cloud コンソール

      Google Cloud プロジェクト番号を確認するには、次の手順を行います。

      1. Google Cloud コンソールの [ようこそ] ページに移動します。

        [ようこそ] に移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択し、プロジェクト名を検索します。プロジェクト名、プロジェクト番号、プロジェクト ID は [ようこそ] 見出しの近くに表示されます。

        最大 4,000 個のリソースが表示されます。目的のプロジェクトが表示されない場合は、[リソースの管理] ページに移動し、そのプロジェクトの名前を使用してリストをフィルタします。

      gcloud CLI

      Google Cloud プロジェクト番号を取得するには、次のコマンドを使用します。

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID。ここで、FOLDER_ID はクエリするアセットを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID。ここで、ORGANIZATION_ID はクエリするアセットを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY: SQL SELECT クエリ。
  • TIMEOUT: 省略可。 クライアントがクエリの完了を待機してから続行するまでの最大時間(秒)。タイムアウトを使用してクエリを非同期で実行し、ジョブリファレンスを使用して後で結果を取得します。
  • PAGE_SIZE: 省略可。 ページごとに返す結果の数を指定します。最大値は 500 です。値が 0 または負の値に設定されている場合は、適切なデフォルト値が選択されます。後続の結果を取得するために、nextPageToken が返されます。

  • PAGE_TOKEN: 省略可。 長いリクエスト レスポンスは複数のページに分割されます。pageToken が指定されていない場合は、最初のページが返されます。後続のページを呼び出すには、前のレスポンスの nextPageTokenpageToken 値として使用します。

すべてのオプションについては、REST リファレンスをご覧ください。

コマンドの例

次のいずれかのコマンドを実行して、my-project プロジェクト内の最初の 2 つの Compute Engine インスタンスの名前とアセットタイプを取得します。

curl(Linux、macOS、Cloud Shell)

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "statement": "
              SELECT
                name, assetType
              FROM
                compute_googleapis_com_Instance
              LIMIT 2"
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell(Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "statement": "
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2"
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

完了したジョブのレスポンス

次のサンプルは、前の例のクエリに対するレスポンスを示しています。レスポンスにはジョブ参照が含まれ、ジョブが完了したかどうか("done": true)が示されます。ジョブが完了している場合は、queryResult オブジェクトに適切なデータが入力されます。

クエリ結果は、rows(アセット メタデータを含む配列)と schemarows 配列内の各アセットのスキーマを記述するオブジェクト)に分割されます。これは、大規模なレスポンスでフィールド名と型の重複を最小限に抑えるために行われます。

同様に、rows 配列では、fieldsvalue の代わりに fv を使用して、レスポンスをできるだけ小さくしています。

{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000",
  "done": true,
  "queryResult": {
    "rows": [
      {
        "f": [
          {
            "v": "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-1"
          },
          {
            "v": "compute.googleapis.com/Instance"
          }
        ]
      },
      {
        "f": [
          {
            "v": "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-2"
          },
          {
            "v": "compute.googleapis.com/Instance"
          }
        ]
      }
    ],
    "schema": {
      "fields": [
        {
          "field": "name",
          "type": "STRING",
          "mode": "NULLABLE",
          "fields": []
        },
        {
          "field": "assetType",
          "type": "STRING",
          "mode": "NULLABLE",
          "fields": []
        }
      ]
    },
    "nextPageToken": "",
    "totalRows": "1"
  }
}

未完了のジョブのレスポンス

リクエストでタイムアウトを設定すると、クエリは非同期で実行され、ジョブが未完了であることを示すレスポンス("done": false)が送信されます。このようなレスポンスには、ジョブ参照と未入力の queryResult オブジェクトが含まれます。

{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000",
  "done": false,
  "queryResult": {
    "rows": [],
    "schema": {
      "fields": []
    },
    "nextPageToken": "",
    "totalRows": "0"
  }
}

jobReference 値を使用すると、ジョブが完了してデータが利用可能になった後で、クエリ結果を後で取得できます。

クエリ結果を後で取得する

完了に時間がかかったリクエストを後で取得するには、次のいずれかのリクエストを行います。

gcloud

gcloud asset query \
    --SCOPE \
    --job-reference="JOB_REFERENCE"

次の値を指定します。

  • SCOPE: 次のいずれかの値を使用できます。

    • project=PROJECT_ID。ここで、PROJECT_ID はクエリするアセットを含むプロジェクトの ID です。
    • folder=FOLDER_ID。ここで、FOLDER_ID はクエリするアセットを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID。ここで、ORGANIZATION_ID はクエリするアセットを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • JOB_REFERENCE: 前のレスポンスで返されたジョブ参照値。

次のコマンドを実行して、my-project プロジェクトで以前に実行したクエリの結果を取得します。

gcloud asset query \
    --project=my-project \
    --job-reference="0000000000000000000000000000000000000000000000000000000000000000"

REST

HTTP メソッドと URL:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

JSON 本文のリクエスト:

{
  "jobReference": "JOB_REFERENCE",
  "pageToken": "PAGE_TOKEN"
}

次の値を指定します。

  • SCOPE_PATH: 次のいずれかの値を使用できます。

    使用できる値は次のとおりです。

    • projects/PROJECT_ID。ここで、PROJECT_ID はクエリするアセットを含むプロジェクトの ID です。
    • projects/PROJECT_NUMBER。ここで、PROJECT_NUMBER はクエリするアセットを含むプロジェクトの数です。

      Google Cloud プロジェクト番号を確認する方法

      Google Cloud コンソール

      Google Cloud プロジェクト番号を確認するには、次の手順を行います。

      1. Google Cloud コンソールの [ようこそ] ページに移動します。

        [ようこそ] に移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択し、プロジェクト名を検索します。プロジェクト名、プロジェクト番号、プロジェクト ID は [ようこそ] 見出しの近くに表示されます。

        最大 4,000 個のリソースが表示されます。目的のプロジェクトが表示されない場合は、[リソースの管理] ページに移動し、そのプロジェクトの名前を使用してリストをフィルタします。

      gcloud CLI

      Google Cloud プロジェクト番号を取得するには、次のコマンドを使用します。

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID。ここで、FOLDER_ID はクエリするアセットを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID。ここで、ORGANIZATION_ID はクエリするアセットを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • JOB_REFERENCE: 前のレスポンスで返されたジョブ参照値。
  • PAGE_TOKEN: 省略可。 長いリクエスト レスポンスは複数のページに分割されます。pageToken が指定されていない場合、最初のページが返されます。後続のページを呼び出すには、前のレスポンスの nextPageTokenpageToken 値として使用します。

コマンドの例

以前に実行したクエリの結果を取得するには、次のいずれかのコマンドを実行します。

curl(Linux、macOS、Cloud Shell)

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "jobReference": "0000000000000000000000000000000000000000000000000000000000000000"
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell(Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000"
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

クエリ結果を BigQuery にエクスポートする

クエリ結果は、Query Assets API レスポンスとして返されます。結果を独自の BigQuery テーブルにエクスポートするには、リクエストで BigQuery の宛先を指定します。まだ作成していない場合は、リクエストを行う前に BigQuery データセットを作成する必要があります。

gcloud

gcloud asset query \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --statement="SQL_SELECT_QUERY" \
    --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
    --write-disposition="WRITE_METHOD"

次の値を指定します。

  • SCOPE: 次のいずれかの値を使用できます。

    • project=PROJECT_ID。ここで、PROJECT_ID は、SQL クエリでエクスポートするアセット メタデータを含むプロジェクトの ID です。
    • folder=FOLDER_ID。ここで、FOLDER_ID は、SQL クエリでエクスポートするアセット メタデータを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID。ここで、ORGANIZATION_ID は、SQL クエリでエクスポートするアセット メタデータを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY: SQL SELECT クエリ。
  • BIGQUERY_PROJECT_ID: エクスポート先の BigQuery テーブルが存在するプロジェクトの ID。
  • DATASET_ID: BigQuery データセットの ID。
  • TABLE_NAME: メタデータのエクスポート先の BigQuery テーブル。存在しない場合は作成されます。
  • WRITE_METHOD: BigQuery の宛先テーブルまたはパーティションがすでに存在する場合の動作を指定します。次の値を使用できます。

    • write-empty: デフォルト。既存のテーブルにデータが含まれている場合、ジョブ結果で重複エラーが返されます。
    • write-append: テーブルまたは最新のパーティションにデータを追加します。
    • write-truncate: テーブル全体またはすべてのパーティション データを上書きします。

次のコマンドを実行して、my-project プロジェクトの最初の 2 つの Compute Engine インスタンスの名前とアセットタイプを取得し、結果を my-project プロジェクトの my-table BigQuery テーブルにエクスポートします。テーブルがすでに存在する場合は、テーブル全体が上書きされます。

gcloud asset query \
  --project=my-project \
  --statement="
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2" \
  --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \
  --write-disposition="write-truncate"

REST

HTTP メソッドと URL:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

ヘッダー:

X-Goog-User-Project: BILLING_PROJECT_ID

JSON 本文のリクエスト:

{
  "statement": "SQL_SELECT_QUERY",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID",
      "table": "TABLE_NAME",
      "writeDisposition": "WRITE_METHOD"
    }
  },
  "pageSize": "PAGE_SIZE"
}

次の値を指定します。

  • SCOPE_PATH: 次のいずれかの値を使用できます。

    使用できる値は次のとおりです。

    • projects/PROJECT_ID。ここで、PROJECT_ID は、SQL クエリでエクスポートするアセット メタデータを含むプロジェクトの ID です。
    • projects/PROJECT_NUMBER。ここで、PROJECT_NUMBER は、SQL クエリでエクスポートするアセット メタデータを含むプロジェクトの数です。

      Google Cloud プロジェクト番号を確認する方法

      Google Cloud コンソール

      Google Cloud プロジェクト番号を確認するには、次の手順を行います。

      1. Google Cloud コンソールの [ようこそ] ページに移動します。

        [ようこそ] に移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択し、プロジェクト名を検索します。プロジェクト名、プロジェクト番号、プロジェクト ID は [ようこそ] 見出しの近くに表示されます。

        最大 4,000 個のリソースが表示されます。目的のプロジェクトが表示されない場合は、[リソースの管理] ページに移動し、そのプロジェクトの名前を使用してリストをフィルタします。

      gcloud CLI

      Google Cloud プロジェクト番号を取得するには、次のコマンドを使用します。

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID。ここで、FOLDER_ID は、SQL クエリでエクスポートするアセット メタデータを含むフォルダの ID です。

      Google Cloud フォルダの ID を確認する方法

      Google Cloud コンソール

      Google Cloud フォルダの ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. フォルダ名を検索します。フォルダ ID がフォルダ名の横に表示されます。

      gcloud CLI

      組織レベルの Google Cloud フォルダの ID を取得するには、次のコマンドを使用します。

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      ここで、TOP_LEVEL_FOLDER_NAME はフォルダ名の部分一致または完全一致です。--format フラグを削除すると、検出されたフォルダに関する詳細情報が表示されます。

      上記のコマンドは、フォルダ内のサブフォルダの ID を返しません。これを行うには、最上位フォルダの ID を使用して次のコマンドを実行します。

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID。ここで、ORGANIZATION_ID は、SQL クエリでエクスポートするアセット メタデータを含む組織の ID です。

      Google Cloud 組織の ID を確認する方法

      Google Cloud コンソール

      Google Cloud 組織の ID を確認する手順は次のとおりです。

      1. Google Cloud Console に移動します。

        Google Cloud コンソールに移動

      2. メニューバーの切り替えボックスをクリックします。
      3. リストボックスから組織を選択します。
      4. [すべて] タブをクリックします。組織 ID が組織名の横に表示されます。

      gcloud CLI

      Google Cloud 組織の ID を取得するには、次のコマンドを使用します。

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: デフォルトの Cloud Asset Inventory サービス エージェントが存在する、BigQuery のデータセットとテーブルを管理する権限を持つプロジェクト ID。 課金プロジェクトの設定の詳細

  • SQL_SELECT_QUERY: SQL SELECT クエリ。
  • BIGQUERY_PROJECT_ID: エクスポート先の BigQuery テーブルが存在するプロジェクトの ID。
  • DATASET_ID: BigQuery データセットの ID。
  • TABLE_NAME: メタデータのエクスポート先の BigQuery テーブル。存在しない場合は作成されます。
  • WRITE_METHOD: BigQuery の宛先テーブルまたはパーティションがすでに存在する場合の動作を指定します。次の値を使用できます。

    • WRITE_EMPTY: デフォルト。既存のテーブルにデータが含まれている場合、ジョブ結果で重複エラーが返されます。
    • WRITE_APPEND: テーブルまたは最新のパーティションにデータを追加します。
    • WRITE_TRUNCATE: テーブル全体またはすべてのパーティション データを上書きします。
  • PAGE_SIZE: 省略可。 ページごとに返す結果の数を指定します。最大値は 500 です。値が 0 または負の値に設定されている場合は、適切なデフォルト値が選択されます。後続の結果を取得するために、nextPageToken が返されます。

コマンドの例

次のいずれかのコマンドを実行して、my-project プロジェクトの最初の 2 つの Compute Engine インスタンスの名前とアセットタイプを取得し、結果を my-project プロジェクトの my-table BigQuery テーブルにエクスポートします。テーブルがすでに存在する場合は、テーブル全体を上書きします。

curl(Linux、macOS、Cloud Shell)

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "statement": "
              SELECT
                name, assetType
              FROM
                compute_googleapis_com_Instance
              LIMIT 2",
            "outputConfig": {
              "bigqueryDestination": {
                "dataset": "projects/my-project/datasets/my-dataset",
                "table": "my-table",
                "writeDisposition": "WRITE_TRUNCATE"
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell(Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-Goog-User-Project" = "BILLING_PROJECT_ID";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "statement": "
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/my-project/datasets/my-dataset",
      "table": "my-table",
      "writeDisposition": "WRITE_TRUNCATE"
    }
  }
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

その他の SQL クエリの例

次のコードサンプルは、アセットの検索に使用できる特定の SQL クエリを示しています。独自のクエリを作成する場合に役立ちます。

特定のリージョンの Compute Engine VM インスタンス

また、name と作成日時も返します。

SELECT
  name,
  resource.DATA.creationTimestamp
FROM
  compute_googleapis_com_Instance
WHERE
  resource.location LIKE '%asia%'

各プロジェクトに含まれる BigQuery データセットの数

  SELECT
    ancestor AS project,
    COUNT(*)
  FROM
    bigquery_googleapis_com_Dataset
  CROSS JOIN
    UNNEST (ancestors) AS ancestor
  WHERE
    ancestor LIKE '%project%'
  GROUP BY
    ancestor
  ORDER BY
    2 DESC

各リージョンにある Compute Engine VM インスタンスの数

SELECT
  resource.location,
  COUNT(*)
FROM
  compute_googleapis_com_Instance
GROUP BY
  resource.location

リージョン内のすべてのリソースの名前と assetType

SELECT
  name,
  assetType
FROM
  STANDARD_METADATA
WHERE
  resource.location LIKE '%asia%'

一般公開されている Cloud Storage バケット

また、name を返します。

SELECT
  name
FROM
  IAM_POLICY
CROSS JOIN
  UNNEST(iamPolicy.bindings) AS binding
WHERE
  ('allUsers' IN UNNEST(binding.members)
  OR 'allAuthenticatedUsers' IN UNNEST(binding.members))
  AND assetType = 'storage.googleapis.com/Bucket'

VM インスタンスが接続されていないサブネットワーク

SELECT
  subnetwork_table.name
FROM
  compute_googleapis_com_Subnetwork AS subnetwork_table
LEFT JOIN (
  SELECT
    interface.subnetwork AS subnetwork
  FROM
    compute_googleapis_com_Instance
  CROSS JOIN
    UNNEST(resource.DATA.networkInterfaces) AS interface) AS instance_table
ON
  SUBSTR(subnetwork_table.name, 25) = SUBSTR(instance_table.subnetwork,38)
WHERE
  instance_table.subnetwork IS NULL
  AND NOT subnetwork_table.name LIKE '%default%'