AWS Lambda SQS 触发器在队列重建后未触发
AWS Lambda SQS Trigger not firing after queue recreation
我一直在使用 terraform 来定义一些 SNS 主题,然后使用 SQS 队列来订阅它们,然后这些队列具有由 SQS 触发的 lambda 并从这些队列中获取消息。
Terraform 处理 SNS 主题、SQS 队列的创建以及允许 SNS 将消息写入队列的策略。 lambda 表达式通过无服务器 CLI 工具单独部署。
当我先 运行 terraform 然后部署 lambda 时,所有这些似乎都工作正常。但是,我在 terraform 中做的一些事情遇到了一些问题,所以我决定拆除整个基础设施并重新创建它,这似乎又能正常工作。
查看从未被删除的 lambda,他们仍然有 link 队列显示在门户中,正如我所期望的那样。如果我转到新的 SQS 队列,我可以看到它列出了 'Lambda Triggers' 选项卡中正确列出的 lambda。
问题是没有消息被接收,我可以看到它们都堆积在队列中。我发现解决问题的唯一方法是进入每个 lambda,select SQS 队列并将它们全部切换到 'disabled',然后再次切换到 'enabled'。此时他们都开始处理队列中的消息。
有没有其他人遇到过这种情况?有没有更好的方法让它们在重新创建时正确地进入 're-associate' 队列?
我也被这个坑了。 UI 在这里隐藏得太多了。当您在 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
但是 - 请注意,就像需要一分钟左右的时间才能重新创建具有相同名称的 SQS 队列一样,需要一分钟左右的时间才能重新创建事件源映射。
我一直在使用 terraform 来定义一些 SNS 主题,然后使用 SQS 队列来订阅它们,然后这些队列具有由 SQS 触发的 lambda 并从这些队列中获取消息。
Terraform 处理 SNS 主题、SQS 队列的创建以及允许 SNS 将消息写入队列的策略。 lambda 表达式通过无服务器 CLI 工具单独部署。
当我先 运行 terraform 然后部署 lambda 时,所有这些似乎都工作正常。但是,我在 terraform 中做的一些事情遇到了一些问题,所以我决定拆除整个基础设施并重新创建它,这似乎又能正常工作。
查看从未被删除的 lambda,他们仍然有 link 队列显示在门户中,正如我所期望的那样。如果我转到新的 SQS 队列,我可以看到它列出了 'Lambda Triggers' 选项卡中正确列出的 lambda。
问题是没有消息被接收,我可以看到它们都堆积在队列中。我发现解决问题的唯一方法是进入每个 lambda,select SQS 队列并将它们全部切换到 'disabled',然后再次切换到 'enabled'。此时他们都开始处理队列中的消息。
有没有其他人遇到过这种情况?有没有更好的方法让它们在重新创建时正确地进入 're-associate' 队列?
我也被这个坑了。 UI 在这里隐藏得太多了。当您在 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
但是 - 请注意,就像需要一分钟左右的时间才能重新创建具有相同名称的 SQS 队列一样,需要一分钟左右的时间才能重新创建事件源映射。