如何让AWS Lambda同步等待AWS Glue爬虫完成后执行后续任务
解决方案
方法1:在Lambda内轮询Glue爬虫状态
启动爬虫后,通过循环调用Glue API检查状态,直到爬虫完成再执行后续任务,适合运行时间较短的爬虫(不超过Lambda最大执行时长15分钟)。
具体流程:
- 调用
start_crawler启动目标爬虫 - 每隔固定时间(比如30秒)调用
get_crawler获取爬虫状态 - 当爬虫状态变为
READY且last_crawl状态为SUCCEEDED时,执行SNS通知和ETL操作;若爬虫失败,可触发告警逻辑 - 注意设置合理的轮询间隔,避免API调用过于频繁触发限流
Python示例代码片段:
import boto3 import time glue_client = boto3.client('glue') sns_client = boto3.client('sns') def lambda_handler(event, context): crawler_name = "your-crawler-name" # 启动爬虫 glue_client.start_crawler(Name=crawler_name) # 轮询状态 while True: crawler_info = glue_client.get_crawler(Name=crawler_name) current_state = crawler_info['Crawler']['State'] last_crawl_status = crawler_info['Crawler']['LastCrawl']['Status'] if current_state == 'READY': if last_crawl_status == 'SUCCEEDED': # 执行SNS通知 sns_client.publish( TopicArn='your-sns-topic-arn', Message='Glue爬虫已完成,开始ETL任务' ) # 启动ETL作业 glue_client.start_job_run(JobName='your-etl-job-name') break else: # 爬虫失败告警 sns_client.publish( TopicArn='your-alarm-topic-arn', Message=f'Glue爬虫执行失败,状态:{last_crawl_status}' ) break time.sleep(30)
方法2:用CloudWatch Events触发后续任务
让原Lambda仅负责启动爬虫,通过CloudWatch Events捕获爬虫完成事件,触发单独的Lambda执行SNS和ETL,避免原Lambda长时间占用资源。
具体流程:
- 原Lambda只保留启动爬虫的逻辑
- 在CloudWatch Events中创建规则:选择
Glue服务,事件类型为Crawler State Change,指定目标爬虫名称,过滤状态为SUCCEEDED(可按需添加失败状态) - 将规则目标设置为新的Lambda函数,该函数负责执行SNS通知和ETL操作
- 配置IAM权限:确保CloudWatch Events有权触发Lambda,新Lambda拥有调用SNS和Glue ETL的权限
注意事项
- 权限配置:根据使用的方法,给Lambda分配对应的
glue:GetCrawler、glue:StartJobRun、sns:Publish等权限 - 错误处理:必须处理爬虫失败的场景,避免遗漏告警或执行无效任务
- 时长限制:若爬虫运行时间超过15分钟,优先选择方法2
内容的提问来源于stack exchange,提问作者anonggd
相关产品推荐
相关产品推荐

