【问题标题】:using profile that assume role in aws-sdk (AWS JavaScript SDK)使用在 aws-sdk (AWS JavaScript SDK) 中担任角色的配置文件
【发布时间】:2018-02-09 20:35:22
【问题描述】:

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

【问题讨论】:

  • 你找到答案了吗?
  • 不,我在使用 Python 和 Boto3 SDK 时看到了同样的问题。
  • 据我所知,node.js 客户端不会自动承担角色。如果你想承担这些角色,你必须手动完成。

标签: node.js aws-sdk aws-sdk-nodejs


【解决方案1】:

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

使用 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" 一起添加到环境变量中。

【讨论】:

  • 这是一个更好的解决方案!谢谢。
  • 过期是自动处理还是我们需要显式处理?
  • @user3324360 会话持续时间和续订不在本问答的范围内。但是,您可以通过传递“DurationSeconds”(默认为 1 小时)在 sts.assumeRole 中控制它。请参阅:docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/… 对于处理会话过期,有多种策略。就像捕获会话过期异常以生成新凭据一样。如果您有具体案例,请创建一个新问题,以便我们了解完整的计划背景、范围和关注点。
【解决方案2】:

找到了正确的方法!看看这个公关: https://github.com/aws/aws-sdk-js/pull/1391

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

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

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

【讨论】:

  • 它适用于我:通过此导出,aws JS SDK 就像 awscli 一样工作
  • 这对我也有用。 + 不需要任何代码更改,因为我通过第三方库使用 sdk
  • 如果它不起作用,请确保取消设置 AWS_DEFAULT_PROFILE AWS_PROFILE 是您要在配置文件中假设的配置文件
  • 谢谢!这真的很有帮助,不需要任何代码更改。
【解决方案3】:

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

【讨论】:

  • 我第一次发现这对我有用,但是当我尝试刷新凭据时,我得到拒绝访问。我将此代码放入 setInterval 循环中,并在第二次迭代中失败。有什么建议吗?
  • 我的猜测是调用AWS.config.update 在您的用例中不是正确的举动。后续凭据可能无权担任该角色。
  • 这种方法不考虑凭证到期。 sdk 开箱即用地支持这一点。看看@Kanak Singhal 的回答。
  • 我想知道 AWS 什么时候会开始在他们的文档中添加这个隐藏的步骤。
【解决方案4】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多