【问题标题】:`Authorization Token has expired` issue AWS-CLI on MacOS Sierra`Authorization Token has expired` 在 MacOS Sierra 上发出 AWS-CLI
【发布时间】:2016-12-29 12:32:22
【问题描述】:

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

  • 我只是运行get-login 命令
  • 执行输出(返回login succeeded
  • 然后尝试推送 docker 映像,然后我得到 留言:
    denied: Your Authorization Token has expired. Please run 'aws ecr get-login' to fetch a new one.

我不知道出了什么问题,我正在推送到正确的仓库,我的 mac 上的时间是正确的。 这以前可以工作,但是由于我重新安装了我的 mac 并升级到 macOS Sierra,它不再工作了,所以可能与此有关。

我的aws --version 输出:

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.

【问题讨论】:

  • 当您的访问 ID 和密钥已被删除并且您需要在例如 IAM 控制台中生成一个新的时,也会发生这种情况。

标签: amazon-web-services docker aws-cli macos-sierra


【解决方案1】:

上述解决方案都不适用于我,但我发现当我在 ecr login 命令中设置区域时它有效。

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

【讨论】:

  • 这也为我解决了。我认为我的原因是我试图推送到的 ECR 与我在 ~/.aws/config 中的默认值位于不同的区域。
  • 对我来说,最后是us-west-1,而不是us-west-2,与我提交给aws configure的用户凭据一致。
  • get-login 已弃用。我在这里添加了一个更新的答案:stackoverflow.com/questions/41379808/…
【解决方案2】:

您可能只是在运行命令,而不是将从该命令中回显的命令粘贴回终端。容易犯错误。一旦你运行:

aws ecr get-login --no-include-email --region us-east-1

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

或者一个很酷的快捷方式是将 echo'd 命令返回到 shell 中:
aws ecr get-login --no-include-email --region us-east-1 | sh

【讨论】:

  • 这可行,但会引发警告“警告!通过 CLI 使用 --password 是不安全的。使用 --password-stdin。”
  • @Dakota Hipp 它正在工作。感谢您发布答案。
【解决方案3】:

最新版本的 Docker 使用新的凭据存储功能 has a bug,其中使用指定协议的 URL 执行 docker login 将导致令牌过期错误。此问题将在 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暂时工作。

【讨论】:

  • 删除方案无效。当我删除它时,它根本没有登录,它只是挂起。我也尝试添加 http:// 而不是 https:// 但也没有用,并尝试添加 :443 而不是 https:// 方案,但没有运气。
  • 它对我不起作用,在 Ubuntu Yakkety 上使用 Docker 1.13。删除“https://”没有任何区别,它表示它成功但在推送时会导致相同的错误。 :(
  • 这为我在 OS X、客户端和服务器版本 1.12.6 上使用 docker-machine 修复了问题。谢谢!
  • 使用最新的 Docker 工具箱对我不起作用。 (v1.13.1)
  • 感谢这对我有用。在我的部署脚本中,我执行了以下操作: aws_login=$(aws ecr get-login) aws_login=${aws_login//https:\/\//}
【解决方案4】:

这个答案使用 AWS CLI v2.0.26 对我有用

https://github.com/aws/aws-cli/issues/4962#issuecomment-592064025

aws --region us-west-2 ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com

其中 us-west-2 是您的区域,xxxxxxxxxxxxxx 是您的帐户 ID,位于此处“存储库名称”下方的行开头:https://us-west-2.console.aws.amazon.com/ecr/create-repository?region=us-west-2

【讨论】:

  • 这很有效,谢谢
【解决方案5】:

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

$(aws ecr get-login --no-include-email --region us-east-1) - 根据您的配置更改区域

【讨论】:

【解决方案6】:

刚刚在 Linux Mint 18.1 (Ubuntu 16.04) 上遇到了同样的问题,AWS ECR 和最新的 Docker 17.06.1-ce 通过最新的Python Docker client 2.5.1 使用。登录成功,推送失败。

删除~/.docker/config.json 有帮助。它只包含可能陈旧的授权令牌。

我认为这与底层操作系统无关。在我的情况下,它以前工作过,我能记得的唯一变化是从 Ubuntu repo 的 docker.io 1.12 升级到 Docker repo 的 docker-ce 17.06

【讨论】:

  • 那行得通。我在同一地区有一个重复的条目。这可能导致 Docker 感到困惑。
  • 这就像魅力一样 - 我有 docker-1.13.1-162,这个解决方案成功了。
  • 这对我有用。 Docker 桌面 v.3.2.1
【解决方案7】:

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

使用此命令登录:

aws ecr get-login --region eu-west-1 -p <yourprofilename>

【讨论】:

【解决方案8】:

简单命令:

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

【讨论】:

  • 对于使用上述的任何人,您可能需要更改上述命令中提到的region
【解决方案9】:

我很幸运使用了 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 --no-include-email 只是返回以docker login -u AWS -p &lt;token&gt; &lt;ecr_repo&gt; 登录的命令。为了运行命令eval $(...)是必要的。
【解决方案10】:

以下步骤对我有用。首先,运行

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

你会得到一个返回的输出:

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

现在,从上述结果中删除“-e none”并再次运行该命令。

您将能够成功登录。

现在,尝试推送你的 docker 镜像,它会工作的!

【讨论】:

【解决方案11】:

我也遇到了同样的错误,下面是我尝试过的解决方案,它正在工作: 1.运行命令: aws ecr get-login --no-include-email --region ap-southeast-1 (根据您的存储库更改区域) 2. 你会得到类似的输出: docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== https://youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com

删除“https://”,然后运行命令为 docker login -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com

它会起作用,您将能够推送图像。

【讨论】:

    【解决方案12】:

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

    aws ecr get-login --no-include-email --region us-east-2 --profile xxxx
    

    这对我有用。

    【讨论】:

    • 个人资料也是我的问题。经过一个长周末,我忘记了我通常设置一个环境变量,并没有意识到我忘记了再次这样做
    【解决方案13】:

    我只是想发布官方迁移链接,因为我相信如果情况发生变化,它将是最新的:

    https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-ecr-get-login

    说明

    $(aws ecr get-login --no-include-email)
    

    应该替换为

    aws ecr get-login-password | docker login --username AWS --password-stdin MY-REGISTRY-URL
    

    这是由于 CLI 中潜在的密码泄露所致。值得一提的是,您可以从 CLI 版本 1.17.10 迁移到新方法,以便顺利迁移到 2.X

    【讨论】:

    • 应该是 --no-include-email(2 破折号)
    • 已修复。感谢您的反馈!
    【解决方案14】:

    这发生在我尝试从另一个 AWS 账户中的注册表推送/拉取时。我需要使用--registry-ids 标志运行get-login,并传入我想登录的注册表的ID。

    【讨论】:

      【解决方案15】:

      如果您aws-cli/2.0.0,上述大多数解决方案将无法正常工作

      对我来说,我有aws-cli/2.0.0 Python/3.8.1 Darwin/19.4.0 botocore/2.0.0dev4

      有效的是重新登录。 如果您在aws-cli/2.0.0 上,那么以下内容也可能对您有用。 aws ecr get-login-password |docker login --username AWS --password-stdin $IMAGE_PATH

      【讨论】:

      • aws-cli/v2 已删除标志 --no-include-email。就我而言,我使用 ECR 的 TOKEN for Azure Pipeline CICD,它每天都会过期,这会干扰我的 CICD 流程。对这种情况有任何想法。
      【解决方案16】:

      我使用的是稳定版 docker for mac Version 1.12

      我刚升级到测试版Version 1.13.0-rc4-beta34.1 (14853) 现在一切正常。

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

      【讨论】:

        【解决方案17】:

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

        1) aws ecr get-login,这个命令会输出一个长字符串

        docker login -u AWS -p eyJwYXlsb2FkIjoiUXBnQ2FTV1B6Q1JqZGlH......(省略整行以便更好理解) -e none https://xxxxxxx.dkr.ecr.us-east-1.amazonaws.com.

        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。

        【讨论】:

          【解决方案18】:

          问题是因为 aws ecr get-login 命令检索对指定注册表有效 12 小时的令牌,然后它使用该授权令牌打印 docker login 命令,而我们没有执行我们得到的那个命令返回。

          我们需要执行这个打印的命令来使用 Docker 登录到您的注册表。就我而言,我正在使用 eval 执行从 aws ecr get-login 返回的打印命令,如下所示:

          eval $(aws ecr get-login --region eu-west-1 --profile )

          【讨论】:

            【解决方案19】:

            这是我认为的当前格式,假设您正在尝试访问 Docker:

                aws ecr get-login-password \
                --region REGION \
            | docker login \
                --username AWS \
                --password-stdin ACCESS_ID.dkr.ecr.REGION.amazonaws.com
            

            【讨论】:

              【解决方案20】:

              当您花费大量时间而不访问 CLI 终端时,通常会发生此问题。因此,当您返回 CLI 时,需要重新登录。

              对于您的 MacOs/Linux,请使用以下命令建立新的登录会话。

              aws ecr get-login-password --region [Your Region] | sudo docker login --username AWS --password-stdin [IAM User Id].dkr.ecr.[Your Region].amazonaws.com

              请用您的相关值替换占位符。

              【讨论】:

                【解决方案21】:

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

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

                注意:使用 aws-cli 版本 1.11.112。

                【讨论】:

                • 鉴于 AWS CLI 需要调用 GetAuthorizationToken API 操作,这似乎没有意义,我无法相应地重现这一点,是吗?当我故意通过更改字符使访问密钥无效时,AWS CLI 1.16.190 会产生措辞恰当的错误消息 An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.
                【解决方案22】:

                此特定错误的另一个解决方案变体是aws ecr get-login 调用缺少--registry-ids 参数。

                完整的get-login 调用类似于:

                eval "$(aws ecr get-login --no-include-email \
                  --region us-east-1 \
                  --registry-ids 11223344 \
                )"
                

                请替换您自己的区域和注册表 ID 值。

                【讨论】:

                  【解决方案23】:

                  问题提到login 成功但docker push 失败。

                  上述情况的两个可能原因是:

                  1. AWS 凭证已过期。转到 AWS 控制台或使用 aws-cli 生成一个新对。将它们存储在环境中或 ~/.aws/credentials 文件中。
                  2. 您可能使用了来自不同账户的错误 AWS 凭证。使用 ECR 存储库所在账户的凭证临时设置 AWS_ACCESS_KEY、AWS_SECRET_ACCESS_KEY 和 AWS_REGION。

                  与帐户关联的 ECR 存储库仅适用于这些帐户的凭据

                  始终确保操作使用了哪些 AWS 凭证。 检查环境变量和~/.aws/credentials 确认。

                  【讨论】:

                    【解决方案24】:

                    这对我有用。我在 Windows 上使用 Docker。问题似乎与 docker 配置有关。特别是凭据的存储方式。如果你查看 ~/.docker/config.json,它可能看起来像这样:

                    {
                            "auths": {
                                    "XXXX.dkr.ecr.us-east-1.amazonaws.com": {}
                            },
                            "HttpHeaders": {
                                    "User-Agent": "Docker-Client/19.03.5 (windows)"
                            },
                            "credsStore": "desktop",
                            "stackOrchestrator": "swarm"
                    }
                    
                    

                    如果您删除credStore 行并尝试再次登录

                    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"
                    }
                    
                    

                    烦人的是,我每次都必须这样做,因为 docker 又重新添加了 credStore

                    【讨论】:

                      【解决方案25】:

                      我收到此错误是因为我有多个配置文件。标记的个人资料为我解决了这个问题:

                      $(aws ecr get-login --no-include-email --region us-west-2 --profile xxxx)

                      【讨论】:

                        【解决方案26】:

                        就我而言,波纹管脚本适用于 aws 版本 aws-cli/2.0.8

                            aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.${region}.amazonaws.com
                        

                        【讨论】:

                          【解决方案27】:

                          aws ecr get-login 似乎不再受支持。

                          我不得不改用get-login-password

                          aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <ACCESS_ID>.dkr.ecr.<REGION>.amazonaws.com
                          

                          【讨论】:

                            【解决方案28】:

                            对于 AWS CLI 2.0,请使用以下内容

                             aws ecr get-login-password \
                                --region <region> \
                            | docker login \
                                --username AWS \
                                --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
                            

                            来自https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 2021-04-28
                              • 2021-01-21
                              • 2017-02-06
                              • 1970-01-01
                              • 2019-01-01
                              • 2017-03-31
                              • 2017-06-28
                              • 2017-01-14
                              相关资源
                              最近更新 更多