Способы узнать, как скоро истечет срок действия сеанса AWS?

Предпосылки

У меня есть сценарий, который работает с AWS, но явно не обрабатывает учетные данные. Он просто вызывает AWS API, ожидая, что учетные данные будут там в соответствии с цепочкой поставщиков учетных данных по умолчанию. Фактически, оболочка, вызывающая этот сценарий, получает временные учетные данные и передает их в переменных среды (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY а также AWS_SESSION_TOKEN).

Проблема

Оболочка обычно повторно использует существующие учетные данные и запрашивает повторную аутентификацию только тогда, когда срок их действия истекает. Таким образом, существует вероятность того, что он передает учетные данные, которым осталось жить несколько минут, чего может быть недостаточно, поскольку выполнение скрипта обычно занимает много времени. К сожалению, у меня нет контроля над оболочкой, поэтому я хотел бы, чтобы сценарий проверял, сколько времени у него осталось, прежде чем принимать решение, начинать или прерывать его раньше, чтобы предотвратить сбой в середине полета.

AWS, похоже, не предоставляет стандартный способ запроса "сколько времени у меня есть до истечения моего текущего сеанса?" Если бы у меня был контроль над оболочкой, я бы также передал дату истечения срока действия в переменной среды. Я надеялся чтоAWS_SESSION_TOKEN это своего рода токен JWT, но, к сожалению, это не так, и, похоже, не содержит в себе метки времени.

Может ли кто-нибудь предложить другие способы решения данной проблемы?

3 ответа

Один лайнер/баш-функции для BSD date(проверено в macOS).

Требуетjq.

      aws-expiry () {
  aws configure get x_security_token_expires --profile ${AWS_PROFILE} | xargs -I {} sh -c 'TZ="UTC" date -j -f "%Y-%m-%dT%H:%M:%S" "+%s" $1 2>/dev/null' -- {} | xargs date -j -f "%s"
}

Чтобы получить срок действия файла кэша сеанса AWS SSO .

предполагаетcli_timestamp_formatне настроен для AWS CLI

      aws-sso-expiry () {
  aws configure get sso_start_url --profile ${AWS_PROFILE} | xargs -I {} grep -h {} ~/.aws/sso/cache/*.json | jq .expiresAt | xargs -I {} sh -c 'TZ="UTC" date -j -f "%Y-%m-%dT%H:%M:%S" "+%s" $1 2>/dev/null' -- {} | xargs date -j -f "%s"
}

Вероятно, вам нужно проверить значение $AWS_SESSION_EXPIRATION

      echo $AWS_SESSION_EXPIRATION

Это должно дать вам истечение срока действия, используя зулусское время (всеобщее координированное время) , как показано ниже .

      2022-05-17T20:20:40Z

Затем нужно будет сравнить дату в вашей системе с ней.

Инструкции ниже работают на macOS, для Linux вам, возможно, придется изменить dateпараметры функции

Давайте проверим текущее системное время в Zulu Time:

      date -u +'%Y-%m-%dT%H:%M:%SZ'

это должно дать что-то вроде примера:

      2022-05-17T20:21:14Z

Чтобы автоматизировать вещи, вы можете создать функцию bash, чтобы добавить ее в свой ~/.bashrcили любимая тема терминала

      aws_session_time_left() {
  zulu_time_now=$1

  aws_session_expiration_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $AWS_SESSION_EXPIRATION '+%s'`"
  zulu_time_now_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $zulu_time_now '+%s'`"

  if [[ $zulu_time_now < $AWS_SESSION_EXPIRATION ]]; then
    secs="`expr $aws_session_expiration_epoch - $zulu_time_now_epoch`"
    echo "+`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
  else
    secs="`expr $zulu_time_now_epoch - $aws_session_expiration_epoch`"
    echo "-`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
  fi
}

Чтобы просмотреть результат вашей функции, вы можете запустить:

      aws_session_time_left "`date -u +'%Y-%m-%dT%H:%M:%SZ'`"

Когда ваш сеанс все еще активен , вы можете получить что-то вроде:

      +0h:56m:35s

или (когда сеанс истек) может указать, сколько времени прошло с момента его истечения:

      -28h:13m:42s

ПРИМЕЧАНИЕ часы могут быть более 24 часов

БОНУС: упрощенная версия автономного скрипта без параметров ниже

например, вы также можете иметь в качестве отдельного файла get-aws-session-time-left.sh

      #!/bin/bash

# Use to find out IF "aws session expiration" exist AND compare the current system time to IT
# These are the expected result types we want to have:
# - "no aws session found" (NOTE: this does not mean there is no aws session open in another terminal)
# - how long until the session expires (for example +0h:59m:45s)
# - how long since the session expired (for example -49h:41m:12s)
# NOTE: the hours do not reset at every 24 hours, we do not require to display the days
# IMPORTANT: the date function arguments work on macOS, for other OS types may need adapting

if [[ $AWS_SESSION_EXPIRATION != '' ]]; then
  zulu_time_now="`date -u +'%Y-%m-%dT%H:%M:%SZ'`" # TODO: see important note above

  aws_session_expiration_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $AWS_SESSION_EXPIRATION '+%s'`" # TODO: see important note above
  zulu_time_now_epoch="`date -j -u -f '%Y-%m-%dT%H:%M:%SZ' $zulu_time_now '+%s'`"                   # TODO: see important note above

  if [[ $zulu_time_now < $AWS_SESSION_EXPIRATION ]]; then
    secs="`expr $aws_session_expiration_epoch - $zulu_time_now_epoch`"
    echo "+`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
  else
    secs="`expr $zulu_time_now_epoch - $aws_session_expiration_epoch`"
    echo "-`printf '%dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))`"
  fi
else
  echo "no aws session found"
fi

Затем, чтобы просмотреть срок действия сеанса AWS, вы можете просто запустить:

      bash get-aws-session-time-left.sh

вы можете использоватьaws configure getчтобы получить срок действия:

      AWS_SESSION_EXPIRATION=$(aws configure get ${AWS_PROFILE}.x_security_token_expires)

(очевидно, замените MYPROFILE на имя вашего профиля.)

Другие вопросы по тегам