错误:测试失败:400(无效令牌):提供的令牌格式错误或无效
我通过运行以下命令,从 epel-testing
仓库安装了 s3cmd
:
yum --enablerepo epel-testing install s3cmd
然后我用 s3cmd --configure
调用了配置工具,但出现了这个错误:
Test access with supplied credentials? [Y/n]
Please wait, attempting to list all buckets...
ERROR: Test failed: 400 (InvalidToken): The provided token is malformed or otherwise invalid.
Invoked as: /usr/bin/s3cmd --configureProblem: AttributeError: 'S3Error' object has no attribute 'find'
S3cmd: 1.5.0-beta1
python: 2.6.8 (unknown, Mar 14 2013, 09:31:22)
[GCC 4.6.2 20111027 (Red Hat 4.6.2-2)]
Traceback (most recent call last):
File "/usr/bin/s3cmd", line 2323, in <module>
main()
File "/usr/bin/s3cmd", line 2221, in main
run_configure(options.config, args)
File "/usr/bin/s3cmd", line 1704, in run_configure
if e.find('403') != -1:
AttributeError: 'S3Error' object has no attribute 'find'
我确定我的密钥是正确的。
你知道这是什么原因吗?
更新:2014年3月21日 星期五 22:44:42 ICT
在调试模式下运行时,我发现了一些线索。
在正常工作的系统上,使用相同的凭据:
DEBUG: SignHeaders: 'GET\n\n\n\nx-amz-date:Fri, 21 Mar 2014 07:07:18 +0000\n/'
在出现问题的系统上:
DEBUG: SignHeaders: 'GET\n\n\n\nx-amz-date:Fri, 21 Mar 2014 07:40:56 +0000\nx-amz-security-token:AQoDYXdzENb...\n/'
这个安全令牌是从元数据中获取的:
# wget -O - -q 'http://169.254.169.254/latest/meta-data/iam/security-credentials/myrole'
{
"Code" : "Success",
"LastUpdated" : "2014-03-21T12:45:27Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "foo",
"SecretAccessKey" : "bar",
"Token" : "AQoDYXdzENb....",
"Expiration" : "2014-03-21T19:18:02Z"
}
所以我的问题应该改成:为什么有时候 s3cmd
在运行 --configure
时会在头部添加 x-amz-security-token
(我并没有使用 --add-header
)?
4 个回答
注意,这个问题在使用Windows 10时也会出现:
aws s3 ls s3://mybucketname/
我也有一个EC2实例,它被分配了一个拥有完全管理权限的IAM角色。我所做的就是在创建了一个拥有完全管理权限的用户后,删除了.aws/config和.aws/credentials文件,然后重新输入:
aws configure
老办法,删除再替换,帮了我大忙。
对于遇到同样问题的朋友,这是我的解决办法:
你需要创建或编辑一个文件,路径是 /home/vagrant/.s3cfg,然后在这个文件里把你的密钥和密码放在引号里面,比如:
access_key="BLAHBBLAHBBLAHBBLAHB"
secret_key="2T0wyvmhfGw42T0wyvmhfGw4+-"
我也为这个问题困扰了一个小时或两个。解决这个问题的方法是在配置s3cmd之前,先在EC2实例的环境中设置好我的安全凭证。
最简单的方法是把AWS的密钥和秘密设置为环境变量:
export AWS_ACCESS_KEY_ID=EXAMPLE_KEY
export AWS_SECRET_ACCESS_KEY=EXAMPLE_SECRET
你也可以在~/.aws目录下设置一个aws_config_file文件。
环境设置好后,运行s3cmd --configure,你就可以开始使用了。
在安装了s3cmd并设置了一个IAM(身份和访问管理)后,我给它附上了一个“Amazon S3完全访问”的角色,但我也遇到了“提供的令牌格式错误或无效”的错误。接着,我创建了一个新的IAM,并附上了一个包含管理员权限的策略(所有权限都给了)。
但是,使用这个新的IAM时,错误又出现了。
在github.com的一个讨论中,有人提到使用EC2(弹性计算云)和嵌入的IAM角色可能会出现一些问题,而我的EC2正是使用了s3cmd。
于是,我尝试运行。
s3cmd --access_key=xxxx --secret_key=xxxxxxxxxxxxx ls
使用带有S3策略的IAM密钥,这次成功了。
所以,s3cmd默认使用的是EC2中嵌入角色的凭证。我相信如果你再启动一个EC2,并给它一个可以访问S3的角色,就不会出现“提供的令牌格式错误或无效”的错误了。
不过,请不要在任何使用s3cmd的脚本中直接写入-access_key=xxxx --secret_key=xxxxxxxxxxxxx
这些参数。尽量在启动EC2时嵌入角色(这是一个好的安全做法)。
总之,为了测试,我又启动了一个没有任何嵌入IAM角色的EC2,安装了s3cmd,配置后,使用我有S3策略的IAM用户,一切都按预期工作。