BigQuery로 애셋 메타데이터 내보내기

이 문서에서는 애셋 스냅샷을 조직, 폴더 또는 프로젝트에서 BigQuery 테이블로 내보낸 후 인벤토리에 대한 데이터 분석을 실행하는 방법을 보여줍니다. BigQuery는 사용자가 커스텀 스크립트를 사용하지 않고도 데이터를 분석하고 의미 있는 통계를 생성할 수 있는 SQL과 유사한 환경을 제공합니다.

시작하기 전에

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

    Cloud Asset Inventory API 사용 설정

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

  3. 내보낼 BigQuery 데이터 세트가 없으면 BigQuery 데이터 세트를 만듭니다.

제한사항

  • BigQuery 테이블 데이터를 내보낼 때 Cloud 애셋 인벤토리에서 모든 필드가 지원되는 것은 아닙니다.

  • numBytes, numLongTermBytes, numPhysicalBytes, numRows와 같은 자주 변경되는 애셋 필드를 null 값으로 내보낼 수 있습니다.

  • BigQuery 클러스터링된 테이블로 내보내기는 지원되지 않습니다.

  • 파티션을 나눈 테이블로 내보내지 않으면 기존 테이블에 내보내기 출력을 추가할 수 없습니다. 대상 테이블은 비어 있거나 대상 테이블을 덮어써야 합니다. 덮어쓰려면 gcloud CLI로 --output-bigquery-force 플래그를 사용하거나 REST API로 "force": true를 사용합니다.

  • 리소스 유형별 개별 테이블로 내보내는 경우 container.googleapis.com/Clustercontainer.googleapis.com/NodePool을 제외한 Google Kubernetes Engine(GKE) 리소스 유형은 지원되지 않습니다.

  • 같은 대상에 대한 이전 요청이 15분 이전에 시작되어 계속 실행 중이면 Cloud 애셋 인벤토리는 내보내기 요청을 거부합니다. 하지만 내보내기가 완료되는 데 15분이 넘게 걸린 경우에는 완료로 표시되며 같은 대상에 대한 새 내보내기 요청이 허용됩니다.

  • ACCESS_POLICY 콘텐츠 유형을 조직 수준에서만 내보낼 수 있습니다.

  • 내보낼 테이블이 이미 있고 내보내기 중인 경우에는 400 오류가 반환됩니다.

표기법

필드 이름은 요청된 콘텐츠 유형과 내보내기 설정에 따라 다른 케이싱 규칙을 사용합니다.

  • 애셋 유형별로 애셋을 테이블로 내보낼 때 RESOURCE 콘텐츠 유형의 경우 단어 사이에 공백이 없고 첫 번째 단어 이후의 각 새 단어의 첫 글자가 대문자로 표시됩니다. 예를 들면 assetType입니다.

  • 다른 모든 콘텐츠 유형의 경우 필드 이름은 소문자이며 공백은 밑줄로 대체됩니다. 예를 들면 asset_type입니다.

내보내기에 사용되는 BigQuery 스키마

모든 BigQuery 테이블은 열 이름, 데이터 유형, 기타 정보를 설명하는 스키마로 정의됩니다. 내보내기 콘텐츠 유형을 설정하면 테이블 스키마가 결정됩니다.

  • 리소스 또는 지정되지 않음: 콘텐츠 유형을 RESOURCE로 설정하거나 지정하지 않고 per-asset-type 플래그를 false로 설정하거나 사용하지 않으면 다음 스키마가 있는 BigQuery 테이블을 만듭니다.

    리소스 스키마

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_document_uri",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "resource_url",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "parent",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "data",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "location",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "resource",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]

    resource.data 열은 JSON 문자열로 표시되는 리소스 메타데이터입니다.

    콘텐츠 유형을 RESOURCE로 설정하거나 콘텐츠 유형을 설정하지 않고 per-asset-type 플래그를 true로 설정하면 애셋 유형별로 개별 테이블을 만듭니다. 각 테이블의 스키마에는 애셋 유형의 Resource.data 필드에 있는 중첩 필드에 매핑된 RECORD 유형 열이 포함됩니다(BigQuery에서 지원하는 중첩 수준 최대 15개까지). 테이블 예시는 Google Cloud 콘솔의 export-assets-examples를 참고하세요.

  • IAM 정책: REST API에서 콘텐츠 유형을 IAM_POLICY로 설정하거나 gcloud CLI에서 iam-policy로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.

    IAM 정책 스키마

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "INTEGER"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "role",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "members",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "expression",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "description",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "location",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "condition",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "bindings",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "service",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "log_type",
                    "type": "INTEGER"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "exempted_members",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "audit_log_configs",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "audit_configs",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "iam_policy",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • 조직 정책: REST API에서 콘텐츠 유형을 ORG_POLICY로 설정하거나 gcloud CLI에서 org-policy로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.

    조직 정책 스키마

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "INTEGER"
          },
          {
            "mode": "NULLABLE",
            "name": "constraint",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "update_time",
            "type": "TIMESTAMP"
          },
          {
            "fields": [
              {
                "mode": "REPEATED",
                "name": "allowed_values",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "denied_values",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "all_values",
                "type": "INTEGER"
              },
              {
                "mode": "NULLABLE",
                "name": "suggested_value",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "inherit_from_parent",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "list_policy",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "enforced",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "boolean_policy",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "_present",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "restore_default",
            "type": "RECORD"
          }
        ],
        "mode": "REPEATED",
        "name": "org_policy",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • VPCSC 정책: REST API에서 콘텐츠 유형을 ACCESS_POLICY로 설정하거나 gcloud CLI에서 access-policy로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.

    VPCSC 정책 스키마

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "parent",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "REPEATED",
            "name": "scopes",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "access_policy",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "description",
            "type": "STRING"
          },
          {
            "fields": [
              {
                "fields": [
                  {
                    "mode": "REPEATED",
                    "name": "ip_subnetworks",
                    "type": "STRING"
                  },
                  {
                    "fields": [
                      {
                        "mode": "NULLABLE",
                        "name": "require_screenlock",
                        "type": "BOOLEAN"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "allowed_encryption_statuses",
                        "type": "INTEGER"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "os_type",
                            "type": "INTEGER"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "minimum_version",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "require_verified_chrome_os",
                            "type": "BOOLEAN"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "os_constraints",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "allowed_device_management_levels",
                        "type": "INTEGER"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "require_admin_approval",
                        "type": "BOOLEAN"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "require_corp_owned",
                        "type": "BOOLEAN"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "device_policy",
                    "type": "RECORD"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "required_access_levels",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "negate",
                    "type": "BOOLEAN"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "members",
                    "type": "STRING"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "regions",
                    "type": "STRING"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "network",
                            "type": "STRING"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "vpc_ip_subnetworks",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "vpc_subnetwork",
                        "type": "RECORD"
                      }
                    ],
                    "mode": "REPEATED",
                    "name": "vpc_network_sources",
                    "type": "RECORD"
                  }
                ],
                "mode": "REPEATED",
                "name": "conditions",
                "type": "RECORD"
              },
              {
                "mode": "NULLABLE",
                "name": "combining_function",
                "type": "INTEGER"
              }
            ],
            "mode": "NULLABLE",
            "name": "basic",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "expression",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "description",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "location",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "expr",
                "type": "RECORD"
              }
            ],
            "mode": "NULLABLE",
            "name": "custom",
            "type": "RECORD"
          }
        ],
        "mode": "NULLABLE",
        "name": "access_level",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "description",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "perimeter_type",