【问题标题】:boto3 s3 connection error: An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operationboto3 s3连接错误:调用ListBuckets操作时发生错误(SignatureDoesNotMatch)
【发布时间】: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


【解决方案1】:

实际上,@John Rotenstein 和@bdcloud 部分回答了这个问题,但我需要更具体...

在我的情况下,以下代码不是必需的,并导致错误消息:

  # 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']
    ) 

现在存储在self.settings 中的凭据反映了~/.aws/credentials。奇怪的是(就像上周发生了相反的情况一样),我现在可以访问了。可能是我的笔记本电脑的简单重启意味着我在~/.aws/credentials 中的新凭据(因为我昨天再次更新了这些凭据)然后被“接受”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 2018-06-08
    • 2021-09-17
    • 2022-09-23
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多