Jos*_*lff 1 amazon-web-services python-3.x boto3
关于 SO 和其他地方的几个问题和答案概述了解决从 boto3 SDK 调用“generate_presigned_url”时抛出的 SignatureDoesNotMatch 错误的可能解决方案。boto3 中很少有,大多数答案都建议获取新凭据来解决此异常。你可以在这里看到更多(但这是在 PHP 中)。
但是这些对我不起作用,因为我使用了正确的凭据以及正确的存储桶名称和密钥路径。
最初,我调用它来生成我的客户端,然后调用 generate_presigned_url。
client_s3 = boto3.client(
's3',
# Hard coded strings as credentials, not recommended.
aws_access_key_id='XXX',
aws_secret_access_key='XXX',
region_name='us-east-2',
# EDIT: Previously, I used signature_version='v4' here, but as a user here pointed out, this might not work. Regardless, I tried 's3v4' prior to trying 'v4' and neither worked for me.
config=Config(signature_version='s3v4')
)
url = client_s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'BUCKET_NAME',
'Key': 'CORRECT_KEY'
}
)
Run Code Online (Sandbox Code Playgroud)
当使用的所有参数看似正确时,什么会导致此错误?我该如何解决?
boto3的文档中明确提到该选项应该看起来像config=Config(signature_version='s3v4'). v4行不通。
这是 boto3 文档的示例。
import boto3
from botocore.client import Config
# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
# Generate the URL to get 'key-name' from 'bucket-name'
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': 'bucket-name',
'Key': 'key-name'
}
)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,us-east-2只允许签名版本 4,所以你不需要指定。看到这个。