0
votes

Comment utiliser l'API PubSub Rest avec les comptes de service Google?

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.


2 commentaires

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


3 Réponses :


1
votes

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


3 commentaires

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!



0
votes

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


0 commentaires

0
votes

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;
  };


0 commentaires