Boto3 generate_presigned_url, SignatureDoesNotMatch 错误

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)

当使用的所有参数看似正确时,什么会导致此错误?我该如何解决?

Lam*_*nus 5

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,所以你不需要指定。看到这个