我一直在使用 terraform 定义一些 SNS 主题,然后使用 SQS 队列来订阅它们,然后这些队列具有由 SQS 触发的 lambda 并从这些队列中获取消息。
Terraform 处理 SNS 主题、SQS 队列的创建以及允许 SNS 将消息写入队列的策略。 lambda 通过无服务器 CLI 工具单独部署。
当我首先运行 terraform,然后部署 lambda 时,所有这些似乎都工作正常。然而,我在 terraform 中所做的一些事情遇到了一些问题,所以我决定拆除整个基础设施并重新创建它,这似乎又工作得很好。
看看从未被删除的 lambda,它们仍然具有指向门户中显示的队列的链接,正如我所期望的那样。如果我转到新的 SQS 队列,我可以看到它在“Lambda 触发器”选项卡中正确列出了 lambda。
但问题是没有消息被接收,我可以看到它们都堆积在队列中。我发现解决该问题的唯一方法是进入每个 lambda,选择 SQS 队列并将它们全部切换为“禁用”,然后再次“启用”。此时,他们都开始处理队列中的消息。
还有其他人经历过吗?有没有更好的方法让它们在重新创建时正确地与队列“重新关联”?
我也被这个咬过。用户界面在这里隐藏得有点太多了。当您在 SQS 和 Lambda 之间创建订阅时,会创建一个事件源映射。通过 CLI,您可以看到:
$ aws lambda list-event-source-mappings --function-name sqs-lambda
{
"EventSourceMappings": [
{
"UUID": "8b182e29-f8b4-4637-b4fa-079923ec0bf9",
"BatchSize": 10,
"EventSourceArn": "arn:aws:sqs:us-west-2:123456789:lamba-sqs-queue",
"FunctionArn": "arn:aws:lambda:us-west-2:123456789:function:sqs-lambda",
"LastModified": "2020-04-24T15:43:28.192000-06:00",
"State": "Enabled",
"StateTransitionReason": "USER_INITIATED"
}
]
}
但是,如果我删除队列并重新创建它,即使 SQS 队列和 Lambda 具有相同的 ARN,映射也是无效的。
我这样做的方法是首先删除事件源映射:
aws lambda delete-event-source-mapping --uuid <uuid-of-your-mapping>
然后重新创建它:
aws lambda create-event-source-mapping --event-source-arn arn:aws:sqs:us-west-2:123456789:lamba-sqs-queue --function-name sqs-lambda
However- 请注意,就像需要一分钟左右才能重新创建同名的 SQS 队列一样,也需要一分钟左右才能重新创建事件源映射。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)