使用SQS接收SES消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SQS接收SES消息相关的知识,希望对你有一定的参考价值。

参考技术A 前提:

必须开通aws的3个服务:SES、SNS、SQS

业务流程:

1. SES将消息(发送、退回、投诉、拒收)发送给SNS

2. SNS根据订阅接口,将消息推送给指定的SQS

3. SQS接收到消息后存入队列,供其他接口、程序轮循使用

配置流程:

1. 配置SQS

1-1. 创建新的队列,生成队列ARN(该ARN会在SNS订阅中使用)

2. 配置SNS

2-1. 创建新的Topic(主题),设定Name(该name会在SES通知中作为备选项),生成Topic ARN(该ARN会在SQS权限配置中使用)

2-2. 创建新的Subscriptions(订阅),设置消息接收对象(邮箱、SQS服务),如果设置SQS这里会使用SQS对应的ARN

3. 配置SQS权限

3-1. 添加权限,指定"条件" ArnEquals "键"aws:SourceArn "值"(SNS对应ARN)

4. 配置SES通知

4-1. SES >> Domain >> 点击域名 >> Notifications 中添加对应的设置。

测试:

1. 测试SNS与SQS的连通,在SNS中手动发送一条信息,查看SQS中的消息轮循是否有该消息

2. 测试SES与SNS的连通,通过SES SDK接口给不存在的邮箱地址发送邮件,看SQS中的消息轮循是否有该消息(注意:Deliveries设置似乎没有作用,也有可能是Deliveries消息有延时)

消息发布到 SQS 时如何触发 lambda?

【中文标题】消息发布到 SQS 时如何触发 lambda?【英文标题】:How to trigger lambda when messages published to SQS? 【发布时间】:2019-08-16 23:20:18 【问题描述】:

我正在尝试实现将在消息发布到 SQS 时触发的 lambda1。我能够将消息发送到 SQS 队列并接收消息。 我按如下方式创建了 SQS lambda 模板:

  GetPatientStatusSQS:
    Type: AWS::SQS::Queue
    Properties:
      MaximumMessageSize: 1024
      QueueName: !Sub "$EnvironmentName-GetPatientStatusSQS"
      VisibilityTimeout: 30

我查看了 aws 文档,但找不到任何示例来说明当消息发布到 SQS 队列时如何触发 lambda。

我找到了这个链接Can an AWS Lambda function call another,但不确定这是否有用。

如何更新上面的 SQS 模板以触发 lambda1?

【问题讨论】:

【参考方案1】:

截至 2018 年 6 月 28 日,Lambda functions can be triggered by SQS events。

您需要做的就是将您的 Lambda 函数订阅到所需的 SQS 队列。

转到 SQS 的控制台,单击您的队列 -> 队列操作 -> 为 Lambda 函数配置触发器

设置您要向其发送消息的 Lambda 的 ARN,就是这样,您的函数现在将由 SQS 触发。

请记住,您的函数一次最多可以处理一批最多 10 条消息。

如果您认为可能会遇到并发问题,则可以将函数的并发限制为 1。

这是一个示例模板,可用于将 SQS 和 Lambda 连接在一起。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Example of processing messages on an SQS queue with Lambda
Resources:
  MySQSQueueFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: node8.10
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt MySqsQueue.Arn
            BatchSize: 10
  MySqsQueue:
    Type: AWS::SQS::Queue

来自docs

【讨论】:

感谢您的链接,有时很难跟上! 不客气。现在想象一下,对于我们这些不在 AWS 工作的普通人来说,要跟上你们每年发布大量服务的步伐是多么困难。请放慢速度:p @ThalesMinussi 谢谢,但我知道如何从 aws 控制台触发 lambda。我要问的是如何更新 SQS 模板 yaml 以触发另一个 lambda。 你能解释一下yaml中的一些部分吗?大概我们用 SQS 的 arn 替换“MySqsQueue.Arn”?下面几行的“MySqsQueue:”怎么样?这应该是 SQS 的名称吗? 终于找到错误了!取名很讲究!我为我的项目队列使用了标准的 CamelCase 名称,并没有考虑它,但由于某种原因,“DbfToEaLambdaQueue”不起作用,但“MySqsQueue”很好。只是发帖以防其他人被困在这个问题上!这是自动生成的 arn 必须满足的正则表达式: arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\-])+:([az]2( (-gov)|(-iso(b?)))?-[az]+-\d1)?:(\d12)?:(.*) 再次感谢泰雷兹

以上是关于使用SQS接收SES消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS 无服务器和 NodeJS 在接收器 lambda 处未接收到来自 SQS 的所有消息

Amazon SQS 可见性超时

SQS 接收消息的正确解析是啥?

Amazon SQS“接收计数”只会增加

java 从SQS队列接收消息

从 AWS SQS 获取消息的延迟