Go客户端调用Google Dataflow模板报无效区域终端点如何解决
问题原因
Google Cloud Go版Dataflow客户端默认连接全局服务端点,仅能处理归属于全局端点的请求,即使请求体中填写了Location字段,也会因为客户端连接的终端点不匹配触发无效区域报错。
解决方案
创建Dataflow客户端时显式指定对应区域的服务端点即可,步骤如下:
- 导入依赖的option包
import "google.golang.org/api/option"
- 初始化客户端时传入区域端点参数
区域端点的固定格式为:{region}-dataflow.googleapis.com:443,将{region}替换为你实际使用的区域即可,本次问题中使用的asia-northeast1区域对应端点为asia-northeast1-dataflow.googleapis.com:443。
修改后的核心代码如下:
func KickDataflow(ctx context.Context, start, end string) error { // 初始化客户端时指定对应区域的端点 client, err := dataflow.NewTemplatesClient(ctx, option.WithEndpoint("asia-northeast1-dataflow.googleapis.com:443"), ) if err != nil { return err } defer client.Close() // 剩余请求代码无需调整,原有的Location字段保留即可 req := &dataflowpb.CreateJobFromTemplateRequest{ ProjectId: "xxx", JobName: fmt.Sprintf("transform-orders_%s", start), Template: &dataflowpb.CreateJobFromTemplateRequest_GcsPath{ GcsPath: gcsPath, }, Parameters: map[string]string{ "input": fmt.Sprintf("gs://xxx/order_updates/dt=%s/orders_%s_%s.jsonl", start, start, end), }, Environment: &dataflowpb.RuntimeEnvironment{ NumWorkers: int32(1), MaxWorkers: int32(3), WorkerZone: "asia-northeast1-b", TempLocation: tempLocation, ServiceAccountEmail: os.Getenv("SERVICE_ACCOUNT"), }, Location: "asia-northeast1", } _, err = client.CreateJobFromTemplate(ctx, req) if err != nil { return err } return nil }
内容的提问来源于stack exchange,提问作者Yu Tomori
相关产品推荐
相关产品推荐

