amazon-web-services - 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"
解决方案
您正在使用高级资源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。我不确定它是否有效,但最好检查一下。
推荐阅读
- sql - 使用 SQL 将缺失值插入表中
- python - Python Dataframe 删除具有特定值的多列行
- reactjs - 定期在 React-Redux Connect 处停止调试
- javascript - Laravel 7 - 验证失败时无法检索动态选择的旧值
- python - 如何仅在 pymongo 而不是 ObjectId 中获取值
- jquery - ASP.NET MVC5 图像上传器在使用 Ajax 和 jQuery 发布表单时创建问题
- python - 在 python 中打印随机一维数组
- machine-learning - 在高斯核的情况下来自 SVM 的参数 b
- javascript - 在 React 中格式化来自 API 的响应并将其添加到状态时出现问题
- javascript - 如何修复 null 不是对象 React Native Splash Screen