2 votes

Comment attendre AWS assumeRole puis continuer avec la définition du module

Je suis en train de créer un module qui exporte quelques fonctions et variables mais avant qu'il puisse le faire, il doit d'abord changer de rôles d'utilisateur. Voici le code que j'ai essayé. Je voudrais que la fonction asynchrone anonyme se produise en premier et que tout ce qui suit attende que celle-ci se termine, sinon les autres requêtes n'auront pas les autorisations pour se terminer.

Comme c'est actuellement, je reçois une erreur d'accès refusé car listQueues est appelé avant que assumeRole ne se termine.

const AWS = require('aws-sdk');

AWS.config.update({region: 'eu-west-1'});
var sts = new AWS.STS();
var sqs;

(async () => {
  let role_promise = await sts.assumeRole({
    RoleArn: 'arn:aws:iam::xxxx:role/UserRole',
    RoleSessionName: 'NodeDeveloperRoleSession'
  }).promise().then(data => {
    console.log('Rôle assumé avec succès :)');
    AWS.config.update({
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    });
    sqs = new AWS.SQS({apiVersion: '2012-11-05'});
  }).catch(err => {
    console.log('Impossible d'assumer le rôle :(');
    console.log(err, err.stack);
  })
})();

async function list_queues() {
  let result = await sqs.listQueues({}).promise();
  return result.QueueUrls;
}

const result = list_queues();
exports.queues;

Toute aide est appréciée !

4voto

Atul Kumar Points 329

Il y a quelques erreurs que vous commettez en assumant le rôle et en utilisant ces informations d'identification pour accéder à d'autres ressources.

const AWS = require('aws-sdk');

AWS.config.update({region: 'eu-west-1'});
var sts = new AWS.STS();
var sqs;

(async () => {
  let role_promise = await sts.assumeRole({
    RoleArn: 'arn:aws:iam::xxxx:role/UserRole',
    RoleSessionName: 'NodeDeveloperRoleSession'
  }).promise().then(data => {
    console.log('Rôle assumé avec succès :)');

    /* ici vous utilisez AWS globalement pour utiliser votre rôle d'assumé, 
       cela rendra les appels ultérieurs sujets aux erreurs, cela peut ou non fonctionner
       en fonction de la façon dont vous effectuez l'appel 
   */

    AWS.config.update({
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    });

    sqs = new AWS.SQS({apiVersion: '2012-11-05'});

  }).catch(err => {
    console.log('Impossible d'assumer le rôle :(');
    console.log(err, err.stack);
  })
})();

async function list_queues() {
  let result = await sqs.listQueues({}).promise();
  return result.QueueUrls;
}

const result = list_queues();
exports.queues;

Voici ce que je pense être une meilleure méthode pour assumer un rôle et utiliser les ressources que vous souhaitez :

const AWS = require('aws-sdk');

AWS.config.update({region: 'eu-west-1'});
var sts = new AWS.STS();
var sqs;

(async () => {
  let role_promise = await sts.assumeRole({
    RoleArn: 'arn:aws:iam::xxxx:role/UserRole',
    RoleSessionName: 'NodeDeveloperRoleSession'
  }).promise().then(data => {
    console.log('Rôle assumé avec succès :)');

    /* 
      Il utilisera vos informations d'identification AWS assumées et ne les définira pas globalement,
      Ce qui signifie que vous pouvez accéder aux ressources de plusieurs comptes dans la même fonction 
      de cette manière.
   */
    var creds = new AWS.Credentials({
        accessKeyId: data.Credentials.AccessKeyId,
        secretAccessKey: data.Credentials.SecretAccessKey,
        sessionToken: data.Credentials.SessionToken
    });

    /* maintenant utilisez creds pour créer un objet des ressources auxquelles vous souhaitez accéder depuis 
       ce compte */
   // De plus, dans ce cas, l'utilisation d'un point de terminaison est conseillée
   // Je l'ai défini sur us-east-2, vous pouvez utiliser n'importe quel point de terminaison où se trouve votre service
    sqs = new AWS.SQS({apiVersion: '2012-11-05', credentials:  creds, endpoint: 'sqs.us-east-2.amazonaws.com'});

  }).catch(err => {
    console.log('Impossible d'assumer le rôle :(');
    console.log(err, err.stack);
  })
})();

async function list_queues() {
  let result = await sqs.listQueues({}).promise();
  return result.QueueUrls;
}

const result = list_queues();
exports.queues;

Lire la documentation ci-dessous pour plus de cas d'utilisation

Plus sur les informations d'identification
Régions et points de terminaison AWS

0voto

Leon li Points 2431

Ceci est un problème de synchronisation asynchrone typique en js. Vous appelez un IIFE, qui est votre (async () => {...})(); d'abord, puis le list_queues() dans la pile d'appels se produira en premier car l'appel sts.assumeRole(...) est asynchrone. Une autre chose est que vous utilisez déjà async/await, alors vous n'avez pas besoin d'utiliser .then(), utilisez simplement await directement pour éviter les rappels imbriqués.

Bonne façon:

const AWS = require('aws-sdk');

AWS.config.update({ region: 'eu-west-1' });
const sts = new AWS.STS();
let queues;

(async () => {
  try {
    const data = await sts.assumeRole({
      RoleArn: 'arn:aws:iam::xxxx:role/UserRole',
      RoleSessionName: 'NodeDeveloperRoleSession'
    }).promise();
    console.log('Rôle assumé avec succès :)');
    AWS.config.update({  // ou vous pouvez initialiser votre SQS avec ces informations d'identification
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    });
    const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });
    const result = await sqs.listQueues({}).promise();
    queues = result.QueueUrls;
  } catch (err) {
    console.log('Impossible d'assumer le rôle :(');
    console.log(err, err.stack);
  }
})();

exports = queues;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X