如何使 SDK 与 S3 存储桶的连接保持持久?

Soh*_*eil 0 python amazon-s3 amazon-web-services boto3

我正在使用该boto3库将对象放入 Amazon S3 中。我想在我的服务器上创建一个 python 服务,该服务连接到 AWS 中的存储桶,每当我向它发送文件路径时,它都会将其放入存储桶中:

s3_resource = boto3.resource(
    's3',
    endpoint_url='...',
    aws_access_key_id='...',
    aws_secret_access_key='...'
)
bucket = s3_resource.Bucket('name')
Run Code Online (Sandbox Code Playgroud)

为了上传,我将请求发送到此方法:

def upload(path):
    bucket.put_object(...)
Run Code Online (Sandbox Code Playgroud)

与存储桶的连接应该是持久的,这样每当我调用upload方法时,它都会快速将对象放入存储桶中,而不需要每次都连接到存储桶。

如何在我的 上启用长期连接s3_resource

Mau*_*ice 5

编辑

SDK 试图成为底层 API 调用的抽象。每当您想要将对象放入 S3 存储桶时,都会导致 API 调用。API 调用通过网络发送到 AWS,这需要建立与 AWS 服务器的连接。此连接可以保持打开状态更长时间,因此不需要每次进行 API 调用时都重新建立连接。这有助于减少网络开销,因为建立连接的成本相对较高。

从您的角度来看,这些应该是实现细节,您不必担心,因为 SDK (boto3) 会为您处理这些问题。有一些选项可以调整它处理事情的方式,但这些被认为是高级选项,你应该知道你在做什么;-)

boto3 中资源的生命周期或多或少独立于底层网络连接。当没有可以重新利用的预先存在的连接时,您将看到这种影响的方式是通过更高的延迟。


您正在寻找的是 boto3 中的保持活动选项。

可以在两个级别上启用这些功能:

传输控制协议

  • 您可以在 SDK 配置中设置该选项,默认tcp_keepalive设置为。false
  • 有关更多详细信息,请参阅文档

HTTP协议

  • 对于 HTTP-Keep 活动,您无需显式执行任何操作 - 底层库会隐式处理该操作。来解决这个问题时,有一个常见的优化建议,但 SDK 的行为不同,这在 Python 中是不必要的。在Github 的一个问题中对此进行了很长的讨论。
  • 如果您想明确设置配置设置,您可以使用事件系统来执行此操作,如下回复所示:
def set_connection_header(request, operation_name, **kwargs):
    request.headers['Connection'] = 'keep-alive'

ddb = boto3.client('dynamodb')
ddb.meta.events.register('request-created.dynamodb', set_connection_header)
Run Code Online (Sandbox Code Playgroud)