首页 > 解决方案 > AWS Lambda 超时与 boto3.resource('s3')

问题描述

我创建了一个 lambda 来在文件上传到存储桶时做出反应。我的第一个操作是使用 boto3 检索文件的 version_id。下面是一个根据桶和密钥获取 version_id 的函数。s3_resource.Object通话似乎工作正常。但是如果我取消注释打印实际 version_id 的行,那么我的 lambda 超时(超时设置为 120 秒)。

对象本身的打印似乎工作正常,只有当我尝试打印它超时的 version_id 时。这对 NAT 网关有影响吗?

def get_file_version_id(bucket, key):
    s3_resource = boto3.resource('s3')
    file_obj = s3_resource.Object(bucket,key)
    print(f'file_obj: {file_obj}')
    #print(f'version_id: {file_obj.version_id}')
    #return file_obj.version_id
    return "Some Return Value"

标签: amazon-web-servicesamazon-s3aws-lambdatimeoutboto3

解决方案


您正在使用高级资源API 调用而不是低级客户端API 调用。

资源,例如s3.Bucket 具有属性,这些是延迟加载的属性。所以,当你创建一个s3.Object,那是一个纯粹的本地事情。但是,当您尝试访问其属性之一时,例如现有对象的内容或其版本 ID,boto3 SDK 将对 S3 服务进行实际 API 调用。

您的代码超时的原因很可能是您没有通往 S3 服务的网络路径。这可能意味着您在 VPC 中运行 Lambda 函数,并且您已将其部署在公共子网或私有子网中,而没有通过 NAT 和 Internet 网关或 S3 VPC 端点为该子网提供到 Internet 的默认路由.

因此,要么在 VPC 之外部署您的 Lambda 函数。或者,如果您需要它位于 VPC 中,则将其部署到您的 VPC 的私有子网(不是公有子网)中,然后确保您的公有子网中有 IGW 和 NAT 以及从 Lambda 的私有子网到的默认路由NAT。或者,也可以使用私有子网和 S3 VPC 终端节点路由。

PS 检查event传递给您的 Lambda 函数处理程序的参数,以防它实际上为您提供版本 ID。我不确定它是否有效,但最好检查一下。


推荐阅读