You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gcloud脚本过滤器语法在CloudResourceManager SDK中不兼容问题问询

问题解答

错误原因

你遇到的报错是因为直接将gcloud的过滤器语法传给了GCP Resource Manager API,而gcloud会自动将简化的过滤器语法转换为API原生支持的格式,但C# SDK会直接把你传入的Filter字符串原封不动发给API,导致API无法识别。

从你提供的gcloud日志可以看到,gcloud自动做了两个关键转换:

  • 将parent.id=(<id1>, <id2>, <id3>)拆成了parent.id=<id1> OR parent.id=<id2> OR parent.id=<id3>
  • 将gcloud中隐含AND的空格写法(parent.type=folder parent.id=...)替换为显式的AND连接

而你的C#代码中使用的是gcloud的简化语法,这是API不支持的,所以抛出了contains global restriction错误。


核心疑问解答

1. 组合过滤器是否不受SDK支持?

不是组合过滤器不被支持,是你用错了语法。SDK完全支持复杂组合过滤器,但必须使用GCP Resource Manager API的原生filter语法,而非gcloud的简化语法。

修正后的正确Filter字符串应该是:

"lifecycleState:ACTIVE AND NOT ((parent.type=folder AND (parent.id=<id1> OR parent.id=<id2> OR parent.id=<id3>)) OR id=<id4>)"

2. 能否通过SDK发起REST调用弥补差异?

可以,但没必要绕到执行脚本——你可以直接构造符合API语法的Filter字符串,或者用SDK的HTTP客户端直接发送原生REST请求,就像gcloud那样。

直接构造正确Filter的C#示例:

var projectsListRequest = service.Projects.List();
// 生成符合API语法的过滤器:拆分集合为OR,显式用AND连接条件
projectsListRequest.Filter = "lifecycleState:ACTIVE AND NOT ((parent.type=folder AND (parent.id=48653349664 OR parent.id=855697431759 OR parent.id=962793046836)) OR id=521824619001)";
var projects = projectsListRequest.Execute();

用SDK发起原生REST请求的示例:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Http;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;

public async Task FetchProjectsViaRawRest()
{
    // 获取默认凭据并添加权限
    var credential = await GoogleCredential.GetApplicationDefaultAsync();
    var scopedCred = credential.CreateScoped("https://www.googleapis.com/auth/cloud-platform");

    // 创建带身份验证的HttpClient
    var httpClient = new HttpClient(new HttpClientFactory().CreateHttpClient(scopedCred));

    // 构造符合API语法的过滤器并编码
    var filter = "lifecycleState:ACTIVE AND NOT ((parent.type=folder AND (parent.id=48653349664 OR parent.id=855697431759 OR parent.id=962793046836)) OR id=521824619001)";
    var encodedFilter = HttpUtility.UrlEncode(filter);

    // 发起请求
    var response = await httpClient.GetAsync($"https://cloudresourcemanager.googleapis.com/v1/projects?alt=json&filter={encodedFilter}&pageSize=500");
    response.EnsureSuccessStatusCode();
    var projectJson = await response.Content.ReadAsStringAsync();

    // 后续解析JSON为项目对象即可
}

3. v2/3版本中List方法的Filter是否被弃用?

没有弃用。v2beta1和v3版本的Projects.ListRequest同样提供Filter属性,语法规则和v1完全一致,你可以直接升级到对应版本的SDK使用。


注意事项

当排除项多达5万个时,单个Filter字符串会超出API的长度限制,此时需要:

  • 将排除项分批拆分,发起多次查询
  • 或者结合GCP组织策略(Org Policy)提前限制需要排除的项目,再进行查询

内容的提问来源于stack exchange,提问作者Chemi Shumacher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:15:40