如何配置serverless.yml实现SQS收消息时条件触发Lambda
serverless.yml 配置SQS触发Lambda的正确方案
你已经完成SQS基础收发能力的前提下,直接通过事件源映射配置就能实现新消息触发新增Lambda,以下是可直接复用的配置,分两种常见场景:
场景1:复用已存在的SQS队列(适配你当前已开发完的队列)
这个场景不需要改动现有队列配置,直接在serverless.yml里补Lambda触发配置和对应权限即可:
service: your-service-name provider: name: aws runtime: python3.9 # 替换为你实际使用的Lambda运行时,比如nodejs18.x、java17等 region: cn-north-1 # 替换为你的SQS队列所在的AWS区域 iam: role: statements: # 给Lambda授予SQS消费的必要权限,缺失会导致拉取消息失败 - Effect: Allow Action: - sqs:ReceiveMessage - sqs:DeleteMessage - sqs:GetQueueAttributes Resource: arn:aws:sqs:cn-north-1:123456789012:your-exist-sqs-name # 替换为你现有SQS队列的完整ARN # 如果你的SQS用自定义KMS密钥做了服务端加密,需要补下面这段权限 # - Effect: Allow # Action: # - kms:Decrypt # Resource: arn:aws:kms:cn-north-1:123456789012:key/your-kms-key-id functions: sqs-triggered-lambda: # 你新增的业务Lambda handler: src/lambda/triggerHandler.main # 替换为你的函数实际入口路径 events: - sqs: arn: arn:aws:sqs:cn-north-1:123456789012:your-exist-sqs-name # 和上面的队列ARN保持一致 batchSize: 5 # 单次触发Lambda最多投递的消息数量,取值范围1-10000,按业务并发承受能力调整 maximumBatchingWindow: 5 # 消息攒批最长等待时间,单位秒,取值0-300,要低延迟就设为0 enabled: true # 设为false可临时暂停触发,不用删配置 # 以下就是你需要的「预设触发条件」配置,AWS侧会直接过滤不符合规则的消息,不会触发Lambda,省调用成本 filterPatterns: - body: bizType: ["pay_success", "refund_done"] # 示例:仅消息体里bizType字段为指定值时触发,支持按消息属性、正文多维度匹配
- 过滤规则支持精确匹配、前缀匹配、数值范围匹配等多种规则,过滤逻辑在AWS侧执行,比代码里做判断省成本;不符合规则的消息不会被消费删除,会留在队列里供其他消费者处理
- 不要盲目把
batchSize设到最大值,避免单条消息处理失败导致整批消息重复回队列重试,影响正常消息消费 - 如果队列开了死信队列配置,重试次数达到阈值的消息会自动投递到死信队列,不会阻塞正常队列消费
场景2:由Serverless框架自动创建新的SQS队列作为触发源
如果不需要复用现有队列,配置更简单,框架会自动帮你创建队列、补全权限,不用手动填ARN:
functions: sqs-triggered-lambda: handler: src/lambda/triggerHandler.main events: - sqs: queueName: auto-created-trigger-queue batchSize: 10 filterPatterns: - messageAttributes: env: - "prod"
配置验证方式
部署执行serverless deploy完成后,去AWS SQS控制台找到对应队列,在「Lambda触发器」标签页能看到你刚部署的函数,就说明关联生效,往队列发符合过滤规则的测试消息即可触发Lambda执行。
内容的提问来源于stack exchange,提问作者Ripunjai Rai
相关产品推荐
相关产品推荐

