我有两个GCP项目,用于kubernetes资源的项目A和用于产品搜索api和扳手数据库的项目B。我在projectB中创建了一个具有所需权限的服务帐户,并将其credentials.json
作为GOOGLE_APPLICATION_CREDENTIALS
env var装载到projectA中的服务,它运行良好。
但正因为如此,使用项目a中的功能的服务还有一些其他权限问题,例如stackdriver监控等。我可以将这些权限授予我创建的服务帐户,但后来我找到了ClientOption - withCredentialsFile
。
我计划在不修改服务中的GOOGLE_APPLICATION_CREDENTIALS
env-var的情况下使用此选项,即继续使用projectA凭据。所以,我把它传递给扳手客户,如下所示,它运行良好
client, err := spanner.NewClientWithConfig(context, dbn, spanner.ClientConfig{
SessionPoolConfig: spanner.SessionPoolConfig{
MaxIdle: 100,
},
}, option.WithCredentialsFile(cfg.CredsPathtoProjectB))
但当我将它传递给vision.NewImageAnnotatorClient
以向ProductSearchAPI发出请求时,我得到了Permission Denied
。
c, err := vision.NewImageAnnotatorClient(context, option.WithCredentialsFile(cfg.CredsPathtoProjectB))
ictx := &pb.ImageContext{
ProductSearchParams: &pb.ProductSearchParams{
ProductSet: fmt.Sprintf("projects/%s/locations/%s/productSets/%s", cfg.ProjectID, cfg.ProjectLocation, cfg.ProductSetID),
ProductCategories: []string{cfg.ProductCategory},
Filter: filter,
},
}
response, err := c.AnnotateImage(ctx, &pb.AnnotateImageRequest{
Image: img,
ImageContext: ictx,
Features: []*pb.Feature{{Type: visionpb.Feature_PRODUCT_SEARCH,
MaxResults: int32(maxItems)}},
})
------------------------
<OUTPUT>
"response:":"error:{code:7 message:"Permission denied."}"
当覆盖GOOGLE_APPLICATION_CREDENTIALS
时,我可以使用相同的凭据请求产品搜索API。我犯了什么错误吗?
您不需要所有者对服务帐户的权限。但是,如果产品搜索资源在项目B中,那么您必须使用项目B中的服务帐户调用Vision API。