运行如下行:
s3_obj = boto3.resource('s3').Object(bucket, key)
s3_obj.meta.client.generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket':bucket,'Key':key})
产生如下结果:
https://my-bucket.s3.amazonaws.com/my-key/my-object-name?AWSAccessKeyId=SOMEKEY&Expires=SOMENUMBER&x-amz-security-token=SOMETOKEN
对于具有public-read
ACL的s3对象,所有GET参数都是不必要的。
我可以欺骗并使用在没有GET参数的情况下重写URL但是感觉不洁净和黑客。
如何使用boto3向我提供公共链接,例如https://my-bucket.s3.amazonaws.com/my-key/my-object-name
?换句话说,如何跳过generate_presigned_url
中的签名步骤?我没有看到像generated_unsigned_url
函数那样的东西。
答案 0 :(得分:2)
我找到的最佳解决方案仍然是使用generate_presigned_url
,只需将Client.Config.signature_version
设置为botocore.UNSIGNED
。
以下内容返回没有签名内容的公共链接。
config.signature_version = botocore.UNSIGNED
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key})
关于boto3存储库的相关讨论是: