GCP Go SDK按lastStartTimestamp筛选实例报400错误如何解决
问题解决方案
根因说明
- 你使用服务端直接过滤
lastStartTimestamp的方式不可行,GCP Compute Engine的实例查询接口仅对有限字段支持</>这类范围比较操作,lastStartTimestamp仅支持等值匹配,不支持范围查询,不管怎么调整过滤字符串的引号、日期格式都会返回400参数错误。 - 你的Go SDK调用逻辑本身没有语法问题,错误完全来自服务端过滤规则的限制。
可行实现方案
你需要先全量拉取实例数据,再在本地对lastStartTimestamp字段做过滤,调整后的参考代码如下:
import ( compute "cloud.google.com/go/compute/apiv1" "context" "fmt" "google.golang.org/api/iterator" _ "google.golang.org/api/option" protobuf "google.golang.org/genproto/googleapis/cloud/compute/v1" "time" ) func List(ctx context.Context, project string) error { // 定义要比较的目标时间 targetTime, err := time.Parse(time.RFC3339, "2021-09-10T00:00:00.000-07:00") if err != nil { return err } req := &protobuf.AggregatedListInstancesRequest{ Project: project, } it := c.client.AggregatedList(ctx, req) for { resp, err := it.Next() if err == iterator.Done { break } if err != nil { return err } for _, instance := range resp.Value.Instances { // 跳过从未启动、无启动时间的实例 if instance.GetLastStartTimestamp() == "" { continue } // 解析实例启动时间做本地比较 instanceStartTime, err := time.Parse(time.RFC3339, instance.GetLastStartTimestamp()) if err != nil { continue } if instanceStartTime.Before(targetTime) { fmt.Println(instance.GetName(), instance.GetLastStartTimestamp()) } } } return nil }
如果你的项目下实例数量非常大,可以先搭配其他支持服务端过滤的字段(比如区域、实例状态)做第一轮筛选,减少本地处理的数据量。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

