EC2 API错误:验证访问凭证失败。

43

按照亚马逊指南,我安装了ec2 api。我设置了访问ID和密钥作为环境变量。

这是我的配置文件:

export AWS_ACCESS_KEY=XXXXX

export AWS_SECRET_KEY=XXXXXX

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/jre

export EC2_HOME=/usr/local/ec2/ec2-api-tools-1.7.1.0

export PATH=$PATH:$EC2_HOME/bin

看起来一切都按要求配置好了,但我无法连接到AWS。

这里是带有详细输出的ec2-describe-regions命令:

Client.AuthFailure: AWS was not able to validate the provided access credentials
ubuntu@ip:~$ ec2dre -v
Setting User-Agent to [ec2-api-tools 1.7.1.0]
2014-07-14 19:10:34,898 [main] DEBUG org.apache.http.wire  - >> "POST / HTTP/1.1[\r][\n]"
2014-07-14 19:10:34,912 [main] DEBUG org.apache.http.wire  - >> "Host: ec2.amazonaws.com[\r][\n]"
2014-07-14 19:10:34,912 [main] DEBUG org.apache.http.wire  - >> "X-Amz-Date: 20140714T191033Z[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "Authorization: AWS4-HMAC-SHA256 Credential=AKIAIT64V5MH2HHF5QZQ/20140714/us-east-1/ec2/aws4_request, SignedHeaders=host;user-agent;x-amz-date, Signature=06920c7d37a24d8244feb630d87310238886294d3ae2ab40f68a362a799d9a62[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "User-Agent: ec2-api-tools 1.7.1.0, aws-sdk-java/unknown-version Linux/3.2.0-36-virtual OpenJDK_64-Bit_Server_VM/24.51-b03[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "Content-Type: application/x-www-form-urlencoded; charset=utf-8[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "Content-Length: 41[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "Connection: Keep-Alive[\r][\n]"
2014-07-14 19:10:34,913 [main] DEBUG org.apache.http.wire  - >> "[\r][\n]"
2014-07-14 19:10:34,914 [main] DEBUG org.apache.http.wire  - >> "Action=DescribeRegions&Version=2014-06-15"
2014-07-14 19:10:34,984 [main] DEBUG org.apache.http.wire  - << "HTTP/1.1 401 Unauthorized[\r][\n]"
2014-07-14 19:10:35,002 [main] DEBUG org.apache.http.wire  - << "Transfer-Encoding: chunked[\r][\n]"
2014-07-14 19:10:35,003 [main] DEBUG org.apache.http.wire  - << "Date: Mon, 14 Jul 2014 19:18:34 GMT[\r][\n]"
2014-07-14 19:10:35,003 [main] DEBUG org.apache.http.wire  - << "Server: AmazonEC2[\r][\n]"
2014-07-14 19:10:35,010 [main] DEBUG org.apache.http.wire  - << "[\r][\n]"
2014-07-14 19:10:35,225 [main] DEBUG org.apache.http.wire  - << "fe[\r][\n]"
2014-07-14 19:10:35,225 [main] DEBUG org.apache.http.wire  - << "<?xml version="1.0" encoding="UTF-8"?>[\n]"
2014-07-14 19:10:35,225 [main] DEBUG org.apache.http.wire  - << "<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to validate the provided access credentials</Message></Error></Errors><RequestID>cd2b128b-3d70-425b-a8a7-4856fd9a6b99</RequestID></Response>"
2014-07-14 19:10:35,278 [main] DEBUG org.apache.http.wire  - << "[\r][\n]"
2014-07-14 19:10:35,279 [main] DEBUG org.apache.http.wire  - << "0[\r][\n]"
2014-07-14 19:10:35,279 [main] DEBUG org.apache.http.wire  - << "[\r][\n]"
Client.AuthFailure: AWS was not able to validate the provided access credentials
Request ID: cd2b128b-3d70-425b-a8a7-4856fd9a6b99

@alfasin 这里没有涉及到代码,我只是执行ec2dre来检查环境。我在消息中更新了我的个人资料环境变量。你说的“with >500”是什么意思? - Kerby82
nm 500,它是哪个环境?root?哪个用户连接到AWS? - Nir Alfasi
我正在使用ID和GID为1000的普通用户进行连接。我也尝试了root用户,但是出现了相同的错误。 - Kerby82
我在Mac上使用相同的凭据,它们有效,但在Ubuntu上无效。 - Kerby82
尝试使用开关--aws-access-key--aws-secret-key运行命令(并显式指定密钥)。 - Nir Alfasi
显示剩余3条评论
7个回答

100

检查服务器时钟是否同步

如果时钟被延迟,可能会导致此错误:

AWS was not able to validate the provided access credentials

2
你是怎么想到这个解决方案的?不管怎样,它起作用了 :) 谢谢 - Up_One
8
亚马逊文档记录了这种行为:“EC2 CLI工具使用您的访问密钥和时间戳来签署您的请求。确保您电脑上的日期和时间设置正确。如果不正确,则签名中的日期可能与请求的日期不匹配,AWS将拒绝该请求。”http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.html - iewebguy
aws s3 ls: 调用ListBuckets操作时发生错误(RequestTimeTooSkewed):请求时间与当前时间之间的差异太大。 - kenorb

19

当我的系统时钟错误设置时,我遇到了这个问题。

在我的情况下,时钟超前了两个小时。

同样重要的是将命令放在您的 .bashrc 或类似文件中(.bash_aliases):

export AWS_ACCESS_KEY="XXXXXXXXXXXXXXXXX"
export AWS_SECRET_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

当运行source ~/.bashrc时。

这样做的重要原因是,在运行ec2命令时,会创建新的shell实例,否则环境变量就无法得到传递。


3
我也有同样的问题,时钟慢了10分钟,安装了NTP来修复它。 - DaveB
在使用Boot2Docker中的Docker容器运行Fog时,我遇到了这个问题。这个问题帮助我重置了Boot2Docker虚拟机上的时间。 - jallen7usa
1
.zshrc或.bashrc中的导出命令非常重要。除非您更新它,否则旧密钥将被导出。 - look

9
运行aws s3 ls命令确认错误是否与时间同步有关。您应该会收到以下错误消息:

调用ListBuckets操作时发生错误(RequestTimeTooSkewed):请求时间与当前时间的差异过大。

如果是这样,请按建议进行时间同步。
以下是在Linux上执行此操作的示例shell命令:
# Install the ntpdate client for setting system time from NTP servers.
sudo apt-get --yes install ntpdate
sudo ntpdate 0.amazon.pool.ntp.org

然后再次尝试执行aws命令。


如果时区仍然不正确,请运行sudo dpkg-reconfigure tzdata进行配置,或者通过以下方式:

timedatectl list-timezones
timedatectl set-timezone 'Europe/London'

参见:配置本地时间。dpkg-reconfigure tzdata


5
AWS命令行界面(CLI)之前一直正常工作,但突然间开始出现以下错误。
A client error (AuthFailure) occurred when calling the DescribeTags operation: AWS was not able to validate the provided access credentials

尝试使用新的凭据,但这并没有帮助。

只有在执行了 EC2 实例的停止-启动 (重启也可能有效) 后才有效。因此,看起来是从执行 aws cli 的特定 EC2 实例出现了问题。


我也尝试了启动和停止,对我也起作用了。谢谢。 - Saurabh Kumar Jha

4

这也可能是由于您尝试访问的区域存在问题。我有一个脚本在所有地区尝试扮演角色,但在香港(ap-east-1)始终出现此问题。您必须先启用此区域才能访问它。如果您没有启用以下地区,则会出现此错误:

ap-east-1
cn-north-1
cn-northwest-1
us-gov-east-1
us-gov-west-1

奇怪的是,ap-northeast-3 也报错了,但它的错误是 OptInRequired


3

我有类似的问题。我的本地服务器时钟不准。我用以下命令进行了纠正:

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

然后,aws 就能正常工作了。


0

针对CentOS

# install ntpdate
sudo yum install ntpdate

# install policy kit 
sudo yum install polkit

# start ntpd service
sudo systemctl start ntpd.service

sudo ntpdate 0.amazon.pool.ntp.org

您也可以重新配置 AWS 凭证

aws configure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接