【问题标题】:AWS Lambda timesout with boto3.resource('s3')AWS Lambda 超时与 boto3.resource('s3')
【发布时间】:2020-07-04 05:20:28
【问题描述】:

我创建了一个 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-services amazon-s3 aws-lambda timeout boto3


    【解决方案1】:

    您使用的是高级Resource API 调用,而不是低级Client API 调用。

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

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

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

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

    【讨论】:

    • 另一个选项是S3 VPC Endpoint
    • @kichik 是的,我两次提到该选项。如果合适的话,这是一个不错的选择。
    • 糟糕,错过了。对不起!
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2018-08-28
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多