使用boto3获取公共可访问的s3对象的URL,没有过期或安全信息

时间:2018-01-10 21:58:57

标签: python boto3

运行如下行:

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函数那样的东西。

1 个答案:

答案 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存储库的相关讨论是: