【发布时间】:2020-10-30 21:07:06
【问题描述】:
我正在使用 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()是使用sts:assumeRole设置this.s3Client的方法
然后new AWS.S3()
这很好用,但我不确定这是否是一种干净的方法。奇怪的是,当我在本地测试它时,在令牌过期时调用 responseCallback() 几乎需要 两分钟。虽然 responseCallback() 会在令牌处于活动状态时立即执行。
【问题讨论】:
标签: node.js amazon-web-services amazon-s3 promise