【发布时间】:2018-12-28 17:36:00
【问题描述】:
我正在使用boto3 包从 s3 集群外部进行连接(即脚本当前不在 AWS“云”中运行,而是从我的 MBP 连接到相关集群)。我的代码:
s3 = boto3.resource(
"s3",
aws_access_key_id=self.settings['CREDENTIALS']['aws_access_key_id'],
aws_secret_access_key=self.settings['CREDENTIALS']['aws_secret_access_key'],
)
bucket = s3.Bucket(self.settings['S3']['bucket_test'])
for bucket_in_all in boto3.resource('s3').buckets.all():
if bucket_in_all.name == self.settings['S3']['bucket_test']:
print ("Bucket {} verified".format(self.settings['S3']['bucket_test']))
现在我收到此错误消息:
botocore.exceptions.ClientError: An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation
我知道如何检查 aws 凭据的顺序,并尝试了我的环境变量和 ~/.aws/credentials 的不同排列,并且知道根据我的 .py 脚本应该覆盖凭据,但是我仍然看到此 SignatureDoesNotMatch 错误消息。有什么想法我可能会出错吗?我也试过:
# Create a session
session = boto3.session.Session(
aws_access_key_id=self.settings['CREDENTIALS']['aws_access_key_id'],
aws_secret_access_key=self.settings['CREDENTIALS']['aws_secret_access_key'],
aws_session_token=self.settings['CREDENTIALS']['session_token'],
region_name=self.settings['CREDENTIALS']['region_name']
)
s3 = boto3.resource('s3')
for bucket in s3.buckets.all():
print(bucket.name)
...但是我也看到了相同的错误回溯。
【问题讨论】:
-
当提供的凭据错误时会出现问题。您可以通过配置 aws cli 并运行 aws s3 ls s3://mybucket 来验证它。您还可以通过 --debug 选项来调试问题.如果凭证错误,请尝试在 IAM 中重新生成密钥并在您的脚本中使用它们。这应该可以解决问题。
-
@bdcloud:谢谢,进步......我刚刚从终端“aws s3 ls 'my-bucket'”运行,并显示了内容,即我的存储桶的文件。所以这似乎很好。我知道有:1)AWS 服务 API 的 REST 和 HTTP 查询访问密钥(我最近提供的那个); 2) CodeCommit 的 SSH 密钥; 3) 一个 Git-HTTPS 密钥。如何确保在我的脚本中使用正确的?
-
一般来说,如果您从 EC2 实例运行代码,您应该分配一个角色。如果您在自己的计算机上运行,则将凭据存储在
~/.aws/credentials中。您的代码永远不需要自己引用凭据。例如,它应该只使用s3 = boto3.resource("s3")而无需指定更多内容。
标签: python-3.x amazon-s3 boto3