我创建了一个lambda,用于在文件上传到bucket时做出反应。我的第一个操作之一是使用boto3检索文件的version\id。下面是一个基于bucket和key获取version_id的函数。s3_resource.Object
调用似乎工作正常。但是,如果我取消对打印实际version\id的行的注释,那么我的lambda将超时(超时设置为120s(。
对象本身的打印似乎很好,只有当我尝试打印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"
您使用的是高级Resource API调用,而不是低级Client API调用。
资源(如s3.Bucket
(具有属性,这些属性是延迟加载的属性。因此,当您创建一个s3.Object
时,这是一个纯粹的本地事务。但是,当您试图访问其属性时,例如现有对象的内容或其版本ID,boto3 SDK将对S3服务进行实际的API调用。
代码超时的原因很可能是您没有S3服务的网络路径。这可能意味着你在专有网络中运行Lambda功能,并且你已经将其部署在公共子网或私有子网中,而没有通过NAT和互联网网关或S3专有网络端点为该子网提供默认的互联网路由。
因此,您可以在VPC之外部署Lambda功能。或者,如果你需要它在VPC中,那么将它部署到你的VPC的私有子网(而不是公共子网(中,然后确保你的公共子网中有IGW和NAT,以及从Lambda的私有子网上到NAT的默认路由。或者,选择私有子网和S3 VPC端点路由。
PS检查传递到Lambda函数处理程序中的event
参数,以防它实际为您提供版本ID。我不确定它是否提供,但最好检查一下。