【问题标题】:How to check if AWS ECR authentication token is not expired?如何检查 AWS ECR 身份验证令牌是否未过期?
【发布时间】:2021-07-03 02:51:52
【问题描述】:

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

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

【问题讨论】:

  • 出于好奇,您是否有特殊原因不想获得另一个令牌?
  • 我很高兴获取另一个令牌,但不是在之前获取的令牌仍然有效时。主要是因为我不希望很多令牌漂浮在内存中(或某个临时位置 - 不确定它存储在哪里),因为我们有很多用户将在一个使用管道的一天。所以我不想每次都获取一个新的令牌,因为如果可以的话,比如说在 5 个不同的构建代理的 12 小时窗口内获取 5 个令牌,我不想获取 50 个令牌。希望这是有道理的。
  • @rockn-rolla - 对于您的重用案例,(1) 在使用先前令牌的身份验证错误之后,您不能调用 aws ecr get-login-password 吗?或 (2) 保持下一次刷新时间,即现在 12 小时后,并在使用令牌之前检查该时间?
  • @amitd 谢谢!我自己正在考虑您提到的第一种方法-我可以使它起作用。至于您的第二种方法,您能否举个例子说明您建议如何保持下一次刷新时间?
  • +1 第一种方法(我正要建议为“错误登录”添加一些逻辑)。另外,不确定这是否对您的方案有帮助? github.com/awslabs/amazon-ecr-credential-helper(作为第三种选择)。

标签: amazon-web-services docker aws-cli amazon-ecr


【解决方案1】:

为了防止多个token从同一台机器登录,我们实现了cron作业来定期刷新token。

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

先决条件:

  • 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. 执行以下命令创建一个定时任务来定期刷新token。

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. 保存

【讨论】:

  • 这很整洁。解释第二种方法。我假设您已经意识到这也会在周末和节假日不必要地获取令牌。
  • 为了避免周末,请使用 crone 表达式:0 0 * * 1-5。参考:crontab.guru/#0_0___1-5
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2021-01-10
    • 2015-11-12
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多