42

使用适用于 JavaScript 的 AWS 开发工具包,我想使用承担 a 角色的默认配置文件。这与 AWS CLI 完美配合。将 node.js 与 SDK 一起使用不会承担角色,而只会使用访问密钥所属的 AWS 账户的凭证。我找到了这个文档,但它不涉及承担角色:http ://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-shared.html

有小费吗?

这是我的配置文件:

[default]
role_arn = arn:aws:iam::123456789:role/Developer
source_profile = default
output = json
region = us-east-1
4

4 回答 4

64

在代码中使用多个跨账户角色的正确方法

使用 sts 获取跨账户角色的凭据,并在每次需要使用该特定跨账户角色进行身份验证的服务时使用这些凭据。

例子:

创建一个函数来获取跨帐户凭据,例如:

const AWS = require('aws-sdk');
const sts = new AWS.STS();

const getCrossAccountCredentials = async () => {
  return new Promise((resolve, reject) => {
    const timestamp = (new Date()).getTime();
    const params = {
      RoleArn: 'arn:aws:iam::123456789:role/Developer',
      RoleSessionName: `be-descriptibe-here-${timestamp}`
    };
    sts.assumeRole(params, (err, data) => {
      if (err) reject(err);
      else {
        resolve({
          accessKeyId: data.Credentials.AccessKeyId,
          secretAccessKey: data.Credentials.SecretAccessKey,
          sessionToken: data.Credentials.SessionToken,
        });
      }
    });
  });
}

然后你可以毫无问题地使用它,例如:

const main = async () => {
  // Get the Cross account credentials
  const accessparams = await getCrossAccountCredentials();
  // Get the ec2 service for current account
  const ec2 = new AWS.EC2();
  // Get the ec2 service for cross account role
  const ca_ec2 = new AWS.EC2(accessparams);
  // Get the autoscaling service for current account
  const autoscaling = new AWS.AutoScaling();
  // Get the autoscaling service for cross account role
  const ca_autoscaling = new AWS.AutoScaling(accessparams);

  // This will describe instances within the cross account role
  ca_ec2.describeInstances(...) 

  // This will describe instances within the original account
  ec2.describeInstances(...)

  // Here you can access both accounts without issues.
}

好处:

  • 不会全局更改凭证,因此您仍然可以针对您自己的 AWS 账户,而无需提前备份凭证来恢复它。
  • 允许准确控制您在每一刻定位的帐户。
  • 允许处理多个跨账户角色和服务。

错误的方式

不要AWS.config.update用于覆盖全局凭据AWS.config.credentials!!!!

覆盖全局凭据是一种不好的做法!这与@Brant 在此处批准的解决方案的情况相同,但这不是一个好的解决方案!原因如下:

const main = async () => {
  // Get the Cross account credentials
  const accessparams = await getCrossAccountCredentials();

  // Get the ec2 service for current account
  const ec2 = new AWS.EC2();

  // Overwrite the AWS credentials with cross account credentilas
  AWS.config.update(accessparams);

  // Get the ec2 service for cross account role
  const ca_ec2 = new AWS.EC2();

  // This will describe instances within the cross account role
  ca_ec2.describeInstances(...) 

  // This will ALSO describe instances within the cross account role
  ec2.describeInstances(...)

  // WARNING: Here you only will access the cross account role. You may get
  // confused on what you're accessing!!!
}

问题:

  • AWS.config.credentials直接或通过更新 globalAWS.config.update将覆盖当前凭据。
  • 一切都将指向该跨账户角色,甚至是您可能没想到的未来服务调用。
  • 要切换回第一个帐户,您可能需要临时备份AWS.config.credentials并再次更新以恢复它。使用每个帐户时难以控制,难以跟踪执行上下文,并且容易通过针对错误帐户而搞砸。

同样,不要使用AWS.config.update覆盖全局凭据AWS.config.credentials

如果您需要完全在另一个帐户中运行代码

如果您需要完全为另一个帐户执行代码而不在凭据之间切换。您可以遵循@Kanak Singhal 的建议,将 role_arn 存储在配置文件中,AWS_SDK_LOAD_CONFIG="true"并与AWS_PROFILE="assume-role-profile".

于 2019-03-23T15:02:08.137 回答
44

找到了正确的方法!查看此 PR: https ://github.com/aws/aws-sdk-js/pull/1391

只需添加AWS_SDK_LOAD_CONFIG="true"到环境变量中AWS_PROFILE="assume-role-profile"

所以它不需要任何代码更新

这是因为,SDKcredentials默认只加载文件,而不是config文件,但由于 AWS role_arn 存储在config文件中,我们也必须启用加载config文件。

于 2018-09-06T07:05:17.900 回答
32

CLI 和 SDK 的工作方式不同,因为您必须在使用 SDK 时明确承担角色。SDK 不会像 CLI 那样自动承担配置中的角色。

担任角色后,必须使用新凭证更新 AWS.config。

这对我有用:

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';

var sts = new AWS.STS();
sts.assumeRole({
  RoleArn: 'arn:aws:iam::123456789:role/Developer',
  RoleSessionName: 'awssdk'
}, function(err, data) {
  if (err) { // an error occurred
    console.log('Cannot assume role');
    console.log(err, err.stack);
  } else { // successful response
    AWS.config.update({
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken
    });
  }
});
于 2018-01-30T20:37:16.070 回答
2

派对有点晚了,但现在最简单的方法可能是使用AWS.ChainableTemporaryCredentials

它会自动刷新凭据,并且可以在多个层中链接

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ChainableTemporaryCredentials.html

当我想扮演一个假定的角色时,我自己发现了这个问题,所以猜它仍然有一些 SEO 能力!

于 2021-04-07T23:40:04.520 回答