Как проверить, не истек ли срок действия токена аутентификации AWS ECR?

Я использую AWS ECR для хранения образов докеров. В моем рабочем процессе конвейера для отправки изображений в ECR мне нужно получить токен аутентификации для аутентификации Docker в AWS ECR. Я делаю это, запуская команду aws ecr get-login-password. Все это хорошо работает.

Теперь, когда мне нужно повторить это, в идеале я не хочу сразу получать новый токен, так как предыдущий действителен в течение 12 часов. Как я могу проверить, действителен ли существующий токен и не истек ли срок его действия? Не удалось найти команду aws cli для этого?


person rock'n rolla    schedule 07.04.2021    source источник
comment
Есть ли конкретная причина, по которой вы не хотите получать еще один токен из любопытства?   -  person mreferre    schedule 07.04.2021
comment
Я рад получить еще один токен, но не тогда, когда ранее полученный токен все еще действителен. В первую очередь потому, что я не хочу, чтобы много токенов плавало в памяти (или в каком-то временном месте — не знаю, где оно хранится), поскольку у нас есть много пользователей, которые будут создавать и отправлять новые изображения довольно много раз за один раз. день с использованием трубопроводов. Поэтому я не хочу получать новый токен каждый раз, потому что, если я могу обойтись, скажем, 5 токенами, полученными в 12-часовом окне на 5 разных агентах сборки, я не хочу получать 50 токенов. Надеюсь, это имеет смысл.   -  person rock'n rolla    schedule 07.04.2021
comment
@rockn-rolla - Что касается вашего случая повторного использования, как насчет (1) вы не можете позвонить aws ecr get-login-password после ошибки аутентификации с предыдущим токеном? или (2) сохранить следующее время обновления, т. е. через 12 часов, и проверить это время перед использованием токена?   -  person amitd    schedule 07.04.2021
comment
@amitd Спасибо! Я сам думаю о первом подходе, о котором вы упомянули, - я могу заставить его работать. Что касается вашего второго подхода, не могли бы вы привести пример того, как вы предлагаете поддерживать следующее время обновления?   -  person rock'n rolla    schedule 07.04.2021
comment
+1 к первому подходу (я собирался предложить добавить логику для входа в систему при ошибке). Кроме того, не уверены, может ли это быть полезным в вашем сценарии? github.com/awslabs/amazon-ecr-credential-helper (как третий вариант).   -  person mreferre    schedule 08.04.2021


Ответы (2)


Чтобы предотвратить использование нескольких токенов и вход в систему с одной и той же машины, мы внедрили задания крона для периодического обновления токенов.

Вот как мы решили это для наших развертываний.

Необходимое условие:

  • Учетные данные AWS настроены на машине
  • AWS cli установлен на машине

Для компьютеров Linux/Unix

  1. Создайте сценарий оболочки refreshToken.sh для обновления токена.
#!/bin/bash
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <YOUR_AWS_ACCOUNT_ID>.dkr.ecr.us-east-1.amazonaws.com
  1. Поместите файл в папку /opt/ecr-cred-refresh

  2. Выполните следующую команду, чтобы создать задание cron для периодического обновления токена.

crontab -e
  1. В редакторе поместите следующий текст, чтобы обновлять токен каждые 12 часов.
0 */12 * * *  /etc/ecr-cred-refresh/refreshToken.sh

Для компьютера с Windows

  1. Создайте bat-файл refreshToken.bat для обновления токена.
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <YOUR_AWS_ACCOUNT_ID>.dkr.ecr.us-east-1.amazonaws.com
  1. Создайте запланированное задание. Перейдите в Панель управления\Все элементы панели управления\Администрирование.

  2. Нажмите на планировщик задач.

введите здесь описание изображения

  1. Перейдите на вкладку «Действие» и выберите «Создать задачу».

введите здесь описание изображения

  1. Укажите основные сведения, такие как имя и т. д.

введите здесь описание изображения

  1. Нажмите на вкладку триггера. Нажмите на новый.

введите здесь описание изображения

  1. Укажите детали триггера.

введите здесь описание изображения

  1. Теперь нажмите на вкладку действия. и создайте новое действие, которое будет указывать на refreshToken.bat.

введите здесь описание изображения

  1. Сохранять
person Amit Meena    schedule 08.04.2021
comment
Это очень аккуратно. Объясняет второй подход. Я предполагаю, что вы уже знаете, что это будет ненужным получением жетонов в выходные и праздничные дни. - person rock'n rolla; 08.04.2021
comment
Чтобы избежать выходных, используйте выражение crone: 0 0 * * 1-5. Ссылка: crontab.guru/#0_0___1-5 - person Amit Meena; 08.04.2021

Решение, опубликованное @Amit для автоматического обновления токена каждые 12 часов, является одним из способов решения проблемы, но мы остановились на подходе, предложенном другими, который использует логику для входа в систему при ошибке.

За нас это делает простой набор команд:

docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:<version>

RESULT=$?

if [[ $RESULT == 0 ]]
then
  echo "Docker image pushed successfully using existing ECR authentication token"
  exit 0
else
  echo "Existing ECR authentication token not valid, fetching a new token"
  aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
  docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/<repository_name>:<version>
fi

Это просто и по требованию. Токен не нужно извлекать, если он не нужен. Это также позволяет нам не поддерживать выражение cron для всех агентов сборки в нашем рабочем процессе.

person rock'n rolla    schedule 08.04.2021