이 문서에서는 조직, 폴더 또는 프로젝트에서 애셋 스냅샷을 BigQuery 테이블로 내보낸 다음 인벤토리에 대한 데이터 분석을 실행하는 방법을 보여줍니다. BigQuery는 사용자가 커스텀 스크립트를 사용하지 않고도 데이터를 분석하고 의미 있는 정보를 생성할 수 있는 SQL과 유사한 환경을 제공합니다.
시작하기 전에
Cloud 애셋 인벤토리 명령어를 실행할 프로젝트에서 Cloud 애셋 인벤토리 API를 사용 설정하세요.
계정에 Cloud 애셋 인벤토리 API를 호출할 수 있는 올바른 역할이 있는지 확인합니다. 각 호출 유형에 대한 개별 권한은 권한을 참고하세요.
내보낼 BigQuery 데이터 세트를 만듭니다(아직 없는 경우).
제한사항
BigQuery 테이블 데이터를 내보낼 때 Cloud 애셋 인벤토리에서 모든 필드가 지원되는 것은 아닙니다.
numBytes
,numLongTermBytes
,numPhysicalBytes
,numRows
와 같이 자주 변경되는 애셋 필드는null
값으로 내보낼 수 있습니다.BigQuery 클러스터링된 테이블로 내보내기는 지원되지 않습니다.
커스텀 Cloud Key Management Service(Cloud KMS) 키로 암호화된 BigQuery 테이블은 지원되지 않습니다.
파티션을 나눈 테이블로 내보내지 않으면 기존 테이블에 내보내기 출력을 추가하는 것은 지원되지 않습니다. 대상 테이블은 비어 있거나 덮어써야 합니다. 덮어쓰려면 gcloud CLI로
--output-bigquery-force
플래그를 사용하거나 REST API로"force": true
를 사용합니다.리소스 유형별 개별 테이블로 내보내는 경우
container.googleapis.com/Cluster
및container.googleapis.com/NodePool
을 제외한 Google Kubernetes Engine(GKE) 리소스 유형은 지원되지 않습니다.동일한 대상에 대한 이전 요청이 15분 이내에 시작되어 계속 실행 중이면 Cloud Asset Inventory에서 내보내기 요청을 거부합니다. 하지만 내보내기가 완료되는 데 15분이 넘게 걸린 경우 완료된 것으로 표시되며 동일한 대상에 대한 새 내보내기 요청이 허용됩니다.
ACCESS_POLICY
콘텐츠 유형은 조직 수준에서만 내보낼 수 있습니다.내보낼 테이블이 이미 있고 내보내기 중인 경우
400
오류가 반환됩니다.
내보내기에 사용되는 BigQuery 스키마
모든 BigQuery 테이블은 열 이름, 데이터 유형, 기타 정보를 설명하는 스키마로 정의됩니다. 내보내기의 콘텐츠 유형을 설정하면 테이블의 스키마가 결정됩니다.
리소스 또는 지정되지 않음: 콘텐츠 유형을
RESOURCE
로 설정하거나 지정하지 않고per-asset-type
플래그를false
로 설정하거나 사용하지 않는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.리소스 스키마
[ { "name": "name", "type": "STRING", "mode": "NULLABLE" }, { "name": "asset_type", "type": "STRING", "mode": "NULLABLE" }, { "name": "resource", "type": "RECORD", "mode": "NULLABLE", "fields": [ { "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": "ancestors", "type": "STRING", "mode": "REPEATED" }, { "name": "update_time", "type": "TIMESTAMP", "mode": "NULLABLE" } ]
resource.data
열은 JSON 문자열로 표시되는 리소스 메타데이터입니다.콘텐츠 유형을
RESOURCE
로 설정하지 않거나 콘텐츠 유형을 설정하지 않고per-asset-type
플래그를true
로 설정하면 애셋 유형별로 개별 테이블을 만듭니다. 각 테이블의 스키마에는 애셋 유형의Resource.data
필드에 있는 중첩 필드에 매핑된 레코드 유형 열이 포함됩니다(BigQuery에서 지원하는 중첩 수준 최대 15개까지). 테이블 예시는 Google Cloud 콘솔의 export-assets-examples를 참고하세요.IAM 정책: REST API에서 콘텐츠 유형을
IAM_POLICY
로 설정하거나 gcloud CLI에서iam-policy
로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.IAM 정책 스키마
[ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "version", "mode": "NULLABLE", "type": "INTEGER" }, { "fields": [ { "name": "role", "mode": "NULLABLE", "type": "STRING" }, { "name": "members", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "expression", "mode": "NULLABLE", "type": "STRING" }, { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "name": "location", "mode": "NULLABLE", "type": "STRING" } ], "name": "condition", "mode": "NULLABLE", "type": "RECORD" } ], "name": "bindings", "mode": "REPEATED", "type": "RECORD" }, { "fields": [ { "name": "service", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "log_type", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "exempted_members", "mode": "REPEATED", "type": "STRING" } ], "name": "audit_log_configs", "mode": "REPEATED", "type": "RECORD" } ], "name": "audit_configs", "mode": "REPEATED", "type": "RECORD" }, { "name": "etag", "mode": "NULLABLE", "type": "STRING" } ], "name": "iam_policy", "mode": "NULLABLE", "type": "RECORD" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ]
조직 정책: REST API에서 콘텐츠 유형을
ORG_POLICY
로 설정하거나 gcloud CLI에서org-policy
로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.조직 정책 스키마
[ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "version", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "constraint", "mode": "NULLABLE", "type": "STRING" }, { "name": "etag", "mode": "NULLABLE", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" }, { "fields": [ { "name": "allowed_values", "mode": "REPEATED", "type": "STRING" }, { "name": "denied_values", "mode": "REPEATED", "type": "STRING" }, { "name": "all_values", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "suggested_value", "mode": "NULLABLE", "type": "STRING" }, { "name": "inherit_from_parent", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "list_policy", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "enforced", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "boolean_policy", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "_present", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "restore_default", "mode": "NULLABLE", "type": "RECORD" } ], "name": "org_policy", "mode": "REPEATED", "type": "RECORD" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ]
VPCSC 정책: REST API에서 콘텐츠 유형을
ACCESS_POLICY
로 설정하거나 gcloud CLI에서access-policy
로 설정하는 경우 다음 스키마가 있는 BigQuery 테이블을 만듭니다.VPCSC 정책 스키마
[ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "parent", "mode": "NULLABLE", "type": "STRING" }, { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "scopes", "mode": "REPEATED", "type": "STRING" }, { "name": "etag", "mode": "NULLABLE", "type": "STRING" } ], "name": "access_policy", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "fields": [ { "name": "ip_subnetworks", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "require_screenlock", "mode": "NULLABLE", "type": "BOOLEAN" }, { "name": "allowed_encryption_statuses", "mode": "REPEATED", "type": "INTEGER" }, { "fields": [ { "name": "os_type", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "minimum_version", "mode": "NULLABLE", "type": "STRING" }, { "name": "require_verified_chrome_os", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "os_constraints", "mode": "REPEATED", "type": "RECORD" }, { "name": "allowed_device_management_levels", "mode": "REPEATED", "type": "INTEGER" }, { "name": "require_admin_approval", "mode": "NULLABLE", "type": "BOOLEAN" }, { "name": "require_corp_owned", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "device_policy", "mode": "NULLABLE", "type": "RECORD" }, { "name": "required_access_levels", "mode": "REPEATED", "type": "STRING" }, { "name": "negate", "mode": "NULLABLE", "type": "BOOLEAN" }, { "name": "members", "mode": "REPEATED", "type": "STRING" }, { "name": "regions", "mode": "REPEATED", "type": "STRING" } ], "name": "conditions", "mode": "REPEATED", "type": "RECORD" }, { "name": "combining_function", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "basic", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "expression", "mode": "NULLABLE", "type": "STRING" }, { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "name": "location", "mode": "NULLABLE", "type": "STRING" } ], "name": "expr", "mode": "NULLABLE", "type": "RECORD" } ], "name": "custom", "mode": "NULLABLE", "type": "RECORD" } ], "name": "access_level", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "name": "perimeter_type", "mode": "NULLABLE", "type": "INTEGER" }, { "fields": [ { "name": "resources", "mode": "REPEATED", "type": "STRING" }, { "name": "access_levels", "mode": "REPEATED", "type": "STRING" }, { "name": "restricted_services", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "enable_restriction", "mode": "NULLABLE", "type": "BOOLEAN" }, { "name": "allowed_services", "mode": "REPEATED", "type": "STRING" } ], "name": "vpc_accessible_services", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "fields": [ { "name": "access_level", "mode": "NULLABLE", "type": "STRING" }, { "name": "resource", "mode": "NULLABLE", "type": "STRING" } ], "name": "sources", "mode": "REPEATED", "type": "RECORD" }, { "name": "identities", "mode": "REPEATED", "type": "STRING" }, { "name": "identity_type", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "ingress_from", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "service_name", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "method", "mode": "NULLABLE", "type": "STRING" }, { "name": "permission", "mode": "NULLABLE", "type": "STRING" } ], "name": "method_selectors", "mode": "REPEATED", "type": "RECORD" } ], "name": "operations", "mode": "REPEATED", "type": "RECORD" }, { "name": "resources", "mode": "REPEATED", "type": "STRING" } ], "name": "ingress_to", "mode": "NULLABLE", "type": "RECORD" } ], "name": "ingress_policies", "mode": "REPEATED", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "identities", "mode": "REPEATED", "type": "STRING" }, { "name": "identity_type", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "egress_from", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "resources", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "service_name", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "method", "mode": "NULLABLE", "type": "STRING" }, { "name": "permission", "mode": "NULLABLE", "type": "STRING" } ], "name": "method_selectors", "mode": "REPEATED", "type": "RECORD" } ], "name": "operations", "mode": "REPEATED", "type": "RECORD" }, { "name": "external_resources", "mode": "REPEATED", "type": "STRING" } ], "name": "egress_to", "mode": "NULLABLE", "type": "RECORD" } ], "name": "egress_policies", "mode": "REPEATED", "type": "RECORD" } ], "name": "status", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "resources", "mode": "REPEATED", "type": "STRING" }, { "name": "access_levels", "mode": "REPEATED", "type": "STRING" }, { "name": "restricted_services", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "enable_restriction", "mode": "NULLABLE", "type": "BOOLEAN" }, { "name": "allowed_services", "mode": "REPEATED", "type": "STRING" } ], "name": "vpc_accessible_services", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "fields": [ { "name": "access_level", "mode": "NULLABLE", "type": "STRING" }, { "name": "resource", "mode": "NULLABLE", "type": "STRING" } ], "name": "sources", "mode": "REPEATED", "type": "RECORD" }, { "name": "identities", "mode": "REPEATED", "type": "STRING" }, { "name": "identity_type", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "ingress_from", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "service_name", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "method", "mode": "NULLABLE", "type": "STRING" }, { "name": "permission", "mode": "NULLABLE", "type": "STRING" } ], "name": "method_selectors", "mode": "REPEATED", "type": "RECORD" } ], "name": "operations", "mode": "REPEATED", "type": "RECORD" }, { "name": "resources", "mode": "REPEATED", "type": "STRING" } ], "name": "ingress_to", "mode": "NULLABLE", "type": "RECORD" } ], "name": "ingress_policies", "mode": "REPEATED", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "identities", "mode": "REPEATED", "type": "STRING" }, { "name": "identity_type", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "egress_from", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "resources", "mode": "REPEATED", "type": "STRING" }, { "fields": [ { "name": "service_name", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "method", "mode": "NULLABLE", "type": "STRING" }, { "name": "permission", "mode": "NULLABLE", "type": "STRING" } ], "name": "method_selectors", "mode": "REPEATED", "type": "RECORD" } ], "name": "operations", "mode": "REPEATED", "type": "RECORD" }, { "name": "external_resources", "mode": "REPEATED", "type": "STRING" } ], "name": "egress_to", "mode": "NULLABLE", "type": "RECORD" } ], "name": "egress_policies", "mode": "REPEATED", "type": "RECORD" } ], "name": "spec", "mode": "NULLABLE", "type": "RECORD" }, { "name": "use_explicit_dry_run_spec", "mode": "NULLABLE", "type": "BOOLEAN" } ], "name": "service_perimeter", "mode": "NULLABLE", "type": "RECORD" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ]
OSConfig 인스턴스 인벤토리: REST API에서
OS_INVENTORY
로 콘텐츠 유형을 설정하거나 gcloud CLI에서os-inventory
를 설정할 때 다음 스키마가 있는 BigQuery 테이블을 만듭니다.OS 인벤토리 스키마
[ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "hostname", "mode": "NULLABLE", "type": "STRING" }, { "name": "long_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "short_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "kernel_version", "mode": "NULLABLE", "type": "STRING" }, { "name": "kernel_release", "mode": "NULLABLE", "type": "STRING" }, { "name": "osconfig_agent_version", "mode": "NULLABLE", "type": "STRING" } ], "name": "os_info", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "key", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "id", "mode": "NULLABLE", "type": "STRING" }, { "name": "origin_type", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "create_time", "mode": "NULLABLE", "type": "TIMESTAMP" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" }, { "name": "type", "mode": "NULLABLE", "type": "INTEGER" }, { "fields": [ { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "yum_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "apt_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "zypper_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "googet_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "patch_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "category", "mode": "NULLABLE", "type": "STRING" }, { "name": "severity", "mode": "NULLABLE", "type": "STRING" }, { "name": "summary", "mode": "NULLABLE", "type": "STRING" } ], "name": "zypper_patch", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "id", "mode": "NULLABLE", "type": "STRING" }, { "name": "name", "mode": "NULLABLE", "type": "STRING" } ], "name": "categories", "mode": "REPEATED", "type": "RECORD" }, { "name": "kb_article_ids", "mode": "REPEATED", "type": "STRING" }, { "name": "support_url", "mode": "NULLABLE", "type": "STRING" }, { "name": "more_info_urls", "mode": "REPEATED", "type": "STRING" }, { "name": "update_id", "mode": "NULLABLE", "type": "STRING" }, { "name": "revision_number", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "last_deployment_change_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ], "name": "wua_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "caption", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "name": "hot_fix_id", "mode": "NULLABLE", "type": "STRING" }, { "name": "install_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ], "name": "qfe_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "cos_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "display_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "display_version", "mode": "NULLABLE", "type": "STRING" }, { "name": "publisher", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "year", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "month", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "day", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "install_date", "mode": "NULLABLE", "type": "RECORD" }, { "name": "help_link", "mode": "NULLABLE", "type": "STRING" } ], "name": "windows_application", "mode": "NULLABLE", "type": "RECORD" } ], "name": "installed_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "yum_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "apt_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "zypper_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "googet_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "patch_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "category", "mode": "NULLABLE", "type": "STRING" }, { "name": "severity", "mode": "NULLABLE", "type": "STRING" }, { "name": "summary", "mode": "NULLABLE", "type": "STRING" } ], "name": "zypper_patch", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "title", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "id", "mode": "NULLABLE", "type": "STRING" }, { "name": "name", "mode": "NULLABLE", "type": "STRING" } ], "name": "categories", "mode": "REPEATED", "type": "RECORD" }, { "name": "kb_article_ids", "mode": "REPEATED", "type": "STRING" }, { "name": "support_url", "mode": "NULLABLE", "type": "STRING" }, { "name": "more_info_urls", "mode": "REPEATED", "type": "STRING" }, { "name": "update_id", "mode": "NULLABLE", "type": "STRING" }, { "name": "revision_number", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "last_deployment_change_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ], "name": "wua_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "caption", "mode": "NULLABLE", "type": "STRING" }, { "name": "description", "mode": "NULLABLE", "type": "STRING" }, { "name": "hot_fix_id", "mode": "NULLABLE", "type": "STRING" }, { "name": "install_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ], "name": "qfe_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "package_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "architecture", "mode": "NULLABLE", "type": "STRING" }, { "name": "version", "mode": "NULLABLE", "type": "STRING" } ], "name": "cos_package", "mode": "NULLABLE", "type": "RECORD" }, { "fields": [ { "name": "display_name", "mode": "NULLABLE", "type": "STRING" }, { "name": "display_version", "mode": "NULLABLE", "type": "STRING" }, { "name": "publisher", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "year", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "month", "mode": "NULLABLE", "type": "INTEGER" }, { "name": "day", "mode": "NULLABLE", "type": "INTEGER" } ], "name": "install_date", "mode": "NULLABLE", "type": "RECORD" }, { "name": "help_link", "mode": "NULLABLE", "type": "STRING" } ], "name": "windows_application", "mode": "NULLABLE", "type": "RECORD" } ], "name": "available_package", "mode": "NULLABLE", "type": "RECORD" } ], "name": "value", "mode": "NULLABLE", "type": "RECORD" } ], "name": "items", "mode": "REPEATED", "type": "RECORD" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ], "name": "os_inventory", "mode": "NULLABLE", "type": "RECORD" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ]
관계: REST API에서 콘텐츠 유형을
RELATIONSHIP
으로 설정하거나 gcloud CLI에서relationship
으로 설정하는 경우 다음 스키마가 포함된 BigQuery 테이블을 만듭니다.관계 스키마
[ { "name": "name", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "fields": [ { "name": "asset", "mode": "NULLABLE", "type": "STRING" }, { "name": "asset_type", "mode": "NULLABLE", "type": "STRING" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "relationship_type", "mode": "NULLABLE", "type": "STRING" } ], "name": "related_asset", "mode": "NULLABLE", "type": "RECORD" }, { "name": "ancestors", "mode": "REPEATED", "type": "STRING" }, { "name": "update_time", "mode": "NULLABLE", "type": "TIMESTAMP" } ]
애셋 스냅샷 내보내기
gcloud
gcloud asset export \ --SCOPE \ --billing-project=BILLING_PROJECT_ID \ --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \ --content-type=CONTENT_TYPE \ --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \ --snapshot-time="SNAPSHOT_TIME" \ --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \ --output-bigquery-force
다음 값을 제공합니다.
-
SCOPE
: 다음 중 한 가지 값을 사용합니다.-
project=PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
folder=FOLDER_ID
: 여기서FOLDER_ID
는 내보내려는 애셋 메타데이터가 포함된 폴더의 ID입니다.Google Cloud 폴더의 ID를 찾는 방법
Google Cloud 콘솔
Google Cloud 폴더의 ID를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: 선택사항. BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. ASSET_TYPE_#
: 선택사항. 검색 가능한 애셋 유형의 쉼표로 구분된 목록입니다. RE2 호환 정규 표현식이 지원됩니다. 정규 표현식이 지원되는 애셋 유형과 일치하지 않으면INVALID_ARGUMENT
오류가 반환됩니다.--asset-types
가 지정되지 않으면 모든 저작물 유형이 반환됩니다.CONTENT_TYPE
: 선택사항. 검색하려는 메타데이터의 콘텐츠 유형입니다.--content-type
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간(gcloud topic datetime 형식)입니다. 값은 과거 35일 이내여야 합니다.--snapshot-time
을 지정하지 않으면 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다.
--output-bigquery-force
플래그는 대상 테이블이 있는 경우 이를 덮어씁니다.
모든 옵션은 gcloud CLI 참조를 확인하세요.
예
다음 명령어를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 BigQuery 테이블 my-table
로 내보냅니다.
gcloud asset export \ --project=my-project \ --content-type=resource \ --snapshot-time="2024-01-30" \ --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \ --output-bigquery-force
응답 예시
Export in progress for root asset [projects/my-project]. Use [gcloud asset operations describe projects/000000000000/operations/ExportAssets/RESOURCE/00000000000000000000000000000000] to check the status of the operation.
REST
HTTP 메서드 및 URL:
POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets
헤더:
X-Goog-User-Project: BILLING_PROJECT_ID
JSON 요청 본문:
{ "contentType": "CONTENT_TYPE", "relationshipTypes": [ "RELATIONSHIP_TYPE_1", "RELATIONSHIP_TYPE_2", "..." ], "readTime": "SNAPSHOT_TIME", "outputConfig": { "bigqueryDestination": { "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID", "table": "TABLE_NAME", "force": true } } }
다음 값을 제공합니다.
-
SCOPE_PATH
: 다음 중 한 가지 값을 사용합니다.허용되는 값은 다음과 같습니다.
-
projects/PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
projects/PROJECT_NUMBER
: 여기서PROJECT_NUMBER
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 번호입니다.Google Cloud 프로젝트 번호를 찾는 방법
Google Cloud 콘솔
Google Cloud 프로젝트 번호를 찾으려면 다음 단계를 완료합니다.
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를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. CONTENT_TYPE
: 가져오려는 메타데이터의 콘텐츠 유형입니다.contentType
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간입니다(RFC 3339 형식). 값은 과거 35일 이내여야 합니다.readTime
이 지정되지 않은 경우 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다.
"force": true
키-값 쌍은 대상 테이블이 있는 경우 이를 덮어씁니다.
모든 옵션은 REST 참조를 참고하세요.
명령어 예시
다음 명령어 중 하나를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 BigQuery 테이블 my-table
로 내보냅니다.
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 '{ "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "force": true } } }' \ https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets
PowerShell(Windows)
$cred = gcloud auth print-access-token $headers = @{ "X-Goog-User-Project" = "BILLING_PROJECT_ID"; "Authorization" = "Bearer $cred" } $body = @" { "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "force": true } } } "@ Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body $body ` -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content
응답 예시
{ "name": "projects/000000000000/operations/ExportAssets/RESOURCE/00000000000000000000000000000000", "metadata": { "@type": "type.googleapis.com/google.cloud.asset.v1.ExportAssetsRequest", "parent": "projects/000000000000", "readTime": "2024-01-30T00:00:00Z", "contentType": "RESOURCE", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "force": true } } } }
Go
Cloud 애셋 인벤토리용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud 애셋 인벤토리 클라이언트 라이브러리를 참조하세요.
Cloud 애셋 인벤토리에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
자바
Cloud 애셋 인벤토리용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud 애셋 인벤토리 클라이언트 라이브러리를 참조하세요.
Cloud 애셋 인벤토리에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Cloud 애셋 인벤토리용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud 애셋 인벤토리 클라이언트 라이브러리를 참조하세요.
Cloud 애셋 인벤토리에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Cloud 애셋 인벤토리용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Cloud 애셋 인벤토리 클라이언트 라이브러리를 참조하세요.
Cloud 애셋 인벤토리에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
애셋 스냅샷을 각 애셋 유형에 따라 별도의 테이블로 내보내기
gcloud CLI에서 --per-asset-type
플래그를 사용하여 애셋을 각 애셋 유형별로 별도의 BigQuery 테이블로 내보낼 수 있으며, REST API 요청에서 "separateTablesPerAssetType": true
를 사용하면 됩니다.
이 모드에서는 각 테이블의 이름은 _
(밑줄) 및 애셋 유형 이름과 연결된 TABLE_NAME
입니다. 영숫자가 아닌 문자는 _
로 대체됩니다.
테이블로 내보내지 못하면 전체 내보내기 작업이 실패하고 첫 번째 오류를 반환합니다. 이전의 성공적인 내보내기 결과는 유지됩니다.
Proto3 및 BigQuery 유형 사이의 호환성 문제가 해결되도록 다음 유형이 JSON 문자열에 포함합니다.
google.protobuf.Timestamp
google.protobuf.Duration
google.protobuf.FieldMask
google.protobuf.ListValue
google.protobuf.Value
google.protobuf.Struct
google.api.*
gcloud
gcloud asset export \ --SCOPE \ --billing-project=BILLING_PROJECT_ID \ --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \ --content-type=CONTENT_TYPE \ --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \ --snapshot-time="SNAPSHOT_TIME" \ --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \ --per-asset-type \ --output-bigquery-force
다음 값을 제공합니다.
-
SCOPE
: 다음 중 한 가지 값을 사용합니다.-
project=PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
folder=FOLDER_ID
: 여기서FOLDER_ID
는 내보내려는 애셋 메타데이터가 포함된 폴더의 ID입니다.Google Cloud 폴더의 ID를 찾는 방법
Google Cloud 콘솔
Google Cloud 폴더의 ID를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: 선택사항. BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. ASSET_TYPE_#
: 선택사항. 검색 가능한 애셋 유형의 쉼표로 구분된 목록입니다. RE2 호환 정규 표현식이 지원됩니다. 정규 표현식이 지원되는 애셋 유형과 일치하지 않으면INVALID_ARGUMENT
오류가 반환됩니다.--asset-types
가 지정되지 않으면 모든 저작물 유형이 반환됩니다.CONTENT_TYPE
: 선택사항. 검색하려는 메타데이터의 콘텐츠 유형입니다.--content-type
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간(gcloud topic datetime 형식)입니다. 값은 과거 35일 이내여야 합니다.--snapshot-time
을 지정하지 않으면 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다.
--output-bigquery-force
플래그는 대상 테이블이 있는 경우 이를 덮어씁니다.
모든 옵션은 gcloud CLI 참조를 확인하세요.
예
다음 명령어를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 접두사가 my-table
인 여러 BigQuery 테이블로 내보냅니다.
gcloud asset export \ --project=my-project \ --content-type=resource \ --snapshot-time="2024-01-30" \ --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \ --per-asset-type \ --output-bigquery-force
REST
HTTP 메서드 및 URL:
POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets
헤더:
X-Goog-User-Project: BILLING_PROJECT_ID
JSON 요청 본문:
{ "contentType": "CONTENT_TYPE", "relationshipTypes": [ "RELATIONSHIP_TYPE_1", "RELATIONSHIP_TYPE_2", "..." ], "readTime": "SNAPSHOT_TIME", "outputConfig": { "bigqueryDestination": { "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID", "table": "TABLE_NAME", "force": true, "separateTablesPerAssetType": true } } }
다음 값을 제공합니다.
-
SCOPE_PATH
: 다음 중 한 가지 값을 사용합니다.허용되는 값은 다음과 같습니다.
-
projects/PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
projects/PROJECT_NUMBER
: 여기서PROJECT_NUMBER
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 번호입니다.Google Cloud 프로젝트 번호를 찾는 방법
Google Cloud 콘솔
Google Cloud 프로젝트 번호를 찾으려면 다음 단계를 완료합니다.
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를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. CONTENT_TYPE
: 가져오려는 메타데이터의 콘텐츠 유형입니다.contentType
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간입니다(RFC 3339 형식). 값은 과거 35일 이내여야 합니다.readTime
이 지정되지 않은 경우 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다.
"force": true
키-값 쌍은 대상 테이블이 있는 경우 이를 덮어씁니다.
명령어 예시
다음 명령 중 하나를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 접두사가 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 '{ "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "force": true, "separateTablesPerAssetType": true } } }' \ https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets
PowerShell(Windows)
$cred = gcloud auth print-access-token $headers = @{ "X-Goog-User-Project" = "BILLING_PROJECT_ID"; "Authorization" = "Bearer $cred" } $body = @" { "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "force": true, "separateTablesPerAssetType": true } } } "@ Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body $body ` -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content
시간 단위 열로 파티션을 나눈 테이블로 애셋 스냅샷 내보내기
프로젝트의 애셋을 시간 단위 열 파티션 테이블로 내보낼 수 있습니다.
내보낸 스냅샷은 일일 세부사항이 있는 TABLE_NAME
이라는 BigQuery 테이블과 readTime
및 requestTime
이라는 두 개의 추가 타임스탬프 열에 저장되는데, 둘 중 하나는 PARTITION_KEY
값이 포함된 파티션 열로 지정합니다.
프로젝트의 애셋을 파티션을 나눈 테이블로 내보내려면 다음 요청 중 하나를 수행합니다.
gcloud
gcloud asset export \ --SCOPE \ --billing-project=BILLING_PROJECT_ID \ --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \ --content-type=CONTENT_TYPE \ --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \ --snapshot-time="SNAPSHOT_TIME" \ --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \ --partition-key=PARTITION_KEY \ --output-bigquery-force
다음 값을 제공합니다.
-
SCOPE
: 다음 중 한 가지 값을 사용합니다.-
project=PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
folder=FOLDER_ID
: 여기서FOLDER_ID
는 내보내려는 애셋 메타데이터가 포함된 폴더의 ID입니다.Google Cloud 폴더의 ID를 찾는 방법
Google Cloud 콘솔
Google Cloud 폴더의 ID를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: 선택사항. BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. ASSET_TYPE_#
: 선택사항. 검색 가능한 애셋 유형의 쉼표로 구분된 목록입니다. RE2 호환 정규 표현식이 지원됩니다. 정규 표현식이 지원되는 애셋 유형과 일치하지 않으면INVALID_ARGUMENT
오류가 반환됩니다.--asset-types
가 지정되지 않으면 모든 저작물 유형이 반환됩니다.CONTENT_TYPE
: 선택사항. 검색하려는 메타데이터의 콘텐츠 유형입니다.--content-type
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간(gcloud topic datetime 형식)입니다. 값은 과거 35일 이내여야 합니다.--snapshot-time
을 지정하지 않으면 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다. -
PARTITION_KEY
: 파티션을 나눈 BigQuery 테이블로 내보낼 때의 파티션 키 열입니다. 유효한 값은read-time
및request-time
입니다.
--output-bigquery-force
플래그는 대상 테이블의 해당 파티션에 있는 데이터를 덮어씁니다. 다른 파티션의 데이터는 그대로 유지됩니다.
--output-bigquery-force
가 지정되지 않으면 내보낸 데이터가 해당 파티션에 추가됩니다.
스키마 업데이트나 데이터 추가에 실패하면 내보내기 작업이 실패합니다. 여기에는 대상 테이블이 이미 있고 내보내기에 필요한 스키마가 없는 경우가 포함됩니다.
모든 옵션은 gcloud CLI 참조를 확인하세요.
예
다음 명령어를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 BigQuery 테이블 my-table
로 내보냅니다.
gcloud asset export \ --project=projects/my-project \ --content-type=resource \ --snapshot-time="2024-01-30" \ --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \ --partition-key=my-partition-key \ --output-bigquery-force
REST
HTTP 메서드 및 URL:
POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets
헤더:
X-Goog-User-Project: BILLING_PROJECT_ID
JSON 요청 본문:
{ "contentType": "CONTENT_TYPE", "relationshipTypes": [ "RELATIONSHIP_TYPE_1", "RELATIONSHIP_TYPE_2", "..." ], "readTime": "SNAPSHOT_TIME", "outputConfig": { "bigqueryDestination": { "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID", "table": "TABLE_NAME", "partitionSpec": { "partitionKey": "PARTITION_KEY" }, "force": true, } } }
다음 값을 제공합니다.
-
SCOPE_PATH
: 다음 중 한 가지 값을 사용합니다.허용되는 값은 다음과 같습니다.
-
projects/PROJECT_ID
: 여기서PROJECT_ID
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 ID입니다. -
projects/PROJECT_NUMBER
: 여기서PROJECT_NUMBER
는 내보내려는 애셋 메타데이터가 있는 프로젝트의 번호입니다.Google Cloud 프로젝트 번호를 찾는 방법
Google Cloud 콘솔
Google Cloud 프로젝트 번호를 찾으려면 다음 단계를 완료합니다.
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를 찾으려면 다음 단계를 완료하세요.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 폴더 이름을 검색합니다. 폴더 이름 옆에 폴더 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를 찾으려면 다음 단계를 완료합니다.
-
Google Cloud 콘솔로 이동합니다.
- 메뉴 바에서 전환 목록 상자를 클릭합니다.
- 목록 상자에서 조직을 선택합니다.
- 모두 탭을 클릭합니다. 조직 ID가 조직 이름 옆에 표시됩니다.
gcloud CLI
다음 명령어를 사용하여 Google Cloud 조직의 ID를 검색할 수 있습니다.
gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
-
-
-
BILLING_PROJECT_ID
: BigQuery 데이터 세트 및 테이블 관리 권한이 있는 기본 Cloud 애셋 인벤토리 서비스 에이전트가 있는 프로젝트 ID입니다. 결제 프로젝트 설정에 대해 자세히 알아보세요. CONTENT_TYPE
: 가져오려는 메타데이터의 콘텐츠 유형입니다.contentType
이 지정되지 않으면 애셋 이름, 애셋이 마지막으로 업데이트된 시간, 애셋이 속한 프로젝트, 폴더, 조직과 같은 기본 정보만 반환됩니다.-
RELATIONSHIP_TYPE_#
: 선택사항. Security Command Center 프리미엄 및 엔터프라이즈 등급 구독자만 사용할 수 있습니다. 검색하려는 애셋 관계 유형의 쉼표로 구분된 목록입니다. 이렇게 하려면CONTENT_TYPE
을RELATIONSHIP
으로 설정해야 합니다. -
SNAPSHOT_TIME
: 선택사항. 애셋의 스냅샷을 만들려는 시간입니다(RFC 3339 형식). 값은 과거 35일 이내여야 합니다.readTime
이 지정되지 않은 경우 현재 시간으로 스냅샷을 찍습니다. -
BIGQUERY_PROJECT_ID
: 내보내려는 BigQuery 테이블이 있는 프로젝트의 ID입니다. DATASET_ID
: BigQuery 데이터 세트의 ID입니다.-
TABLE_NAME
: 메타데이터를 내보내는 BigQuery 테이블. 테이블이 없으면 생성됩니다. -
PARTITION_KEY
: 파티션을 나눈 BigQuery 테이블로 내보낼 때의 파티션 키 열입니다. 유효한 값은READ_TIME
및REQUEST_TIME
입니다.
"force": true
키-값 쌍은 대상 테이블의 해당 파티션에 있는 데이터를 덮어씁니다. 다른 파티션의 데이터는 그대로 유지됩니다.
force
가 설정되지 않았거나 false
로 설정되면 내보낸 데이터가 해당 파티션에 추가됩니다.
스키마 업데이트나 데이터 추가에 실패하면 내보내기 작업이 실패합니다. 여기에는 대상 테이블이 이미 있고 내보내기에 필요한 스키마가 없는 경우가 포함됩니다.
명령어 예시
다음 명령어 중 하나를 실행하여 my-project
프로젝트에서 2024년 1월 30일의 resource
메타데이터를 BigQuery 테이블 my-table
로 내보냅니다.
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 '{ "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "partitionSpec": { "partitionKey": "my-partition-key" }, "force": true, } } }' \ https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets
PowerShell(Windows)
$cred = gcloud auth print-access-token $headers = @{ "X-Goog-User-Project" = "BILLING_PROJECT_ID"; "Authorization" = "Bearer $cred" } $body = @" { "contentType": "RESOURCE", "readTime": "2024-01-30T00:00:00Z", "outputConfig": { "bigqueryDestination": { "dataset": "projects/my-project/datasets/my-dataset", "table": "my-table", "partitionSpec": { "partitionKey": "my-partition-key" }, "force": true, } } } "@ Invoke-WebRequest ` -Method POST ` -Headers $headers ` -ContentType: "application/json; charset=utf-8" ` -Body $body ` -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content
내보내기 상태 확인
내보내기를 완료하는 데 시간이 걸립니다. 내보내기가 완료되었는지 확인하려면 해당 작업 ID를 사용하여 작업을 쿼리하면 됩니다.
내보내기가 완료되더라도 다른 사용자가 동일한 대상에 다른 작업으로 내보내기 요청을 했을 수 있습니다. 이전 요청이 완료된 후 또는 15분이 지난 후에 동일한 대상에 대한 새 내보내기 요청을 할 수 있습니다. 이러한 조건을 벗어난 내보내기 요청은 Cloud 애셋 인벤토리에서 거부됩니다.
gcloud
내보내기 상태를 보려면 다음 안내를 따르세요.
내보내기 요청에 대한 응답에서 작업 ID가 포함된
OPERATION_PATH
를 가져옵니다.OPERATION_PATH
는 내보내기에 대한 응답에 표시되며 형식은 다음과 같습니다.projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
내보내기 상태를 확인하려면
OPERATION_PATH
와 함께 다음 명령어를 실행합니다.gcloud asset operations describe OPERATION_PATH
REST
내보내기 상태를 보려면 다음 안내를 완료합니다.
내보내기 요청에 대한 응답에서 작업 ID가 포함된
OPERATION_PATH
를 가져옵니다.OPERATION_PATH
는 내보내기에 대한 응답의name
필드 값으로 표시되며 형식은 다음과 같습니다.projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
내보내기 상태를 확인하려면 다음 요청을 실행합니다.
REST
HTTP 메서드 및 URL:
GET https://cloudasset.googleapis.com/v1/OPERATION_PATH
명령어 예시
cURL(Linux, macOS, Cloud Shell)
curl -X GET \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ https://cloudasset.googleapis.com/v1/OPERATION_PATH
PowerShell(Windows)
$cred = gcloud auth print-access-token $headers = @{ "Authorization" = "Bearer $cred" } Invoke-WebRequest ` -Method GET ` -Headers $headers ` -Uri "https://cloudasset.googleapis.com/v1/OPERATION_PATH" | Select-Object -Expand Content
BigQuery에서 애셋 스냅샷 보기
콘솔
Google Cloud 콘솔에서 BigQuery Studio 페이지로 이동합니다.
데이터 세트의 테이블과 뷰를 표시하려면 탐색 패널을 엽니다. 리소스 섹션에서 프로젝트를 선택하여 펼친 다음 데이터 세트를 선택합니다.
목록에서 테이블을 선택합니다.
세부정보를 선택하고 행 개수 값을 확인합니다. gcloud CLI 또는 REST API를 사용하여 결과의 시작점을 제어하려면 이 값이 필요할 수 있습니다.
샘플 데이터 세트를 보려면 미리보기를 선택합니다.
REST
테이블 데이터를 찾아보려면 tabledata.list
를 호출하세요. tableId
매개변수에 테이블 이름을 지정합니다.
다음과 같은 선택적 매개변수를 구성하여 출력을 제어할 수 있습니다.
maxResults
는 반환할 최대 결과 수입니다.selectedFields
는 반환할 열을 쉼표로 구분한 목록입니다. 지정하지 않으면 모든 열이 반환됩니다.startIndex
는 읽기를 시작할 행의 0부터 시작하는 색인입니다.
반환되는 값은 JSON 객체에 래핑되므로 tabledata.list
참조 문서의 설명에 따라 객체를 파싱해야 합니다.
BigQuery에서 애셋 스냅샷 쿼리
스냅샷을 BigQuery로 내보낸 후 애셋 메타데이터에서 쿼리를 실행할 수 있습니다.
기본적으로 BigQuery는 대화형 또는 주문형 쿼리 작업을 실행합니다. 따라서 쿼리가 최대한 빠르게 실행됩니다. 대화형 쿼리는 동시 비율 한도와 일일 한도에 반영됩니다.
쿼리 결과는 임시 또는 영구 테이블에 저장됩니다. 데이터를 기존 테이블에 추가하거나 덮어쓸지, 혹은 동일한 이름의 테이블이 존재하지 않을 경우 새 테이블을 만들지 선택할 수 있습니다.
임시 테이블에 출력을 작성하는 대화형 쿼리를 실행하려면 다음 단계를 완료합니다.
콘솔
Google Cloud 콘솔에서 BigQuery Studio 페이지로 이동합니다.
새 쿼리 작성을 선택합니다.
쿼리 편집기 텍스트 영역에 유효한 BigQuery SQL 쿼리를 입력합니다.
(선택사항) 데이터 처리 위치를 변경하려면 다음 단계를 완료합니다.
더보기를 선택한 다음 쿼리 설정을 선택합니다.
처리 위치에서 자동 선택을 선택한 후 데이터의 위치를 선택합니다.
쿼리 설정을 업데이트하려면 저장을 선택합니다.
Run(실행)을 선택합니다.
REST
새 작업을 시작하려면
jobs.insert
메서드를 호출합니다. 작업 리소스에서 다음 매개변수를 설정합니다.configuration
필드에서query
필드를 BigQuery 쿼리 작업을 설명하는 JobConfigurationQuery로 설정합니다.jobReference
필드에서location
필드를 작업에 적합하도록 설정합니다.
결과를 폴링하려면
getQueryResults
을 호출합니다.jobComplete
가true
가 될 때까지 폴링해야 합니다.errors
목록에서 오류 및 경고를 확인할 수 있습니다.
추가 SQL 쿼리 예시
이 섹션에서는 BigQuery로 내보낸 후 애셋 메타데이터를 분석하는 SQL 쿼리 예시를 제공합니다. 자세한 내용은 표준 SQL 쿼리 구문을 참조하세요.
사용 가능한 열을 직접 쿼리
각 애셋 유형의 수량을 찾으려면 다음 쿼리를 실행합니다.
SELECT asset_type, COUNT(*) AS asset_count
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
GROUP BY asset_type
ORDER BY asset_count DESC
반복 필드 작업
Gmail 계정에 액세스 권한을 부여하는 Identity and Access Management(IAM) 정책을 찾으려면 다음 쿼리를 실행합니다. BigQuery는 UNNEST
를 사용하여 반복 필드를 직접 쿼리할 수 있는 테이블로 평면화합니다.
SELECT name, asset_type, bindings.role
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
JOIN UNNEST(iam_policy.bindings) AS bindings
JOIN UNNEST(bindings.members) AS principals
WHERE principals like "%@gmail.com"
공개 IP 주소를 사용하여 생성할 수 있는 조직, 폴더, 프로젝트를 찾으려면 다음 쿼리를 실행합니다. 이 쿼리는 SSL 또는 프록시가 구성되어 있지 않다면 Cloud SQL 인스턴스가 있는 공개 IP를 허용하는 것이 취약점을 유발할 수 있기 때문에 유용합니다.
SELECT name
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
JOIN UNNEST(org_policy) AS op
WHERE
op.constraint = "constraints/sql.restrictPublicIp"
AND (op.boolean_policy IS NULL OR op.boolean_policy.enforced = FALSE);
프로젝트의 동일한 VPC 서비스 제어 서비스 경계 내에서 조직, 폴더 또는 프로젝트를 찾으려면 다음 쿼리를 실행합니다.
SELECT service_perimeter.title, service_perimeter.status.resources
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
CROSS JOIN UNNEST(service_perimeter.status.resources) as resource
WHERE resource = "projects/PROJECT_ID";
JSON 문자열로 작업
공개 방화벽 규칙을 찾으려면 다음 쿼리를 실행합니다. BigQuery에서 사용되는 JSON 함수에 대해 자세히 알아보기
CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(json).map(x=>JSON.stringify(x));
""";
SELECT firewall.name, firewall.resource.parent, JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') AS sourceRanges
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS firewall
JOIN UNNEST(json2array(JSON_EXTRACT(firewall.resource.data, '$.sourceRanges'))) AS source_ranges
WHERE asset_type="compute.googleapis.com/Firewall" AND JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') IS NOT NULL AND JSON_EXTRACT_SCALAR(source_ranges, '$') = "0.0.0.0/0"
리소스 유형별로 테이블을 분리하면 더 쉽고 빠른 쿼리로 개방형 방화벽 규칙을 찾을 수 있습니다.
SELECT firewall.name, firewall.resource.parent, sourceRanges
FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` AS firewall
JOIN UNNEST(firewall.resource.data.sourceRanges) AS sourceRanges
WHERE sourceRanges = "0.0.0.0/0";
여러 리소스 유형의 테이블 조인
여러 리소스 유형의 테이블을 조인하려면 다음 쿼리를 실행합니다. 다음 예시에서는 VM이 연결되지 않은 모든 서브네트워크를 찾는 방법을 보여줍니다.
먼저 쿼리가 모든 서브네트워크를 찾습니다. 그런 다음 이 목록에서 selfLink
값이 없는 서브네트워크를 선택합니다.
CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
return JSON.parse(json).map(x=>JSON.stringify(x));
""";
SELECT name, JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') AS selflink
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS subnetwork
WHERE asset_type = "compute.googleapis.com/Subnetwork" AND (JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') NOT IN
(SELECT DISTINCT JSON_EXTRACT(network_interfaces, '$.subnetwork')
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` as instance
JOIN UNNEST(json2array(JSON_EXTRACT(instance.resource.data, '$.networkInterfaces'))) AS network_interfaces
WHERE asset_type ="compute.googleapis.com/Instance"
AND JSON_EXTRACT(instance.resource.data, '$.networkInterfaces') IS NOT NULL
)) IS NULL
리소스 유형별로 테이블을 분리하면 더 빠르고 쉬운 쿼리로 연결된 VM이 없는 모든 서브네트워크를 찾을 수 있습니다.
SELECT name, subnetwork.resource.data.selfLink
FROM `PROJECT_ID.DATASET_ID.STRUCTURED_SUBNETWORK_TABLE_NAME` AS subnetwork
WHERE
(
subnetwork.resource.data.selfLink
NOT IN (
SELECT DISTINCT networkInterface.subnetwork
FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` as instance
JOIN
UNNEST(instance.resource.data.networkInterfaces) AS networkInterface
WHERE
networkInterface IS NOT NULL
)
) IS NULL;
CVE-2021-44228로 인해 취약한 Dataproc 클러스터 찾기
CREATE TEMP FUNCTION vulnerable_version(imageVersion STRING)
RETURNS BOOL
LANGUAGE js AS r"""
const version_regexp = /(?<major>\d+)(?:\.)(?<minor>\d+)(?:\.)?(?<sub>\d+)?/g;
let match = version_regexp.exec(imageVersion);
if(match.groups.major < 1){
return true;
}
if (match.groups.major == 1){
if (match.groups.minor < 3){
return true;
}
if(match.groups.minor == 3 && match.groups.sub < 95){
return true;
}
if(match.groups.minor == 4 && match.groups.sub < 77){
return true;
}
if(match.groups.minor == 5 && match.groups.sub < 53){
return true;
}
}
if (match.groups.major == 2 && match.groups.minor == 0 && match.groups.sub < 27){
return true;
}
return false;
""";
SELECT
c.name,
c.resource.data.projectId AS project_id,
c.resource.data.clusterName AS cluster_name,
c.resource.data.config.softwareConfig.imageVersion AS image_version,
c.resource.data.status.state AS cluster_state,
vulnerable_version(c.resource.data.config.softwareConfig.imageVersion) AS is_vulnerable
FROM
`PROJECT_ID.DATASET_ID.TABLE_NAME_PREFIX_dataproc_googleapis_com_Cluster` c
INNER JOIN `PROJECT_ID.DATASET_ID.TABLE_NAME_PREFIX_cloudresourcemanager_googleapis_com_Project` p
ON p.resource.data.projectId = c.resource.data.projectId
WHERE
c.resource.data.config.softwareConfig.imageVersion IS NOT NULL
AND c.resource.data.status.state = "RUNNING"
AND p.resource.data.lifecycleState = "ACTIVE";