队列重新创建后未触发AWS Lambda SQS触发器

时间:2020-06-15 15:05:47

标签: amazon-web-services aws-lambda amazon-sqs amazon-sns

我一直在使用terraform定义一些SNS主题,然后使用SQS队列来订阅它们,然后这些队列具有由SQS触发的lambda,并从这些队列中提取消息。

Terraform处理SNS主题,SQS队列以及允许SNS将消息写入队列的策略的创建。通过无服务器CLI工具分别部署lambda。

当我先运行Terraform,然后部署Lambda时,所有这些似乎都可以正常工作。但是,我在terraform中所做的事情遇到了一些问题,因此我决定撤消整个基础架构并重新创建它,这似乎仍然可以正常工作。

查看从未删除的lambda,他们仍然具有指向门户的队列链接,正如我期望的那样。如果我转到新的SQS队列,我可以看到它列出了正确在“ Lambda触发器”标签中列出的Lambda。

问题是没有消息被拾取,我可以看到它们都在队列中堆积。我发现解除阻止该问题的唯一方法是进入每个lambda,选择SQS队列并将它们全部切换为“ disabled”,然后再次切换为“ enabled”。在这一点上,他们都开始处理排队的消息。

还有其他人经历过吗?重新创建队列时,是否有更好的方法使它们正确地与队列“重新关联”?

1 个答案:

答案 0 :(得分:1)

我也被这个咬了。用户界面在这里隐藏太多了。在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队列之前,需要花费一分钟左右的时间才能重新创建事件源映射。 / p>