可以从此设置触发 SNS:
我已阅读:
- AWS Lambda SNS Destinations not working on failure or success
- AWS Lambda w/ SQS trigger, SQS Lambda Destinations, never adds to destination queue
但我不太明白。
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 主题 SO-76795744,点击“发布消息”,输入主题和消息正文并发送。
您应该会收到一封来自 SNS 的电子邮件,证明 SNS 正在运行。
最佳答案
这是因为 SQS->Lambda 工作流程使用同步
调用(请参阅官方文档 here ),因此不会使用您的 SNS 目标,因为它仅适用于异步 lambda。
虽然从客户端的角度来看,SQS->Lambda 流程本身是异步的,但在 AWS 后端实现 SQS 到 Lambda 的方式是使用 sync
lambda 调用:AWS Lambda 定期轮询 SQS 队列,如果发现然后,它会使用请求/响应调用类型(同步)调用您的 Lambda 函数。然后,AWS Lambda 服务等待 Lambda 响应来决定是否需要从 SQS 队列中删除消息(如果收到 200/成功响应),或者消息是否需要保留在队列中以便稍后重试(如果响应不成功)。我怀疑需要获得此响应是 AWS 使用同步调用的原因。
关于amazon-web-services - SQS 到 Lambda 到 SNS 可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76795744/