GCloud Vision API’s NewImageAnnotatorClient lanzando “Permission Denied” usando la opción WithCredentialsFile.
Tengo dos proyectos de GCP, projectA para recursos de Kubernetes y projectB para product-search-api y la base de datos Spanner. Creé una cuenta de servicio en projectB con los permisos necesarios y monté su credentials.json
en el servicio de projectA como variable de entorno GOOGLE_APPLICATION_CREDENTIALS
y funciona bien.
Pero debido a esto, hay algunos problemas de permisos para el servicio que utiliza funciones en projectA, por ejemplo, el monitoreo de stackdriver, etc. Podría otorgar estos permisos a la cuenta de servicio que creé, pero luego encontré una ClientOption - withCredentialsFile
.
Tenía planeado usar esta opción sin modificar la variable de entorno GOOGLE_APPLICATION_CREDENTIALS
en el servicio, es decir, seguir usando las credenciales de projectA. Entonces, lo pasé al cliente de Spanner de la siguiente manera y funciona bien:
client, err := spanner.NewClientWithConfig(contexto, dbn, spanner.ClientConfig{
SessionPoolConfig: spanner.SessionPoolConfig{
MaxIdle: 100,
},
}, option.WithCredentialsFile(cfg.CredsPathtoProjectB))
Pero cuando lo paso a vision.NewImageAnnotatorClient
para hacer una solicitud a ProductSearchAPI, obtengo Permiso denegado
.
c, err := vision.NewImageAnnotatorClient(contexto, 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(contexto, &pb.AnnotateImageRequest{
Image: img,
ImageContext: ictx,
Features: []*pb.Feature{{Type: visionpb.Feature<em>PRODUCT</em>SEARCH,
MaxResults: int32(maxItems)}},
})
Podría usar las mismas credenciales para solicitar la API de búsqueda de productos cuando sobrescriba GOOGLE_APPLICATION_CREDENTIALS
. ¿Estoy cometiendo algún error?
davy.ai
Sí, parece que estás cometiendo un error al usar
ClientOption - withCredentialsFile
para tu solicitudvision.NewImageAnnotatorClient
.Cuando pasas la ruta del archivo
cfg.CredsPathtoProjectB
al métodooption.WithCredentialsFile
, está utilizando las credenciales de la cuenta de servicio del proyectoB. PeroProductSearchAPI
y las bases de datos de Spanner están en el proyectoB y el proyectoA respectivamente, por lo que requieren diferentes cuentas de servicio para acceder a sus recursos.Una solución a este problema podría ser crear una nueva cuenta de servicio en el proyectoA con los permisos necesarios para el monitoreo de stackdriver y pasar sus credenciales a tu cliente de Spanner usando
option.WithCredentialsFile
. De manera similar, puedes crear otra cuenta de servicio en el proyectoB con los permisos necesarios para ProductSearchAPI y pasar sus credenciales a tu solicitudvision.NewImageAnnotatorClient
.Alternativamente, puedes seguir utilizando las credenciales de la cuenta de servicio del proyectoA y otorgar los permisos necesarios a esta cuenta de servicio para acceder a ProductSearchAPI. Para hacerlo, puedes agregar los roles necesarios (por ejemplo,
roles/viewer
oroles/editor
) a la cuenta de servicio del proyectoA. También puedes definir roles personalizados que proporcionen acceso granular a recursos específicos.En general, la idea principal es que cada proyecto de GCP requiere su propia cuenta de servicio con acceso a sus recursos, y debes utilizar las credenciales de la cuenta de servicio adecuada para cada solicitud de API.