Amazon web services 如何检查AWS ECR身份验证令牌是否未过期?
我正在使用AWS ECR来存储docker图像。在我的管道工作流程中,要将图像推送到ECR,我需要获取身份验证令牌,以将docker验证到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 get login password
命令来实现这一点。这一切都很好
现在,当我必须重复这一点时,理想情况下,我不想立即获得一个新令牌,因为前一个令牌的有效期为12小时。如何检查现有令牌是否仍然有效且未过期?找不到任何
aws cli
命令来执行此操作?为了防止多个令牌和从同一台机器登录,我们已实施crone作业来定期刷新令牌
这就是我们为部署解决此问题的方法
先决条件:
- AWS凭据已在计算机上配置
- AWS cli已安装在计算机上
aws ecr获取登录密码——地区us-east-1 | docker登录——用户名aws——密码stdin.dkr.ecr.us-east-1.amazonaws.com
@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