Javascript 如何等待AWS假定角色,然后进行模块定义
我正在尝试创建一个模块来导出一些函数和变量,但在它可以执行任何操作之前,它必须切换用户角色。这是我试过的代码。我希望匿名异步函数首先发生,之后的所有操作都将等待完成,否则其他请求将没有完成的权限 现在,我收到一个拒绝访问错误,因为在assumeRole完成之前调用了listQueuesJavascript 如何等待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
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; } }; 导出=队列;
错误是什么?