Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等待AWS假定角色,然后进行模块定义_Javascript_Node.js_Aws Sdk - Fatal编程技术网

Javascript 如何等待AWS假定角色,然后进行模块定义

Javascript 如何等待AWS假定角色,然后进行模块定义,javascript,node.js,aws-sdk,Javascript,Node.js,Aws Sdk,我正在尝试创建一个模块来导出一些函数和变量,但在它可以执行任何操作之前,它必须切换用户角色。这是我试过的代码。我希望匿名异步函数首先发生,之后的所有操作都将等待完成,否则其他请求将没有完成的权限 现在,我收到一个拒绝访问错误,因为在assumeRole完成之前调用了listQueues const AWS = require('aws-sdk'); AWS.config.update({region: 'eu-west-1'}); var sts = new AWS.STS(); var sq

我正在尝试创建一个模块来导出一些函数和变量,但在它可以执行任何操作之前,它必须切换用户角色。这是我试过的代码。我希望匿名异步函数首先发生,之后的所有操作都将等待完成,否则其他请求将没有完成的权限

现在,我收到一个拒绝访问错误,因为在assumeRole完成之前调用了listQueues

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('Assumed role success :)');
    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('Cannot assume role :(');
    console.log(err, err.stack);
  })
})();

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

const result = list_queues();
exports.queues;

感谢您的帮助

在担任该角色并使用该凭据访问其他资源时,您会犯一些错误

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('Assumed role success :)');

    /* here you are making AWS globally to use your assume role, 
       this will make subsequent call error prone, may or may not work
       depending on how you are making call 
   */

    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('Cannot assume role :(');
    console.log(err, err.stack);
  })
})();

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

const result = list_queues();
exports.queues;
我认为这是一种更好的方式来承担角色并使用您想要的任何资源:

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('Assumed role success :)');

    /* 
      It will use your AWS assume role credential and will not set it globally,
      Which means you can access resources of multiple account in same function 
      likewise.
   */
    var creds = new AWS.Credentials({
        accessKeyId: data.Credentials.AccessKeyId,
        secretAccessKey: data.Credentials.SecretAccessKey,
        sessionToken: data.Credentials.SessionToken
    });

    /* now use creds to create object of the resources that you want to access from 
       that account */
   // Also, in this case using endpoint is advisable
   // I have set it to us-east-2, you can use any endpoint where your service is
    sqs = new AWS.SQS({apiVersion: '2012-11-05', credentials:  creds, endpoint: 'sqs.us-east-2.amazonaws.com'});

  }).catch(err => {
    console.log('Cannot assume role :(');
    console.log(err, err.stack);
  })
})();

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

const result = list_queues();
exports.queues;
阅读下面的文档了解更多用例


这是一个典型的js asycn定时问题。你调用一个IIFE,它是你的async=>{…};首先,调用堆栈中的列表队列将首先出现,因为sts.assumeRole。。。调用是异步的。另一件事是,既然您已经使用了async/await,那么就不必使用。然后,直接使用await可以避免neste回调

正确的方法:

const AWS=需要“AWS-sdk”; AWS.config.update{region:'eu-west-1'}; 常数sts=新的AWS.sts; 让排队; 异步=>{ 试一试{ 常量数据=等待sts.assumeRole{ RoleArn:'arn:aws:iam::xxxx:role/UserRole', RoleSessionName:“NodeDeveloperRoleSession” }.承诺; 日志“假定角色成功:”; AWS.config.update{//或者您可以使用此凭据初始化SQS accessKeyId:data.Credentials.accessKeyId, secretAccessKey:data.Credentials.secretAccessKey, sessionToken:data.Credentials.sessionToken }; const sqs=新AWS.sqs{apiVersion:'2012-11-05'}; const result=wait sqs.listQueues{}.promise; queues=result.queueurl; }犯错误{ console.log“不能承担角色:”; console.logerr,err.stack; } }; 导出=队列;
错误是什么?