Ben*_*ale 1 amazon-sqs amazon-web-services amazon-sns aws-lambda
我一直在使用 terraform 来定义一些 SNS 主题,然后使用 SQS 队列来订阅它们,然后这些队列具有由 SQS 触发的 lambda,并从这些队列中获取消息。
Terraform 处理 SNS 主题、SQS 队列的创建以及允许 SNS 将消息写入队列的策略。lambdas 通过无服务器 CLI 工具单独部署。
当我首先运行 terraform,然后部署 lambdas 时,所有这些似乎都可以正常工作。但是,我在 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"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我删除队列并重新创建它,即使 SQS 队列和 Lambda 在其中具有相同的 ARN,映射也是无效的。
我这样做的方法是首先删除事件源映射:
aws lambda delete-event-source-mapping --uuid <uuid-of-your-mapping>
Run Code Online (Sandbox Code Playgroud)
然后重新创建它:
aws lambda create-event-source-mapping --event-source-arn arn:aws:sqs:us-west-2:123456789:lamba-sqs-queue --function-name sqs-lambda
Run Code Online (Sandbox Code Playgroud)
但是- 请注意,就像在您可以重新创建具有相同名称的 SQS 队列之前需要一分钟左右的时间一样,在您可以重新创建事件源映射之前也需要一分钟左右的时间。
| 归档时间: |
|
| 查看次数: |
1271 次 |
| 最近记录: |