使用 boto3 获取公共可访问 s3 对象的 url,无需过期或安全信息

won*_*ton 6 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})
Run Code Online (Sandbox Code Playgroud)

产生如下结果:

https://my-bucket.s3.amazonaws.com/my-key/my-object-name?AWSAccessKeyId=SOMEKEY&Expires=SOMENUMBER&x-amz-security-token=SOMETOKEN
Run Code Online (Sandbox Code Playgroud)

对于具有 ACL 的 s3 对象public-read,所有 GET 参数都是不必要的。

我可以作弊并使用重写 URL 而不使用 GET 参数,但这感觉不干净且很糟糕。

如何使用 boto3 只向我提供公共链接,例如https://my-bucket.s3.amazonaws.com/my-key/my-object-name?换句话说,我如何跳过 中的签名步骤generate_presigned_url?我没有看到任何类似generated_unsigned_url函数的东西。

won*_*ton 9

我发现的最好的解决方案仍然是使用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})
Run Code Online (Sandbox Code Playgroud)

boto3 存储库上的相关讨论是: