本文详解如何在 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 资源类型字符串,例如:
以下为修复后的完整示例代码:
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=requ
est)
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")⚠️ 关键注意事项:
? 小技巧:可通过 gcloud asset search-all-resources --asset-types=compute.googleapis.com/Instance --scope=projects/my-project 命令行快速验证类型是否有效,避免反复调试代码。
总结:GCP Asset API 的 asset_types 不支持通配符,务必使用官方文档中列出的完整资源类型 URI,并以字符串列表形式传入。掌握这一规范,即可稳定、高效地实现跨资源类型的批量发现与合规审计。