Найдите лучший способ обновить учетные данные AWS - PullRequest
0 голосов
/ 11 марта 2019

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

1 Ответ

2 голосов
/ 11 марта 2019

Для задач, выполняющихся менее 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 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(...));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...