运行如下一行:
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函数的东西。
我发现的最好的解决方案仍然是使用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 存储库上的相关讨论是: