从Lambda函数读取AWS S3中Excel文件时出现超时问题
问题描述
我编写了如下代码:
import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } import pandas as pd import pyodbc import boto3 aws_id = 'xxxxxxxxxxxxxx' aws_secret = 'xxxxxxxxxxxxxxxxxxxxxx' s3 = boto3.client('s3',aws_access_key_id=aws_id, aws_secret_access_key=aws_secret) response = s3.get_object(Bucket='testesolaire', Key='globalterrorismdb_0522dist.xlsx') data = response['Body'].read().decode('utf-8')
但在执行data = response['Body'].read().decode('utf-8')这一行时,出现了Task timed out after 62.06 seconds的错误,具体报错信息如下:
Response { "errorMessage": "2023-01-08T08:24:17.460Z ebe0a951-8656-4736-8871-0b325ac17f63 Task timed out after 62.06 seconds" }
我已尝试将Lambda函数的「常规配置>超时」选项调整为15分钟,但问题仍未解决,请问可能是什么原因导致的?
可能的原因及解决方向
- 代码执行顺序错误:Lambda仅会执行
lambda_handler函数内的逻辑,你当前在函数外编写的S3读取代码,只会在冷启动阶段执行部分逻辑,不会完整运行。需将所有S3相关操作代码移至lambda_handler函数内部。 - 权限不足:若Lambda执行角色未被授予
s3:GetObject权限,或目标S3桶的访问策略未允许该角色访问,会导致请求挂起超时。检查Lambda角色的权限配置和S3桶的资源策略。 - 二进制文件处理错误:
.xlsx是二进制格式文件,使用decode('utf-8')解码会引发异常,甚至卡住进程。正确做法是直接读取二进制内容,交给pandas处理,例如使用pd.read_excel(response['Body']),无需手动解码为UTF-8。 - VPC网络限制:如果Lambda配置了VPC,但该VPC未配置S3网关端点或NAT网关,Lambda无法访问公网S3服务,会导致请求超时。检查VPC路由表是否包含S3访问路由。
- 文件体积过大:若目标Excel文件体积庞大,在Lambda中直接读取处理会消耗大量内存和时间,即使设置15分钟超时也可能因资源不足或传输缓慢超时。建议使用S3事件触发+Glue服务处理大文件,或在Lambda中实现分段读取逻辑。
内容的提问来源于stack exchange,提问作者Astora
相关产品推荐
相关产品推荐

