Я использую sts: acceptRole для подключения к корзине 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 () выполняется немедленно, когда токен активен.