SQS 到 Lambda 到 SNS 可能吗?

问题描述 投票:0回答:1

此设置是否可以触发 SNS:

我已阅读:

但我不太明白。

Lambda 的 SNS 目标未被触发,但 SQS 发送到 Lambda 并且 Lambda 成功完成。

目前发生了什么?

SQS 发送到 Lambda,但 Lambda 不发送到 SNS。 Lambda 没有响应发送到 SNS。是因为我使用 SQS 作为触发器吗?我希望 Lambda 将响应发送到 SNS。

我尝试了什么

我已经使用 boto3 (python) 在 Lambda 函数内触发 SNS,并且它有效,但我宁愿在 Lambda 函数完成时触发 SNS。

我想做什么?

我从基于 python 的后端向 SQS 发送有效负载(事件)。我选择 SQS 是因为我希望在 lambda 函数由于某种原因失败时重试。成功完成后,我想将 Lambda 响应发送到 SNS HTTPS 端点,该端点将发送到我的后端 Webhook。


冗长的解释和娱乐步骤:

步骤:

  • 转到SQS,创建名为“SO-76795744”的队列,保留所有默认值,单击“创建队列”。
  • 转到 Lambda,创建名为“SO-76795744”的函数,Python 3.10,x86_64,保留其余默认值,单击“创建函数”
  • Lambda 提供的默认 Lambda 函数代码可以工作,但您也可以使用它来查看 Cloudwatch 中的事件消息:
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    # TODO implement
    logger.info('Lambda function is executing!')
    logger.info(json.dumps(event))
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
  • 进入SNS,创建名为“SO-76795744”的主题,选择“标准”,一切保持默认,点击“创建主题”
  • 使用以下命令编辑 Lambda 的执行角色策略:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:log-group:/aws/lambda/SO-76795744:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage",
                "sqs:DeleteMessage",
                "sqs:GetQueueAttributes"
            ],
            "Resource": [
                "arn:aws:sqs:*:*:SO-76795744"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:*:*:SO-76795744"
        }
    ]
}
  • 回到lambda函数,添加SQS触发器,批量大小1,点击添加
  • 转到 lambda 函数,添加 SNS 目的地、异步调用、成功时、SNS 主题、SO-76795744 主题,单击“保存”
  • 转到 SNS 主题,订阅“Email-JSON”以进行测试,确认订阅

测试SQS

  • 进入SQS
    SO-76795744
    ,点击“发送和接收消息”按钮,在消息正文中输入任何内容,然后点击“发送消息”
  • 进入 Lambda 函数 > 监控选项卡,点击“查看 Cloudwatch 日志”,验证唯一日志

请注意,您将不会通过电子邮件收到 SNS 消息。你就是不会。我的问题是为什么?

测试SNS

  • 前往SNS主题SO-76795744,点击“发布消息”,输入主题和消息正文并发送。

您应该会收到一封来自 SNS 的电子邮件,证明 SNS 正在运行。

amazon-web-services aws-lambda amazon-sqs amazon-sns
1个回答
1
投票

这是因为 SQS->Lambda 工作流程使用

synchronous
调用(请参阅官方文档此处),因此不会使用您的 SNS 目标,因为它仅适用于异步 lambda。

虽然从客户端的角度来看,SQS->Lambda 流程本身是异步的,但在 AWS 后端实现 SQS 到 Lambda 的方式是使用

sync
lambda 调用:AWS Lambda 定期轮询 SQS 队列,如果发现任何消息,则会调用您的 Lambda使用请求/响应调用类型(同步)的函数。然后,AWS Lambda 服务等待 Lambda 响应来决定是否需要从 SQS 队列中删除消息(如果收到 200/成功响应),或者消息是否需要保留在队列中以便稍后重试(如果响应不成功)。我怀疑需要获得此响应是 AWS 使用同步调用的原因。

© www.soinside.com 2019 - 2024. All rights reserved.