es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)}},
})


"response:" : "error: {code:7 message:\"Permiso denegado.\"}"
```

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?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, parece que estás cometiendo un error al usar ClientOption - withCredentialsFile para tu solicitud vision.NewImageAnnotatorClient.

    Cuando pasas la ruta del archivo cfg.CredsPathtoProjectB al método option.WithCredentialsFile, está utilizando las credenciales de la cuenta de servicio del proyectoB. Pero ProductSearchAPI 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 solicitud vision.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 o roles/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.

Comments are closed.