gcp-assets
Cloud Asset Inventory API로 Google Cloud 프로젝트·폴더·조직 아래의 자원을 검색합니다.
문법
옵션
- profile=STRING
- 선택 옵션. Google Cloud 접속 프로파일 식별자. 쉼표로 여러 개를 지정하면 프로파일마다 차례로 조회하고 profile 필드로 구분합니다. 생략하면 사용 권한이 있는 모든 Google Cloud 접속 프로파일로 조회합니다. 조회 중 한 프로파일에서 오류가 나면 그때까지 출력한 결과는 남고, 나머지 프로파일은 조회하지 않은 채 쿼리가 오류로 끝납니다.
- scope=STRING
- 선택 옵션. 조회 범위.
projects/프로젝트ID(또는projects/프로젝트번호),folders/폴더번호,organizations/조직번호중 하나. 지정한 범위와 그 아래(하위 폴더·프로젝트 포함)의 자원을 조회합니다. 생략하면 서비스 계정 JSON 키의 프로젝트를 조회합니다. - types=STRING
- 선택 옵션. 조회할 자산 유형. 쉼표로 여러 개를 지정할 수 있고 정규표현식을 지원합니다. 예:
compute.googleapis.com/Instance,iam.googleapis.com/.*. 생략하면 모든 유형을 조회합니다. 자주 쓰는 유형은 설명의 자산 유형 표를 참고합니다. - query=STRING
- 선택 옵션. Cloud Asset Inventory 검색식. 예:
labels.env:prod,location:asia-northeast3,name:sinks. 한글처럼 영문·숫자가 아닌 문자가 든 검색어는 큰따옴표로 감싸야 하며, 옵션 값 안에서는\"로 씁니다. 예:query="tagKeys:\"앱개발팀\"". 검색식 문법은 Cloud Asset Inventory 검색식 문법을 참고합니다. - limit=INT
- 선택 옵션. 프로파일별 최대 출력 건수. 1 이상의 정수. 생략하면 전체를 조회합니다.
- verbose=BOOL
- 선택 옵션.
t이면 자원 전체 설정(versioned_resources)과 부속 자원(attached_resources)을 함께 출력합니다.t,f,true,false중 하나 (기본값:f)
출력 필드
| 필드 | 타입 | 이름 | 설명 |
|---|---|---|---|
| profile | 문자열 | 프로파일 | 접속 프로파일 이름 |
| asset_type | 문자열 | 자산 유형 | 예: compute.googleapis.com/Instance |
| display_name | 문자열 | 표시 이름 | 자원 표시 이름 |
| project_id | 문자열 | 프로젝트 ID | 사용자가 지정한 프로젝트 ID. 리소스가 프로젝트에 속하지 않으면(조직·폴더 등) 빈 값 |
| project_name | 문자열 | 프로젝트 이름 | 프로젝트 표시 이름. 리소스가 프로젝트에 속하지 않으면(조직·폴더 등) 빈 값 |
| location | 문자열 | 위치 | 예: global, us-central1 |
| state | 문자열 | 상태 | 자원 상태. 예: RUNNING, ACTIVE, ENABLED |
| create_time | 날짜 | 생성 시각 | 자원 생성 시각. 값을 제공하는 자원만 있음 |
| update_time | 날짜 | 수정 시각 | 자원 최종 수정 시각. 값을 제공하는 자원만 있음 |
| name | 문자열 | 이름 | 전체 자원 이름. 예: //compute.googleapis.com/projects/p1/zones/z1/instances/i1 |
| description | 문자열 | 설명 | 자원 설명. 설명이 있는 자원만 값이 있음 |
| labels | 맵 | 라벨 | 사용자 정의 라벨 |
| tags | 목록 | 태그 | 자원에 직접 연결된 태그. 항목마다 tagKey, tagKeyId, tagValue, tagValueId |
| effective_tags | 목록 | 적용 태그 | 직접 연결되거나 상위에서 상속된 태그. 상속한 자원(attachedResource)별로 묶임 |
| network_tags | 목록 | 네트워크 태그 | Compute Engine 자원의 네트워크 태그 |
| kms_keys | 목록 | KMS 키 | 자원 암호화에 사용하는 Cloud KMS 키 |
| project | 문자열 | 프로젝트 | projects/{번호} 형식의 소속 프로젝트. 조직·폴더 자원은 빈 값 |
| folders | 목록 | 폴더 | folders/{번호} 형식의 상위 폴더 목록. 가까운 폴더부터 나열 |
| organization | 문자열 | 조직 | organizations/{번호} 형식의 소속 조직 |
| parent_asset_type | 문자열 | 상위 자원 유형 | 상위 자원의 자산 유형 |
| parent_full_resource_name | 문자열 | 상위 자원 | 상위 자원의 전체 이름 |
| additional_attributes | 맵 | 추가 속성 | 자산 유형별 추가 속성. 예: 프로젝트의 projectId |
| versioned_resources | 목록 | 자원 설정 | API 버전별 자원 전체 설정. Cloud Asset Inventory 응답 원본. verbose=t일 때만 출력 |
| attached_resources | 목록 | 부속 자원 | Compute Engine OS 인벤토리 등 자원에 붙은 부속 자원. Cloud Asset Inventory 응답 원본. verbose=t일 때만 출력 |
오류 코드
파싱 오류
| 오류 메시지 | 원인 | 해결 |
|---|---|---|
| 사용 가능한 Google Cloud 프로파일이 없습니다. | 프로파일 식별자가 틀렸거나 사용 권한이 없음 | profile 옵션에 접속 프로파일 식별자 입력, 프로파일 사용 권한 확인 |
| scope 형식이 올바르지 않습니다: {scope} | scope 형식 오류, 또는 폴더·조직을 이름으로 지정함 | projects/, folders/, organizations/ 다음에 ID·번호 입력 |
| limit은 양의 정수여야 합니다: {limit} | limit이 0 이하이거나 숫자가 아님 | 1 이상의 정수 입력 |
| verbose는 t, f, true, false 중 하나여야 합니다: {verbose} | verbose 값 오류 | t, f, true, false 중 하나 입력 |
런타임 오류
| 오류 메시지 | 원인 | 해결 |
|---|---|---|
| HTTP 403: PERMISSION_DENIED - The caller does not have permission | 조회 범위에 Cloud 애셋 뷰어 역할이 없음 | gcp-check-permissions로 확인하고 해당 범위에 역할 부여 |
| HTTP 403: PERMISSION_DENIED - Cloud Asset API has not been used in project ... | 서비스 계정 프로젝트에서 Cloud Asset API 미사용 설정 | 서비스 계정이 속한 프로젝트에서 Cloud Asset API 사용 설정 |
| HTTP 400: INVALID_ARGUMENT - Invalid query syntax, Unsupported field: ... | 검색식 문법 오류, 지원하지 않는 필드 | 오류 메시지의 지원 필드 목록과 검색식 문법 문서를 참고해 수정 |
| HTTP 400: INVALID_ARGUMENT - Please quote term ... with double quotes | 검색식에 한글 등 특수 문자가 든 검색어를 따옴표 없이 사용 | 검색어를 "로 감싸기 |
| HTTP 400: INVALID_ARGUMENT - No supported asset type matches: ... | types에 검색할 수 없거나 없는 자산 유형 지정 | 지원 자산 유형 목록에서 유형 확인 |
| token exchange failed, HTTP 400: Invalid grant | JSON 키 오류, 서비스 계정·키 삭제 | 새 키를 발급해 접속 프로파일 수정 |
설명
지정한 범위에서 Cloud Asset Inventory의 searchAllResources API로 자원 메타데이터를 검색합니다. 조직이나 폴더를 지정하면 그 아래 모든 폴더와 프로젝트의 자원까지 조회합니다. 결과는 한 번에 최대 500건씩 받아 끝까지 이어서 조회합니다.
API는 소속 프로젝트를 번호(projects/번호)로만 돌려줍니다. 알아보기 쉽도록 같은 범위에서 프로젝트 정보를 한 번 더 조회해 project_id와 project_name을 채웁니다. 폴더·조직은 번호(folders, organization)로만 나옵니다. 폴더·조직 이름은 types="cloudresourcemanager.googleapis.com/(Folder|Organization)"으로 조회해 확인합니다.
scope에는 표시 이름이 아니라 ID·번호를 지정합니다. 폴더·프로젝트 표시 이름은 겹칠 수 있고 바뀔 수 있어, 이름으로 지정하면 의도하지 않은 범위를 조회할 수 있기 때문입니다. 조직·폴더 번호는 다음 쿼리로 확인할 수 있습니다.
gcp-assets profile=gcp types="cloudresourcemanager.googleapis.com/(Organization|Folder|Project)"
| fields asset_type, display_name, name, organization
query는 앱에서 검사하지 않고 Google Cloud에 그대로 전달합니다. 잘못된 검색식은 Google Cloud가 INVALID_ARGUMENT 오류와 원인을 돌려주며, 그 메시지가 쿼리 오류로 표시됩니다.
verbose=t를 지정하면 자원 유형마다 구조가 다른 전체 설정을 함께 받으므로 응답이 커집니다. 범위가 크면 접속 프로파일의 읽기 타임아웃을 늘리거나 types로 범위를 좁혀 사용합니다.
자주 쓰는 자산 유형
types 옵션에 지정할 수 있는 자산 유형 중 자주 쓰는 것입니다. 전체 목록은 지원 자산 유형을 참고합니다. 목록에 없거나 이름이 틀리면 No supported asset type matches 오류가 납니다.
| 분류 | 자산 유형 | 자원 |
|---|---|---|
| 컴퓨팅 | compute.googleapis.com/Instance | VM 인스턴스 |
| 컴퓨팅 | compute.googleapis.com/Disk | 영구 디스크 |
| 컴퓨팅 | container.googleapis.com/Cluster | GKE 클러스터 |
| 컴퓨팅 | run.googleapis.com/Service | Cloud Run 서비스 |
| 컴퓨팅 | cloudfunctions.googleapis.com/Function | Cloud Functions (2세대) |
| 네트워크 | compute.googleapis.com/Firewall | 방화벽 규칙 |
| 네트워크 | compute.googleapis.com/Network | VPC 네트워크 |
| 네트워크 | compute.googleapis.com/Subnetwork | 서브넷 |
| 네트워크 | compute.googleapis.com/Address | IP 주소 예약 |
| 네트워크 | dns.googleapis.com/ManagedZone | Cloud DNS 영역 |
| 스토리지·DB | storage.googleapis.com/Bucket | Cloud Storage 버킷 |
| 스토리지·DB | sqladmin.googleapis.com/Instance | Cloud SQL 인스턴스 |
| 스토리지·DB | bigquery.googleapis.com/Dataset | BigQuery 데이터 세트 |
| 보안·ID | iam.googleapis.com/ServiceAccount | 서비스 계정 |
| 보안·ID | iam.googleapis.com/ServiceAccountKey | 서비스 계정 키 |
| 보안·ID | iam.googleapis.com/Role | 커스텀 역할 |
| 보안·ID | cloudkms.googleapis.com/CryptoKey | Cloud KMS 키 |
| 보안·ID | secretmanager.googleapis.com/Secret | Secret Manager 보안 비밀 |
| 보안·ID | orgpolicy.googleapis.com/Policy | 조직 정책 |
| 리소스 계층 | cloudresourcemanager.googleapis.com/Organization | 조직 |
| 리소스 계층 | cloudresourcemanager.googleapis.com/Folder | 폴더 |
| 리소스 계층 | cloudresourcemanager.googleapis.com/Project | 프로젝트 |
| 운영 | serviceusage.googleapis.com/Service | 사용 설정된 API |
| 운영 | logging.googleapis.com/LogSink | 로그 싱크 |
정규표현식으로 여러 유형을 한 번에 지정할 수 있습니다. 예: types="compute.googleapis.com/.*"(Compute Engine 전체), types="iam.googleapis.com/.*"(IAM 전체)
사용 예
예시: 조직 전체 자원 유형별 현황
상황: 조직에 어떤 종류의 자원이 몇 개 있는지 파악합니다.
예상 결과:
| asset_type | count |
|---|---|
| serviceusage.googleapis.com/Service | 52 |
| logging.googleapis.com/LogBucket | 8 |
| logging.googleapis.com/LogSink | 8 |
| iam.googleapis.com/ServiceAccountKey | 3 |
| cloudresourcemanager.googleapis.com/Project | 2 |
결과 해석: 자원 유형별 건수입니다. serviceusage.googleapis.com/Service는 프로젝트마다 사용 설정된 API입니다. 특정 유형만 보려면 types 옵션을 지정합니다.
예시: 서비스 계정과 키 목록
상황: 조직 안의 서비스 계정과 서비스 계정 키를 프로젝트별로 확인합니다.
gcp-assets profile=gcp scope=organizations/123456789012 types="iam.googleapis.com/.*"
| fields project_id, asset_type, display_name, name, create_time
예상 결과:
| project_id | asset_type | display_name | name | create_time |
|---|---|---|---|---|
| my-project-123456 | iam.googleapis.com/ServiceAccount | logpresso | //iam.googleapis.com/projects/my-project-123456/serviceAccounts/... | |
| my-project-123456 | iam.googleapis.com/ServiceAccountKey | projects/my-project-123456/serviceAccounts/.../keys/... | //iam.googleapis.com/projects/my-project-123456/serviceAccounts/.../keys/... | 2026-10-19 14:02:13+0900 |
결과 해석: 사용하지 않는 서비스 계정이나 오래된 키가 있는지 점검합니다.
예시: 태그가 적용된 자원
상황: 특정 태그가 직접 연결되거나 상속된 자원을 찾습니다.
gcp-assets profile=gcp scope=organizations/123456789012 query="effectiveTagKeys:\"앱개발팀\""
| stats count by project_id, asset_type
결과 해석: 태그를 연결한 프로젝트와 그 아래 자원이 모두 나옵니다. 직접 연결된 자원만 찾으려면 tagKeys:를 사용합니다.
예시: 하위 폴더를 포함한 조직 전체 프로젝트
상황: gcp-projects의 scope는 바로 아래 프로젝트만 조회하므로, 하위 폴더 안까지 포함한 조직 전체 프로젝트는 이 명령어로 조회합니다.
gcp-assets profile=gcp scope=organizations/123456789012 types="cloudresourcemanager.googleapis.com/Project"
| fields project_id, display_name, folders, state, create_time
결과 해석: 프로젝트마다 소속 폴더 번호(folders)와 상태가 나옵니다.