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

Amazon web services 如何检查AWS ECR身份验证令牌是否未过期?,amazon-web-services,docker,aws-cli,amazon-ecr,Amazon Web Services,Docker,Aws Cli,Amazon Ecr,我正在使用AWS ECR来存储docker图像。在我的管道工作流程中,要将图像推送到ECR,我需要获取身份验证令牌,以将docker验证到AWS ECR。我通过运行aws ecr get login password命令来实现这一点。这一切都很好 现在,当我必须重复这一点时,理想情况下,我不想立即获得一个新令牌,因为前一个令牌的有效期为12小时。如何检查现有令牌是否仍然有效且未过期?找不到任何aws cli命令来执行此操作?为了防止多个令牌和从同一台机器登录,我们已实施crone作业来定期刷新令

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


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

为了防止多个令牌和从同一台机器登录,我们已实施crone作业来定期刷新令牌

这就是我们为部署解决此问题的方法

先决条件:

  • AWS凭据已在计算机上配置
  • AWS cli已安装在计算机上
适用于Linux/Unix计算机

  • 为令牌刷新创建shell脚本refreshttoken.sh
  • 在编辑器中,输入以下文本以每12小时刷新一次令牌
  • 适用于Windows计算机

  • 为令牌刷新创建bat文件refreshtToken.bat
  • aws ecr获取登录密码——地区us-east-1 | docker登录——用户名aws——密码stdin.dkr.ecr.us-east-1.amazonaws.com
    
  • 创建计划任务。转到控制面板\所有控制面板项目\管理工具

  • 单击任务调度器

  • 单击“操作”选项卡并选择“创建任务”
  • 提供基本细节,如姓名等
  • 单击触发器选项卡。点击新建
  • 提供触发器详细信息
  • 现在单击“操作”选项卡。并创建一个指向refreshToken.bat的新操作
  • 拯救

  • @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
    
    docker push.dkr.ecr..amazonaws.com/:
    结果=$?
    如果[$RESULT==0]]
    然后
    echo“使用现有ECR身份验证令牌成功推送Docker映像”
    出口0
    其他的
    echo“现有ECR身份验证令牌无效,正在获取新令牌”
    aws ecr获取登录密码--区域| docker登录--用户名aws--密码stdin.dkr.ecr..amazonaws.com
    docker push.dkr.ecr..amazonaws.com/:
    fi
    

    它很简单&随需应变。只要不需要令牌,就不需要获取它。这也使我们无法在工作流中的所有生成代理上维护cron表达式。

    出于好奇,您不想获取另一个令牌有什么特别的原因吗?我很乐意获取另一个令牌,但在以前获取的令牌仍然有效时,就不需要了。主要是因为我不想让很多令牌在内存中浮动(或者一些临时位置-不确定它存储在哪里),因为我们有很多用户将使用管道在一天中构建和推送新图像好几次。所以我不想每次都获取一个新的令牌,因为如果我可以处理,比如说,在12小时的时间内,在5个不同的构建代理上获取5个令牌,我不想获取50个令牌。希望这是有意义的。@rockn rolla-对于您的重用案例,在使用以前的令牌验证错误后,(1)您不能调用
    aws ecr get login password
    ?或者(2)保持下一次刷新时间,即现在12小时后,并在使用令牌之前检查该时间?@amitd谢谢!我自己也在考虑你提到的第一种方法——我可以让它起作用。至于你的第二种方法,你能给我举个例子说明你建议如何保持下一次刷新时间吗?+1是第一种方法(我正要建议给“登录出错”添加一些逻辑)。另外,不确定这对您的场景是否有帮助?(作为第三种选择)。这很好。解释第二种方法。我假设您已经知道,这也会在周末和节假日不必要地获取代币。要避免周末,请使用crone表达式:0 0**1-5。参考文献:1-5
    crontab -e
    
    0 */12 * * *  /etc/ecr-cred-refresh/refreshToken.sh
    
    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
    
    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