如何按5分钟周期并发调用带不同参数的AWS Lambda函数
嘿,我来给你分享几个AWS生态里适配你需求的方案,都是实际项目里常用的做法,刚好能满足你每5分钟并发100次调用Lambda、每次传不同数字参数的需求:
这个方案最直接,完全用AWS原生服务组合,不需要额外工具,上手快。
第一步:搞定你的目标Lambda
就是你提供的那个处理数字的函数,确保它能正确接收event['number']参数就行,代码示例:def lambda_handler(event, context): number = event['number'] # 这里写你的业务逻辑,比如计算、存储数据啥的 print(f"正在处理数字:{number}") return {"statusCode": 200, "body": f"处理完成:{number}"}第二步:写个调度Lambda来分发任务
这个Lambda的作用就是每5分钟被触发后,拉取你的数字列表,然后批量异步调用目标Lambda,控制每次并发100个。用boto3的异步调用方式就行:import boto3 import math lambda_client = boto3.client('lambda') # 替换成你的目标Lambda名称 TARGET_LAMBDA_NAME = 'your-target-lambda-name' # 你要求的每次并发数 MAX_CONCURRENT = 100 def lambda_handler(event, context): # 这里替换成你的数字列表获取逻辑,比如从S3读文件、DynamoDB查数据 number_list = [1,5,6,7,8,19,20,...] # 最多1000个元素都没问题 # 把列表拆成每批100个,确保每次并发不超量 batches = [number_list[i:i+MAX_CONCURRENT] for i in range(0, len(number_list), MAX_CONCURRENT)] for batch in batches: # 对当前批次的每个数字,异步调用目标Lambda(异步调用会立即返回,后台执行) for num in batch: lambda_client.invoke( FunctionName=TARGET_LAMBDA_NAME, InvocationType='Event', Payload=f'{{"number": {num}}}' ) # 要是你需要等当前批次都处理完再跑下一批,可以加个等待逻辑(一般不需要,除非有依赖) return {"statusCode": 200, "body": f"已触发{len(number_list)}次Lambda调用"}第三步:用EventBridge设置定时触发
去AWS控制台创建一个EventBridge规则,调度表达式选rate(5 minutes),目标选你的调度Lambda。这样每5分钟就会自动触发任务分发啦。
如果担心异步调用丢消息,或者需要更可靠的任务传递,可以加个SQS队列做中间层,还能更好地控制并发:
第一步:创建SQS队列
建一个标准SQS队列,然后把目标Lambda的事件源配置成这个队列。在Lambda的事件源设置里,把批量大小设为100,或者给目标Lambda设置预留并发100,确保每次最多100个实例同时处理消息。第二步:写调度Lambda发消息到SQS
这个Lambda负责把数字列表里的每个数字变成一条消息发到SQS:import boto3 sqs_client = boto3.client('sqs') # 替换成你的SQS队列URL QUEUE_URL = 'your-sqs-queue-url' def lambda_handler(event, context): number_list = [1,5,6,7,8,19,20,...] # SQS批量发消息最多一次10条,所以拆成小批量 entries = [{'Id': str(i), 'MessageBody': f'{{"number": {num}}}'} for i, num in enumerate(number_list)] for i in range(0, len(entries), 10): batch = entries[i:i+10] sqs_client.send_message_batch(QueueUrl=QUEUE_URL, Entries=batch) return {"statusCode": 200, "body": f"已向SQS发送{len(number_list)}条消息"}第三步:EventBridge定时触发调度Lambda
同样用rate(5 minutes)的规则触发调度Lambda,之后SQS会自动把消息推给Lambda处理,并发数由你之前的配置控制。
如果需要更复杂的流程控制(比如失败重试、监控执行状态),用Step Functions会更直观,还能可视化整个工作流:
你需要创建一个Step Functions状态机,大概包含几个环节:
- 定时触发:用EventBridge每5分钟触发状态机
- 获取数字列表:调用一个Lambda拉取你的数字列表
- 并行执行:设置最大并发数为100,把每个数字分配到一个并行分支,每个分支调用目标Lambda处理
- 可选:等待完成:等所有并行任务都完成后做后续处理(比如汇总结果)
给你个简化版的状态机JSON配置参考:
{ "Comment": "并行处理数字列表的Lambda调用", "StartAt": "获取数字列表", "States": { "获取数字列表": { "Type": "Task", "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:GetNumberListLambda", "Next": "处理数字" }, "处理数字": { "Type": "Map", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE", "ExecutionType": "STANDARD" }, "StartAt": "调用目标Lambda", "States": { "调用目标Lambda": { "Type": "Task", "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:TargetLambda", "End": true } } }, "ItemsPath": "$.numberList", "MaxConcurrency": 100, # 这里设置并发数为100 "End": true } } }
- Lambda并发配额:AWS默认Lambda并发是1000,你每次并发100,处理1000个元素最多需要10批,完全在配额内。要是以后需要更高并发,可以给AWS提配额申请。
- 数字列表的来源:别把数字列表硬编码在Lambda里,建议存在S3、DynamoDB或者Parameter Store里,方便随时更新。
- 错误处理:不管用哪个方案,都要加错误处理,比如异步调用的重试、SQS的死信队列、Step Functions的重试策略,确保每个数字都被处理到。
内容的提问来源于stack exchange,提问作者Azhar

