Est-il possible d'appeler l'API Google PubSub Rest à l'aide du compte de service Google?
J'ai une exigence très spécifique pour publier des messages sur pub sub en utilisant l'API reste, faites-moi savoir s'il y a un moyen de le faire?
S'il existe un moyen d'obtenir la clé Api ou le jeton requis pour l'API de repos en utilisant le compte de service qui aide également.
3 Réponses :
Si vous souhaitez utiliser l'API directement, sans la bibliothèque cliente, vous pouvez faire comme ceci
Premièrement, récupérez le access_token
puis ajoutez-le dans l'en-tête de votre requête p >
//Set manually the environment variables process.env.GOOGLE_APPLICATION_CREDENTIALS='path/to/key.json' const auth = new GoogleAuth() //Use default credentials
MODIFIER
Je suis malheureusement trop mauvais dans Nodejs pour obtenir un code propre pour cela. Vous pouvez accéder à la page de documentation et vous pouvez voir qu'il existe des options de constructeur pour GoogleAuth
classe
À la fin, quelque chose comme ça devrait fonctionner (mais je n'ai pas réussi ça ... dommage ...)
const auth = new GoogleAuth({ scopes: '', keyFile: 'path/to/key.json' })
Merci pourriez-vous s'il vous plaît me diriger vers un exemple où je peux y parvenir en passant la clé privée de messagerie du client au moment de l'exécution plutôt qu'en l'utilisant à partir des valeurs par défaut de l'application.
Comment un compte de service avec le rôle de sous-éditeur de pub peut-il également obtenir le même résultat?
J'ai édité avec du code sale car je ne suis pas un développeur de nœuds! J'espère que cette aide, et vous ferez quelque chose de mieux que ma solution de contournement!
Pour utiliser pub sub, vous devez créer un compte de service IAM et activer le service pubsub dans google cloud console. Utilisez la fonction suivante pour publier et vous abonner.
Publier:
const pubsub = new PubSub(); const subscriptionName = 'your-subscription-name'; const timeout = 6000; const subscription = pubsub.subscription(subscriptionName); let messageCount = 0; const messageHandler = (message) => { console.log(`Received message ${message.id}:`); console.log(`Data: ${message.data}`); console.log(`tAttributes: ${JSON.stringify(message.attributes)}`); messageCount += 1; // Ack the messae message.ack(); }; // Listen for new messages until timeout is hit subscription.on(`message`, messageHandler); setTimeout(() => { subscription.removeListener('message', messageHandler); console.log(`${messageCount} message(s) received.`); }, timeout * 1000);
S'abonner:
const pubsub = new PubSub() const data = 'this is data : ' + new Date().toString(); const dataBuffer = Buffer.from(data); const topicName = 'ypur-topic-name'; pubsub .topic(topicName) .publisher() .publish(dataBuffer) .then((messageId) => { console.log(`Message ${messageId} published.`); return res.status(200).json({ success: true }); }) .catch((err) => { console.error('ERROR:', err); });
Vous pouvez vous référer à ce tutoriel pour un flux complet: https://blog.cloudboost.io/google-pubsub- tutoriel-74dd5b948700
Voici un exemple d'appel restApi depuis la fonction AWS Lambda vers GCP pub / sub. J'ai essayé de trouver un moyen de transmettre le fichier service_account.json à la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS sur ma fonction lambda, mais je n'ai malheureusement pas pu le trouver, alors j'ai décidé de passer à la version API au lieu de la version SDK. J'extrais donc l'e-mail du client et la clé privée de service_account.json (je l'ai ajouté sur le gestionnaire de secrets AWS et je le récupère à partir de là)
const { JWT } = require("google-auth-library"); const topicName = "test-topic"; const client = new JWT({ email: process.env.GCP_CLIENT_EMAIL, key: process.env.GCP_PRIVATE_KEY, scopes: ["https://www.googleapis.com/auth/cloud-platform"], }); module.exports.publisher = async (event) => { console.log(event.body); const dataBuffer = Buffer.from(event.body).toString('base64'); const url = `https://pubsub.googleapis.com/v1/${topicName}:publish`; const options = { url: url, method: 'POST', data: { messages: [ { data: dataBuffer } ] } } const res = await client.request(options); console.log(res.data); return res.data; };
Cela ne fonctionnera pas avec la clé API. Mais oui, il est possible d'obtenir un jeton d'accès avec un compte de service. Quelle langue parles-tu?
guillaume blaquiere c'est Node.js