NodeJS:aws-sdk sts.assumeRole无法正常工作

沙彦汗

我有一个奇怪的问题,我似乎无处可去。我已经在线上关注了所有内容(有多个教程等),但是无法使sts.assumeRole正常工作。

我的设置:

  • AWS主账户(用于计费,IAM等)
  • 次级AWS账户1(用于客户1)
  • 次级AWS账户2(用于客户2)
  • 等等

我有一个机器人在Sub AWS账户1运行,我需要从Main AWS账户获取价格信息

因此,我在主AWS账户上创建了一个角色,以具有以下AWS ce:*访问权限:

{
    "Version": "2012-10-17",
    "Statement": [{
            "Effect": "Allow",
            "Action": ["ce:*"],
            "Resource": ["*"]
        }]
}

信任关系

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com",
        "AWS": "arn:aws:iam::SubAWSaccount1-ID:role/instance-profile"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

现在,这是附加到在Sub AWS帐户1上运行的EC2实例实例配置文件

"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::mainAWSaccount-ID:role/botRole"
    }
  ]
}

信任关系

{
  "Version": "2012-10-17",
  "Statement": [
   {
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
      "Service": "ec2.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
   }
  ]
}

好的,顺便说一下,这是不起作用的代码:

var AWS = require('aws-sdk');
var pricingAWS = new AWS.CostExplorer();

var getPricing = function(){

    var costParams = {
        TimePeriod: { Start: "2019-12-01 ", End: "2020-01-01"},
        Granularity: 'MONTHLY',
        Metrics: ['BlendedCost'],
        Filter: {      
            Dimensions: {
                Key: "LINKED_ACCOUNT",
                Values: ["Sub AWS account 2s ID"] //Main AWS account has access to many sub accounts info. So bot in running on Sub account 1, I need info from Sub account 1, 2, 3 etc and Role is on Main account
            }
        }
    };

    var roleToAssume = {
        RoleArn: 'arn:aws:iam::mainAWSaccount-ID:role/botRole',
        RoleSessionName: 'testTestTest',
        DurationSeconds: 900
    };

    var roleCreds = {};

    sts.assumeRole(roleToAssume, function(err, data) {
        if (err) {
            console.log(err);
        } else {
            roleCreds = {
                accessKeyId: data.Credentials.AccessKeyId,
                secretAccessKey: data.Credentials.SecretAccessKey,
                sessionToken: data.Credentials.SessionToken
            };

            pricingAWS.config.update({
                accessKeyId: roleCreds.AccessKeyId,
                secretAccessKey: roleCreds.SecretAccessKey,
                sessionToken: roleCreds.SessionToken
              });
        }
    });

    pricingAWS.getCostAndUsage(costParams, function (err, data) {
        if (err) {
            reject(err);
        }else{
            resolve(data);
        }
    });
};

getPricing();

我从console.log(err)得到的是:

User: arn:aws:sts::SubAWSAccount-1:assumed-role/slack-instance-profile/instanceID is not authorized to perform: ce:GetCostAndUsage on resource: arn:aws:ce:us-east-1:SubAWSAccount-1:/GetCostAndUsage'
阿伦·K

为了确认我的理解,您正在尝试从另一个帐户的ec2实例在一个帐户中扮演角色。

  1. child帐户中创建IAM角色
  2. main通过附加IAM策略,允许上述新创建的角色假定该角色存在于帐户中。通过主要角色的信任策略允许子角色承担主要角色(您已经在执行此操作)
  3. 在子ec2实例中运行的Nodejs代码中,担任父角色并阅读帐单报告(您已经在执行此操作)

代码修复

pricingAWS.getCostAndUsage()移入承担角色回调。因为该行是在更新凭据之前调用的:)。您还可以将所有内容更改为异步/等待,如下所示。

import AWS = require('aws-sdk');
var pricingAWS = new AWS.CostExplorer();
const sts = new AWS.STS()

var getPricing = async function () {

  var costParams = {
    TimePeriod: { Start: "2019-12-01 ", End: "2020-01-01" },
    Granularity: 'MONTHLY',
    Metrics: ['BlendedCost'],
    Filter: {
      Dimensions: {
        Key: "LINKED_ACCOUNT",
        Values: ["Sub AWS account 2s ID"] //Main AWS account has access to many sub accounts info. So bot in running on Sub account 1, I need info from Sub account 1, 2, 3 etc and Role is on Main account
      }
    }
  };

  var roleToAssume = {
    RoleArn: 'arn:aws:iam::mainAWSaccount-ID:role/botRole',
    RoleSessionName: 'testTestTest',
    DurationSeconds: 900
  };

  var roleCreds = {};


  try {

    const data = await sts.assumeRole(roleToAssume).promise();
    const roleCreds = {
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    };

    pricingAWS.config.update({
      accessKeyId: roleCreds.accessKeyId,
      secretAccessKey: roleCreds.secretAccessKey,
      sessionToken: roleCreds.sessionToken
    });

    const costAndUsage = await pricingAWS.getCostAndUsage(costParams).promise()
    return costAndUsage
  } catch (err) {
    console.log('error: ', err);
    throw err;
  }

};

getPricing();

希望这可以帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用于nodejs的简单aws-sdk无法正常工作

来自分类Dev

使用STS凭证上传aws-sdk-403错误

来自分类Dev

AWS STS AssumeRole:是否需要IAM用户凭证?

来自分类Dev

AWS STS AssumeRole:是否需要IAM用户凭证?

来自分类Dev

将代码从gatsby迁移到nextjs,现在aws-sdk无法正常工作

来自分类Dev

AWS Amplify-CognitoIdentityCredentials未经授权执行:资源上的sts:AssumeRole

来自分类Dev

AssumeRole-AWS iOS SDK示例

来自分类Dev

我的STS无法运行

来自分类Dev

无法打开 STS IDE

来自分类Dev

Android-Syncano SDK无法正常工作

来自分类Dev

无法使Rdio iOS SDK回放正常工作

来自分类Dev

无法使SurveyMonkey Mobile SDK正常工作

来自分类Dev

NodeJS的decodeURIComponent无法正常工作

来自分类Dev

NodeJS Multer无法正常工作

来自分类Dev

NodeJS Mongoose 无法正常工作

来自分类Dev

AWS Iam命令,在终端中正常工作,在Laravel / PHP AWS SDK中不工作

来自分类Dev

用于 RDS nodejs 的 aws-sdk

来自分类Dev

NodeJS:aws-sdk 的模拟承诺

来自分类Dev

EKS无法使用Kubectl向Kubernetes进行身份验证-“用户:无权执行:sts:AssumeRole”

来自分类Dev

无法从 sts 连接到 mysql

来自分类Dev

Corona SDK-display.newImageRect无法正常工作

来自分类Dev

适用于.NET的Facebook SDK-无法正常工作

来自分类Dev

带有市场的Admin-SDK无法正常工作

来自分类Dev

使用Affectiva SDK构建Unity项目后无法正常工作

来自分类Dev

Android Facebook SDK V4.0无法正常工作

来自分类Dev

Facebook SDK 4.0 LoginButton-setReadPermissions无法正常工作吗?

来自分类Dev

Android Studio SDK JUnit测试无法正常工作

来自分类Dev

Corona SDK facebook.logout()无法正常工作

来自分类Dev

AddLive SDK iOS示例应用程序无法正常工作

Related 相关文章

热门标签

归档