在 aws-cli 上进行身份验证时出现 UnrecognizedClientException 错误

UnrecognizedClientException error when authenticating on aws-cli

当我拉取一个干净的 Alphine Linux Docker 图像时,在其上安装 aws-cli 并尝试使用 aws ecr get-authorization-token --region eu-central-1 验证我自己,我不断收到以下错误:

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.

我已经检查过似乎没问题的时区,并且该命令在我的本地计算机上正常运行。

这些是我 运行 设置 aws-cli 的命令: apk add --update python python-dev py-pip pip install awscli --upgrade export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

有什么明显的我遗漏的东西吗?

毕竟是访问问题!事实证明,如果您创建一个具有完全管理员访问权限的新 IAM 用户,默认情况下它无法访问您使用不同帐户创建的 ECR 注册表。使用来自该其他帐户的 IAM 凭据解决了该问题。

在获得 aws-cli 的权限之前,您无权访问这些资源,为此您可以使用以下步骤。

登录您的 AWS 帐户,单击您的帐户名,select 我的安全凭证,单击访问密钥并下载凭证

以管理员身份打开 PowerShell 并按照命令操作。

$ aws configure
$ AWS Access Key ID [****************E5TA]=xxxxxxxxxx
$ AWS Secret Access Key [****************7gNT]=xxxxxxxxxxxxxx

以下问题已解决:

  1. 转到AWS IAM Management Console
  2. 在“访问密钥(访问密钥 ID 和秘密访问密钥)”部分生成凭据
  3. 运行 命令 aws configure 并在 Cdrive-User-directory 中设置相同的下载凭据。aws\credentials

在我的例子中,我的 ~/.aws/credentials 文件有一个旧的 aws_session_token 没有被 aws configure CLI 命令更新。一旦我用 vi ~/.aws/credentials 打开文件并删除了 aws_session_token 条目,我就不再遇到 UnrecognizedClientException。我猜测当 运行 AWS CLI 命令时,如果 aws_session_token 存在于~/.aws/credentials 文件。

几个小时后,这是我的结论:

If you want to use AWS_PROFILE makes sure that the rest of AWS env vars are unset (NOT empty only ... MUST be UNSET).

profile=$AWS_PROFILE
unset $(printenv |grep AWS_ | cut -f1 -d"=");
export AWS_PROFILE=${profile};

然后:

  # with aws cli >= 1.x
  $(aws ecr get-login --no-include-email --region ${aws_region})

  # with aws cli >= 2.x
  registry=${aws_account_id}.dkr.ecr.${aws_region}.amazonaws.com
  aws ecr get-login-password --region ${aws_region} | docker login --username AWS --password-stdin ${registry}

我的问题是由于我早些时候在 AWS IAM 管理控制台中停用了我的访问密钥,这是我正在进行的练习的一部分。一旦我重新激活它,问题就解决了。

(确保您也在正确的 AWS 区域。)

它对我不起作用。出于绝对的绝望,我复制了以 export 开头的行并将它们发布到终端并按下回车键。

此后我写了 aws configure 并在 https://MYCOMPANY.awsapps.com/start#/ >> 帐户 >> 单击“命令行或程序访问”中填写了详细信息。

默认区域名称:eu-north-1
默认输出格式:text

然后登录成功。不要问我为什么。

创建一个具有 AmazonEC2ContainerRegistryFullAccess 权限的新帐户。 像这样将此帐户添加到 .credentials 文件中:

[ecr-user]
aws_access_key_id = XXX
aws_secret_access_key = XXX

然后接下来使用以下命令:

aws ecr get-login-password --profile ecr-user

我有同样的错误消息,但我使用的是基于会话的 AWS 访问。解决方案是添加 AWS 提供的所有密钥,包括会话令牌。

aws_access_key_id="your-key-id"
aws_secret_access_key="your-secret-access-key"
aws_session_token="your-session-token"

将其添加到 ~/.aws/credentials 中,用于您正在使用的配置文件。

打开文件 ~/.aws/credentials(或 Windows 上的 c:\Users\{user}\.aws\credentials

它可能类似于以下内容:

[default]
aws_access_key_id = XXXXX
aws_secret_access_key = XXXXX
aws_session_token = XXXXX

用新值更新 aws_access_key_idaws_secret_access_key 并删除 aws_session_token。您还可以通过 aws configure 命令更新 aws_access_key_idaws_secret_access_key,但这不会删除会话令牌。