此设置是否可以触发 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。
冗长的解释和娱乐步骤:
步骤:
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!')
}
{
"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"
}
]
}
SO-76795744
,点击“发送和接收消息”按钮,在消息正文中输入任何内容,然后点击“发送消息”请注意,您将不会通过电子邮件收到 SNS 消息。你就是不会。我的问题是为什么?
您应该会收到一封来自 SNS 的电子邮件,证明 SNS 正在运行。
这是因为 SQS->Lambda 工作流程使用
synchronous
调用(请参阅官方文档此处),因此不会使用您的 SNS 目标,因为它仅适用于异步 lambda。
虽然从客户端的角度来看,SQS->Lambda 流程本身是异步的,但在 AWS 后端实现 SQS 到 Lambda 的方式是使用
sync
lambda 调用:AWS Lambda 定期轮询 SQS 队列,如果发现任何消息,则会调用您的 Lambda使用请求/响应调用类型(同步)的函数。然后,AWS Lambda 服务等待 Lambda 响应来决定是否需要从 SQS 队列中删除消息(如果收到 200/成功响应),或者消息是否需要保留在队列中以便稍后重试(如果响应不成功)。我怀疑需要获得此响应是 AWS 使用同步调用的原因。