Boto3 生成 presinged url 不起作用

Boto3 generate presinged url does not work

这是我用来创建 s3 客户端并生成预签名 url 的代码,这是一些非常标准的代码。他们已经在服务器 运行 上运行了很长一段时间。我提取了代码并 运行 在本地的 jupyter notebook 中

def get_s3_client():
    return get_s3(create_session=False)


def get_s3(create_session=False):
    session = boto3.session.Session() if create_session else boto3
    S3_ENDPOINT = os.environ.get('AWS_S3_ENDPOINT')

    if S3_ENDPOINT:
        AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
        AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
        AWS_DEFAULT_REGION = os.environ["AWS_DEFAULT_REGION"]

        s3 = session.client('s3',
                    endpoint_url=S3_ENDPOINT,
                    aws_access_key_id=AWS_ACCESS_KEY_ID,
                    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                    region_name=AWS_DEFAULT_REGION)

    else:
        s3 = session.client('s3', region_name='us-east-2')

    return s3

s3 = get_s3_client()

BUCKET=[my-bucket-name]
OBJECT_KEY=[my-object-name]


signed_url = s3.generate_presigned_url(
    'get_object',
    ExpiresIn=3600,
    Params={
        "Bucket": BUCKET,
        "Key": OBJECT_KEY,
    }
)

print(signed_url)

当我尝试在浏览器中使用 url 下载文件时,我收到一条错误消息,显示“指定的密钥不存在”。我在错误消息中注意到我的对象键变成了“[my-bucket-name]/[my-object-name]”,而不仅仅是“[my-object-name]”。

然后我使用相同的 bucket/key 组合使用 aws cli 生成预签名的 url,这按预期工作。我发现与 aws cli 方法相比,s3 客户端方法 (boto3) 在 [my-object-name] 前面插入了 [my-object-name]。这是结果

来自 s3.generate_presigned_url()

https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-bucket-name]/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAV17K253JHUDLKKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T175014Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=5cdcc38e5933e92b5xed07b58e421e5418c16942cb9ac6ac6429ac65c9f87d64

来自 aws cli s3 presign

https://[my-bucket-name].s3.us-east-2.amazonaws.com/[my-object-name]?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAYA7K15LJHUDAVKHB%2F20210520%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20210520T155926Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=58208f91985bf3ce72ccf884ba804af30151d158d6ba410dd8fe9d2457369894

我已经为此工作了一天半,并一直在寻找解决方案,但我找不到我的实施有什么问题。我想可能是我忽略了一些基本但重要的设置来使用 boto3 或其他东西创建 s3 客户端。感谢您的帮助!

好的,神话已经解决了,我不应该在创建 s3 客户端时提供 endpoint_url=S3_ENDPOINT 参数,boto3 会解决这个问题。删除后,一切正常。