如何检查 AWS ECR 身份验证令牌是否未过期?

How to check if AWS ECR authentication token is not expired?

我正在使用 AWS ECR 存储 docker 图像。在我的管道工作流程中,要将图像推送到 ECR,我需要获取身份验证令牌以向 AWS ECR 进行身份验证 docker。我通过 运行 aws ecr get-login-password 命令来做到这一点。这一切都很好。

现在,当我不得不重复这个时,理想情况下我不想立即获得新令牌,因为前一个令牌的有效期为 12 小时。如何检查现有令牌是否仍然有效且未过期?找不到任何 aws cli 命令来执行此操作?

为了防止多个令牌从同一台机器登录,我们实现了 crone 作业以定期刷新令牌。

这就是我们为部署解决该问题的方式。

先决条件:

  • AWS 凭据已在计算机上配置
  • 机器上安装了 AWS cli

对于Linux/Unix机器

  1. 为令牌刷新创建 shell 脚本 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. 创建计划任务。转到控制 Panel\All 控制面板 Items\Administrative 工具

  2. 单击任务计划程序。

  1. 单击“操作”选项卡并select创建任务。

  1. 提供姓名等基本信息

  1. 单击触发器选项卡。点击新建。

  1. 提供触发器详细信息。

  1. 现在单击操作选项卡。并创建一个指向 refreshToken.bat.
  2. 的新操作

  1. 保存

@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 表达式。