AWS Lambda无有效调试日志且超时问题求助
排查基于ECR镜像的AWS Lambda超时问题
错误日志
OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k START RequestId: a22379c9-427c-45ab-bfd5-c166bf507418 Version: $LATEST 2023-04-29T15:45:42.496Z a22379c9-427c-45ab-bfd5-c166bf507418 Task timed out after 600.11 seconds END RequestId: a22379c9-427c-45ab-bfd5-c166bf507418 REPORT RequestId: a22379c9-427c-45ab-bfd5-c166bf507418 Duration: 600108.83 ms Billed Duration: 601489 ms Memory Size: 256 MB Max Memory Used: 154 MB Init Duration: 1379.93 ms
问题根源分析
- 递归调用无返回值导致死循环:
make_get_request函数中,遇到ConnectionError或Timeout异常时,递归调用自身但未返回结果。若请求持续失败,会陷入无限递归,直至Lambda达到超时上限。 - 反爬机制触发导致请求阻塞:代码未添加请求延迟,Stepstone的反爬策略会对高频请求进行限制,导致请求挂起无法完成。
- 入口函数嵌套定义错误:
main函数被嵌套在extract_and_append_skills函数内部,Lambda无法正确识别入口函数,引发执行异常或卡住。 - 分页逻辑错误:
range(get_pages())生成的循环从0开始,但Stepstone的分页参数page_selected从1起始,导致第一页请求无效,后续处理停滞。 - 资源配置不足:Lambda内存设置为256MB,CPU和网络带宽与内存正相关,较低的内存会拖慢请求处理速度,爬取大量页面时易超时。
修复方案
修复递归调用的返回值
在make_get_request的异常处理中,添加返回值并传入URL参数,建议配套添加重试次数限制(可使用tenacity库替代手动递归):except (ConnectionError, requests.exceptions.Timeout) as err: print(f"Failed to connect to the API, retrying... Error: {err}") return make_get_request(max_retries, URL)添加请求延迟规避反爬
在爬取每个职位详情后添加延迟,避免触发网站反爬机制:def extract_and_append_skills(cards, job_df): for card in cards: # 原有过滤逻辑 keywords, title, href, company_name = extract_keywords(card) append_to_df(keywords, job_df, title, company_name, href) sleep(1) # 添加1秒延迟,可根据实际情况调整修正函数嵌套结构
将main函数移到extract_and_append_skills函数外部,确保Lambda能正确识别入口函数:def extract_and_append_skills(cards, job_df): # 函数原有逻辑 def main(event, context): job_df = pd.DataFrame(columns=COLUMNS) try: # main函数原有逻辑 except Exception as e: print(e)调整分页循环起始值
匹配Stepstone的分页规则,从1开始循环获取页面:for i in range(1, get_pages() + 1): cards = extract_job_cards('data-engineer', 1, i) extract_and_append_skills(cards, job_df)提升Lambda资源配置
将内存大小调整为512MB或更高,同时保持超时设置为600秒,提升CPU和网络处理性能:resource "aws_lambda_function" "job_scraping_function" { package_type = "Image" image_uri = "${aws_ecr_repository.scraping_repo.repository_url}:latest" function_name = "job_scraping_function" role = aws_iam_role.lambda_s3_role.arn memory_size = 512 timeout = 600 depends_on = [null_resource.docker_build_and_push] }
内容的提问来源于stack exchange,提问作者paul445
相关产品推荐
相关产品推荐

