
本文详解如何在 python 中正确调用 gcp asset inventory api 查询 compute engine 实例,解决常见的 `400 no supported asset type matches` 错误,重点说明 `asset_types` 参数的合法格式与最佳实践。
Google Cloud Asset Inventory 的 search_all_resources 方法支持按资源类型(asset_types)进行过滤,但不支持通配符语法(如 "compute.*")*——这正是你遇到 400 No supported asset type matches 错误的根本原因。虽然 REST API 文档或 Insomnia 等工具中 `"compute."可能看似生效(实为服务端宽松解析或客户端自动展开),但在 Python 客户端库(google-cloud-asset==v1)中,asset_types` 字段要求传入精确、完整、标准化的资源类型 URI**,且必须是 官方支持的可搜索资产类型 中明确列出的值。
✅ 正确做法是:使用完整的 Google API 资源类型字符串,例如:
- compute.googleapis.com/Instance(对应虚拟机实例)
- compute.googleapis.com/Disk(对应持久化磁盘)
- compute.googleapis.com/Network(对应 VPC 网络)
以下为修复后的完整示例代码:
from google.cloud import asset_v1
def search_compute_instances(project_id: str):
client = asset_v1.AssetServiceClient()
request = asset_v1.SearchAllResourcesRequest(
scope=f"projects/{project_id}",
read_mask="displayName,assetType,name,location,resource.data", # 可按需扩展字段
asset_types=["compute.googleapis.com/Instance"], # ✅ 必须是字符串列表,且为完整类型名
# 注意:asset_types 是 list[str] 类型,不是单个字符串
)
page_result = client.search_all_resources(request=request)
for resource in page_result:
print(f"Instance: {resource.display_name}")
print(f" Type: {resource.asset_type}")
print(f" Name: {resource.name}")
print(f" Location: {resource.location}")
print("---")
# 使用示例(替换为你的实际项目 ID)
search_compute_instances("my-gcp-project-123456")⚠️ 关键注意事项:
- asset_types 参数类型为 List[str](Python 列表),不可传入字符串 "compute.googleapis.com/Instance",否则会触发类型错误;必须写成 ["compute.googleapis.com/Instance"]。
- 若需查询多个类型(如实例 + 磁盘),可传入 ["compute.googleapis.com/Instance", "compute.googleapis.com/Disk"]。
- read_mask 控制返回字段,建议显式指定所需字段以提升性能和可读性;若留空,则默认返回全部可读字段(可能含大量冗余数据)。
- 确保服务账号已授予 cloudasset.assets.searchAllResources 权限(通常由 roles/cloudasset.viewer 或更细粒度角色提供)。
- 首次启用 Asset API 后,需等待数分钟至数小时,系统才会完成历史资源快照的初始导出;若立即查询无结果,请确认资源是否已在资产库存中可用。
? 小技巧:可通过 gcloud asset search-all-resources --asset-types=compute.googleapis.com/Instance --scope=projects/my-project 命令行快速验证类型是否有效,避免反复调试代码。
总结:GCP Asset API 的 asset_types 不支持通配符,务必使用官方文档中列出的完整资源类型 URI,并以字符串列表形式传入。掌握这一规范,即可稳定、高效地实现跨资源类型的批量发现与合规审计。









