发送SQS消息超时

6

我用NodeJs编写了一个AWS Lambda函数,从数据库中提取ID并将其排队到AWS SQS队列中。在部署接收消息的函数之前,它一直正常工作。以下是相关代码:

    async function sendHelper(rows)
    {
        let i;
        let params;
        let res;
        let sqs = new AWS.SQS({apiVersion: '2012-11-05'});
        for (i = 0; i < rows.length; i++) { 
            params = {
                MessageBody: rows[i].ID.toString(),
                QueueUrl: 'https://sqs.' + process.env.AWS_REGION_NAME + '.amazonaws.com/' + process.env.AWS_ID_SHORT + '/' + process.env.SQS_VENDPERSON_QUEUE_NAME
            };

            res = await sqs.sendMessage(params).promise().catch(err => errorHandler(err));

            console.log(res);
        }

        return null;
    }

问题在于它没有在任何地方抛出错误。无论你给多长时间,它都只是在第一个sendMessage上超时。我已经删除了消息接收函数,问题仍然存在。一些额外的信息可能有助于解决问题,例如我一直在使用serverless进行部署。

我想补充一点,队列可以通过在本地运行测试NodeJS文件来很好地添加。这个问题只存在于AWS上。 - IBirle
1个回答

3
您没有包含Lambda函数的其余部分,但我假设您的数据库实例在VPC中。如果是这样,您需要:
  1. 将Lambda函数放置在VPC内
  2. 为SQS设置VPC端点或NAT网关(取决于您是否仅需要访问SQS还是还需要访问互联网)。
重要提示(我通过艰难的方式学到):将Lambda函数添加到子网时,请确保仅将其添加到私有子网中,否则将无法正常工作。
这需要进行相当多的调试才能正确完成,但是可以做到。以下是一些相关文档:

https://docs.aws.amazon.com/lambda/latest/dg/vpc.html

并且

https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/


以上内容的更深入解释请参见:https://dev59.com/xlQJ5IYBdhLWcg3w05j2#52994841 - donbunkito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接