node.js - 寻找更新 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() 在令牌处于活动状态时立即执行。
解决方案
对于运行时间少于 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(...));
推荐阅读
- javascript - React Native Expo 中的 Jest 测试用例中断
- python - 如何使用动态@id 将文本发送到输入字段
- swagger - 如何使用 Power Apps 自定义 API 从 Power Apps 调用 IoT Central Device Bridge?
- javascript - 表达式预期在 if 条件附近
- python - 如何在python中使用for循环求解非线性方程?
- python-3.x - SystemCheckError:系统检查发现了一些问题:
- python - 有什么方法可以删除 python googlemaps api 上的标记?
- python-3.x - 允许门户用户访问功能或导航到 odoo 12 页面
- paypal - PayPal 服务器 SDK:如何批准订单 ID
- python - 更新硒模块后我无法运行我的代码