Estoy tratando de conectarme para obtener un secreto del administrador de secretos de Google y el mismo código funciona para Cloud Functions, pero no para App Engine.
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
const secretManagerServiceClient = new SecretManagerServiceClient(); const name = 'projects/000000000000/secrets/database/versions/latest'; exports.testSecretManager = async (req, res) => { const [version] = await secretManagerServiceClient.accessSecretVersion({ name }); const payload = version.payload.data.toString(); console.debug(`Payload: ${payload}`); res.sendStatus(200); };El mismo código funciona bien cuando lo implemento como una función.
Pero cuando ejecuto el mismo código como parte de la aplicación App Engine. Falla con este error:
Error: 16 UNAUTHENTICATED: Failed to retrieve auth metadata with error: Could not refresh access token: Unsuccessful response status code. Request failed with status code 500 at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26) at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:180:52) at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:365:141) at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:328:181) at /workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:182:78 at processTicksAndRejections (node:internal/process/task_queues:78:11)Creo que tanto Cloud Functions como App Engine están administrados por la misma cuenta de servicio "Cuenta de servicio predeterminada de App Engine". Y tiene derechos.
Parece que GOOGLE_APPLICATION_CREDENTIALS no se encuentra en el entorno.
console.log(process.env.GOOGLE_APPLICATION_CREDENTIALS); me da indefinido. ¿Puede ser esto una razón? Entonces, ¿cómo paso este entorno al motor de la aplicación?
¿Cómo puedo depurar esto más profundamente?
Asegúrese de que la función Secret Manager Secret Accessor se otorgue a la cuenta de servicio de IAM para App Engine. El rol exacto que necesitaría agregar es: roles/secretmanager.secretAccessor. Puede consultar aquí para obtener más detalles.
Además, eche un vistazo a este caso de Stackoverflow .
Encuentre aquí una respuesta bellamente escrita.
Y también la documentación oficial de Google que no incluye a GAE como un producto compatible directamente; sin embargo, GCE/GKE son compatibles de fábrica, si esa es una opción para usted.