在Lambda中使用S3Client似乎会冻结函数



我正在使用Lambda函数对上传的文件(图像调整大小,视频转换等)进行一些处理,但是我正在努力获得Lambda函数从S3获取任何东西。

目前在S3上传触发器上运行Lambda函数,它所要做的不是将文件从一个桶复制到另一个桶,但它似乎冻结了。

我在CloudWatch中得到一个日志,说明它已经启动,我得到文件上传…消息,然后什么也不做,直到函数超时,无论我给它多少内存或超时都会发生。

起初我认为这可能是权限,但我的lambda用户在S3上有FullPermission以及lambda,我甚至把我的桶公开。

使用的函数代码是:

public async Task<string> FunctionHandler(S3Event evnt, ILambdaContext context)
{
var s3Event = evnt.Records?[0].S3;
if(s3Event == null) return null;
try
{
context.Logger.LogLine("File Uploaded, Starting Copy");
await S3Client.CopyObjectAsync(s3Event.Bucket.Name, s3Event.Object.Key, destinationBucket, s3Event.Object.Key);
context.Logger.LogLine("Copy Completed.");

return "Finished";
}
catch(Exception e)
{
context.Logger.LogLine($"Error getting object {s3Event.Object.Key} from bucket {s3Event.Bucket.Name}. Make sure they exist and your bucket is in the same region as this function.");
context.Logger.LogLine(e.Message);
context.Logger.LogLine(e.StackTrace);
throw;
}
}

很可能您的AWS Lambda函数已配置为使用VPC.

当函数不是时使用VPC时,该功能可以直接访问Internet,从而访问Amazon S3。

但是,当一个功能配置为使用VPC时,不能直接访问Internet。如果该功能确实需要访问VPC(例如访问VPC内的资源),则可以通过以下方式授予S3访问权限:

  • 在VPC中为Amazon S3添加VPC Endpoint,或
  • 将Lambda函数连接到私有子网,然后在公共子网中启动NAT网关,在私有子网中添加路由表项,将internet绑定流量定向到NAT网关

当然,最简单的解决方案是,如果可能的话,将函数连接到VPC。

最新更新