使用在 aws-sdk (AWS JavaScript SDK) 中担任角色的配置文件

新手上路,请多包涵

使用适用于 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

原文由 Anders Lundsgard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 557
2 个回答

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
    });
  }
});

原文由 Brant 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

使用 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.update 更新全局 AWS.config.credentials 将覆盖当前凭据。
  • 一切都将指向该跨账户角色,甚至是您可能意想不到的未来服务调用。
  • 要切换回第一个帐户,您可能需要临时备份 AWS.config.credentials 并再次更新以恢复它。当您使用每个帐户时很难控制,很难跟踪执行上下文,并且很容易因针对错误的帐户而搞砸。

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

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

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

原文由 Facundo Victor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题