Amazon web services `授权令牌已过期`在MacOS Sierra上发布AWS-CLI

Amazon web services `授权令牌已过期`在MacOS Sierra上发布AWS-CLI,amazon-web-services,docker,aws-cli,macos-sierra,Amazon Web Services,Docker,Aws Cli,Macos Sierra,我正在尝试使用AWS cli将docker映像推送到AWS ECR存储库 我只是运行get login命令 执行输出(返回登录成功) 然后尝试推一个docker图像,然后我得到 信息: 拒绝:您的授权令牌已过期。请跑 “aws ecr get login”获取新的登录名。 我不知道出了什么问题,我正在推进正确的回购协议,我的mac电脑上的时间是正确的。 这是工作之前,但由于我重新安装了我的mac并升级到macOS Sierra它不再工作,所以可能与此有关 我的aws--版本输出: aws c

我正在尝试使用AWS cli将docker映像推送到AWS ECR存储库

  • 我只是运行
    get login
    命令
  • 执行输出(返回
    登录成功
  • 然后尝试推一个docker图像,然后我得到 信息:
    拒绝:您的授权令牌已过期。请跑
    “aws ecr get login”获取新的登录名。
我不知道出了什么问题,我正在推进正确的回购协议,我的mac电脑上的时间是正确的。 这是工作之前,但由于我重新安装了我的mac并升级到macOS Sierra它不再工作,所以可能与此有关

我的
aws--版本
输出:

aws cli/1.11.34 Python/2.7.10 Darwin/16.3.0 botocore/1.4.91

我运行的命令的完整输出:

$ aws ecr get-login --region eu-west-1
docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
$ docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
$ docker push 1234567890.dkr.ecr.eu-west-1.amazonaws.com/service-web:latest
The push refers to a repository [1234567890.dkr.ecr.eu-west-1.amazonaws.com/service-web]
c1f87971dfa9: Preparing 
2eb644aea3de: Preparing 
9c8843ffe48e: Preparing 
39bb58d049d4: Preparing 
f053bc969599: Preparing 
7169084246b8: Waiting 
bb134a1936fd: Waiting 
184e76848a1c: Waiting 
75c8fcf65748: Waiting 
eb9b9ee1ea58: Waiting 
f4bf35723edd: Waiting 
ddffe1a64b3c: Waiting 
fd1a1154db16: Waiting 
b542e946067a: Waiting 
d49ed2a5e1ed: Waiting 
bb39b980367a: Waiting 
25b8358d062f: Waiting 
997eee521fc7: Waiting 
50b5447183a8: Waiting 
4339b5cb0e1d: Waiting 
3dbd4a53b21b: Waiting 
2bec16216500: Waiting 
b9fd8e264df6: Waiting 
b6ca02dfe5e6: Waiting 
denied: Your Authorization Token has expired. Please run 'aws ecr get-login' to fetch a new one.

Docker的最新版本使用了新的凭据存储功能,其中使用指定协议的URL进行
Docker登录将导致令牌过期错误。此问题将在Docker 1.13中修复

目前,解决方法是在不指定协议的情况下执行登录命令

因此,在aws ecr get login返回的命令blob中:

docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
应替换为以下内容:

docker login -u AWS -p AQECAHh....b6Wk -e none 1234567890.dkr.ecr.eu-west-1.amazonaws.com

省略https://
应该可以让docker暂时工作。

我使用的是mac版docker的稳定版本
版本1.12

我刚刚升级到beta版
1.13.0-rc4-beta34.1(14853)
现在一切都按计划进行了


因此,如果有人有同样的问题,请确保您使用docker for mac 1.13版或更高版本,如果1.13尚未发布,请切换到beta版。

以上两种解决方案都不适用于my,但我发现,当我在ecr login命令中设置region时,它们都有效


aws ecr get login——region us-west-2

刚刚在Linux Mint 18.1(Ubuntu 16.04)上出现了同样的问题,aws ecr和最新的Docker 17.06.1-ce通过最新的2.5.1使用。登录成功,推送失败

删除
~/.docker/config.json
有帮助。它只包含授权令牌,可能已经过时

我认为这与底层操作系统无关。在我的例子中,它以前工作过,我能回忆起的唯一变化是从Ubuntu repo的
docker.io 1.12
升级到docker repo的
docker ce 17.06

如果您在~/.aws/credentials中有多个凭据(路径取决于您的操作系统),您还会收到消息“您的授权令牌已过期”忘记添加--p标志

使用此命令获取登录名:

aws ecr get-login --region eu-west-1 -p <yourprofilename>
aws ecr获取登录信息——地区eu-west-1-p

我知道这篇文章与MacOS Sierra有关,但对于那些在Windows上有问题的人,我执行了以下操作:

1)aws ecr get login,此命令将输出一个长字符串

docker login-u AWS-p eyJwYXlsb2FkIjoiUXBnQ2FTV1B6Q1JqZGlH……(为了更好地理解,省略了整行)-无

2)复制并粘贴上面的行(可能-e none不起作用,所以也将其删除)。输出将显示警告,然后显示成功: 警告通过CLI使用--password是不安全的。使用--password stdin 登录成功

如果需要使用安全的方式,请使用--password stdin

3)现在您可以安全地推送图像 -docker push xxxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecfs-test

0429f33dd264: Pushed
48accfb13167: Pushed
f3bb6dd29c05: Pushed
e58ae65fa4eb: Pushed
3c6037fae296: Pushed
3efd1f7c01f6: Pushed
73b4683e66e8: Pushed
ee60293db08f: Pushed
9dc188d975fd: Pushed
58bcc73dcf40: Pushed
latest: digest: sha256:4354d137733c98a1bc8609d2d2f8e97316373904e size: 2404

可能此解决方案也适用于Mac。

您需要每12小时刷新一次授权令牌。请尝试:


$(aws ecr get登录--不包括电子邮件--地区us-east-1)
-根据您的配置更改区域

警告:
aws ecr get login
似乎无法连接到aws服务器,即使您的aws访问/密钥不正确,或者即使您忘记将aws访问/密钥作为环境变量输入,也无法正常工作

它仍然很乐意给你一个长密码,而不提供错误。那么,您从AWS得到的消息是一个过期错误,而不是更正确、更有用的“授权不正确”


注意:使用aws cli版本1.11.112。

我也遇到了相同的错误,下面是我尝试过的解决方案,它正在工作: 1.运行命令: aws ecr get login--不包括电子邮件--地区ap-southeast-1(根据您的存储库更改地区) 2.您将获得如下输出: docker登录-u AWS-p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==

删除“https://”,然后按如下方式运行命令 docker login-u AWS-p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==youraccountid.dkr.ecr.ap-Southwest-1.amazonaws.com


它将工作,您将能够推送图像。

在我的例子中,问题是~/.aws/credentails中有多个凭据,所以我使用--profile


这对我有用

您可能只是在运行该命令,而没有将从该命令回显的命令粘贴回终端。容易犯错误。跑步后:

aws ecr获取登录信息--不包括电子邮件--地区us-east-1

它将打印出另一个要运行的命令,您需要复制该命令并在您的终端中运行它以进行完全验证

或者,一个很酷的快捷方式是通过管道将echo命令返回到shell中:

aws ecr get login——不包括电子邮件——地区us-east-1 | sh

当我试图从另一个aws帐户的注册表中推/拉时,发生了这种情况。我需要使用
--registry ids
标志运行
get login
,传递我想要登录的注册表的ID。

我很幸运使用了eval。比如说,

$ aws ecr get-login --region us-east-1 --no-include-email --profile username_env 
没用

$ eval $(aws ecr get-login --region us-east-1 --no-include-email --profile username_env)

确实有效。

问题是因为aws ecr get login命令检索对指定注册表有效12小时的令牌,然后打印docker login命令w
$ eval $(aws ecr get-login --region us-east-1 --no-include-email --profile username_env)
eval "$(aws ecr get-login --no-include-email \
  --region us-east-1 \
  --registry-ids 11223344 \
)"
{
        "auths": {
                "XXXX.dkr.ecr.us-east-1.amazonaws.com": {}
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/19.03.5 (windows)"
        },
        "credsStore": "desktop",
        "stackOrchestrator": "swarm"
}

docker login -u AWS -p "XXX...the really long password ehre..XXX" https://XXXX.dkr.ecr.us-east-1.amazonaws.com
{
        "auths": {
                "XXXX.dkr.ecr.us-east-1.amazonaws.com": {
                        "auth": "XXX...the really long password ehre..XXX"
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/19.03.5 (windows)"
        },
        "stackOrchestrator": "swarm"
}

    aws ecr get-login-password \
    --region REGION \
| docker login \
    --username AWS \
    --password-stdin ACCESS_ID.dkr.ecr.REGION.amazonaws.com
aws --region us-west-2 ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com
    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${region}.amazonaws.com
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <ACCESS_ID>.dkr.ecr.<REGION>.amazonaws.com
$(aws ecr get-login -no-include-email)
aws ecr get-login-password | docker login --username AWS --password-stdin MY-REGISTRY-URL
 aws ecr get-login-password \
    --region <region> \
| docker login \
    --username AWS \
    --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
password=$(aws ecr get-login-password --region us-east-1)
echo $password | docker login --username AWS --password-stdin 787566098823.dkr.ecr.us-east-1.amazonaws.com