SQL로 애셋 쿼리

BigQuery SQL 호환 언어를 사용하여 프로젝트, 폴더 또는 조직의 애셋을 쿼리할 수 있습니다.

시작하기 전에

  1. Cloud 애셋 인벤토리 명령어를 실행할 프로젝트에서 Cloud 애셋 인벤토리 API를 사용 설정합니다.

    Cloud Asset Inventory API 사용 설정

  2. 계정에 Cloud 애셋 인벤토리 API를 호출할 수 있는 올바른 역할이 있는지 확인합니다. 각 호출 유형에 대한 개별 권한은 권한을 참조하세요.

제한사항

쿼리할 수 있는 테이블

다음 테이블을 쿼리할 수 있습니다.

  • RESOURCE 콘텐츠 유형의 경우 애셋 유형이 있다고 가정할 때 데이터 세트의 테이블 이름은 애셋 유형 이름에 해당합니다. 예를 들어 compute_googleapis_com_Instance 테이블에는 Compute Engine 인스턴스 메타데이터가 포함됩니다.

  • RESOURCE가 아닌 콘텐츠 유형의 경우 데이터 세트의 테이블 이름은 RPC/REST 콘텐츠 유형 이름에 해당합니다. 예를 들면 ACCESS_POLICY입니다.

  • 리소스 유형에서 리소스 표준 메타데이터를 쿼리하려면 테이블 이름 STANDARD_METADATA를 사용합니다. 여기에는 각 리소스 유형에 지정된 resource.DATA를 제외한 모든 필드가 포함됩니다.

애셋 메타데이터 쿼리

콘솔

프로젝트, 폴더 또는 조직의 애셋 메타데이터를 쿼리하려면 다음 단계를 완료합니다.

  1. Google Cloud 콘솔의 Security Command Center에서 애셋 페이지로 이동합니다.

    애셋으로 이동

  2. 쿼리하려는 프로젝트, 폴더 또는 조직으로 변경합니다.
  3. 애셋 쿼리 탭을 클릭합니다.
  4. 애셋 메타데이터를 쿼리하려면 샘플 쿼리를 사용하거나 직접 빌드합니다.

    • 샘플을 사용하려면 쿼리 라이브러리 탭에서 항목을 클릭하여 쿼리를 미리 봅니다. **적용**을 클릭하여 샘플을 쿼리 수정 상자에 복사한 후 쿼리를 수정하거나 실행을 클릭하여 실행합니다.
    • 고유한 쿼리를 빌드하려면 쿼리 수정 상자에 쿼리 텍스트를 직접 입력한 후 실행을 클릭하여 실행합니다. 고유한 쿼리를 작성하는 데 도움이 필요하면 테이블 선택 창에서 테이블을 클릭하여 스키마와 콘텐츠를 미리 보면 됩니다. 쿼리를 구성하는 방법은 쿼리 구문을 참조하세요.

    쿼리와 일치하는 애셋 메타데이터가 쿼리 결과 탭에 표시됩니다.

  5. 선택사항: 쿼리 결과 집합을 CSV 형식으로 다운로드하려면 내보내기를 클릭합니다.

    CSV 파일 최대 크기는 2MB입니다. 파일 크기가 이 한도를 초과하여 다운로드 요청이 실패하면 전체 결과를 내보내기 위한 안내와 함께 메시지가 표시됩니다.

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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 프로젝트의 처음 두 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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 프로젝트의 처음 두 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 객체는 적절한 데이터로 채워집니다.

쿼리 결과는 애셋 메타데이터가 포함된 배열인 rowsrows 배열의 각 애셋에 대한 스키마를 설명하는 객체인 schema로 나뉩니다. 이는 대규모 응답에서 필드 이름과 유형의 중복을 최소화하기 위함입니다.

마찬가지로 fv는 응답을 최대한 작게 유지하기 위해 fieldsvalue 대신 rows 배열에 사용됩니다.

{
  "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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        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 프로젝트의 처음 두 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 콘솔로 이동합니다.

        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 콘솔로 이동합니다.

        Google Cloud 콘솔로 이동

      2. 메뉴 바에서 전환 목록 상자를 클릭합니다.
      3. 목록 상자에서 조직을 선택합니다.
      4. 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.

      gcloud CLI

      다음 명령어를 사용하여 Google Cloud 조직 ID를 검색할 수 있습니다.

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: BigQuery 데이터 세트와 테이블을 관리할 수 있는 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 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 프로젝트의 처음 두 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%'