首页 > 解决方案 > 寻找更新 AWS 凭证的更好方法

问题描述

我正在使用 sts:assumeRole 连接到不同帐户的 s3 存储桶。现在,我运行的工作需要几天时间,并且在凭证到期的过程中,我需要一种方法来更新它们。

我编写了以下代码来处理临时凭证的到期

这段代码在我的 downloadFile() 中:

return new Promise((resolve, reject) => {
    function responseCallback(error, data) {
        if (error) {
            const errorMessage = `Fail to download file from s3://${config().s3.bucket}/${path}: ${error};`;
            reject(error);
        } else {
            Logger.info(`Successfully download file from s3://${config().s3.bucket}/${path}`);
            resolve(data.Body);
        }
    }
    const fn = this.s3Client.getObject({
        Bucket: config().s3.bucket,
        Key: path
    }, (error, data) => this.handleTokenExpiry(error, data, fn, responseCallback));
});

这是 handleTokenExpiry()

handleTokenExpiry(error, data, fn, callback) {
    if (!error || error.code !== "ExpiredToken") return callback(error, data);

    Logger.info("Token expired, creating new token");
    this.s3Client = null; // null so that init() doesn't return existing s3Client
    return this.init().then(fn);
}

init()this.s3Client使用sts:assumeRole 然后设置的方法new AWS.S3()

这很好用,但我不确定这是否是一种干净的方法。奇怪的是,当我在本地测试它时,在令牌过期时调用 responseCallback() 需要将近两分钟。虽然 responseCallback() 在令牌处于活动状态时立即执行。

标签: node.jsamazon-web-servicesamazon-s3promise

解决方案


对于运行时间少于 12 小时的任务,这里是解决方案。

使用时AssumeRole,您可以指定DurationSeconds参数来指定 STS 返回的临时凭证的持续时间。最少 15 分钟,最多 12 小时。

您承担的角色也需要修改以授权最长持续时间。请参阅https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session

在您的情况下,作业运行了几天。我建议重构应用程序以小批量运行,每个运行几个小时。

另一种选择是主动处理令牌到期。如果您的代码知道令牌持续时间和获取令牌的时间,我建议在调用使用令牌的方法(例如 S3's getObject)之前调用方法。该方法检查令牌是否即将过期并主动刷新它们。伪代码就像

function refreshToken() {
   return new Promise( (resolve, reject) => {
      // XX depends how long is your S3 getObject call
      if (token_acquisition_time + token_duration <= now() + xx minutes)  {
         // refresh token
         sts.assumeRole(...).promise().then(resolve());
      } else {
         resolve();
      }
   });
}

...

refreshToken.then(s3.getObject(...));

推荐阅读