发送 SQS 消息超时

Posted

技术标签:

【中文标题】发送 SQS 消息超时【英文标题】:Sending SQS message timeout 【发布时间】:2019-05-31 15:03:57 【问题描述】:

我在 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 上超时。我已经删除了消息接收功能,问题仍然存在。一些可能有帮助的附加信息是我一直在使用无服务器进行部署。

【问题讨论】:

我可能会补充一点,可以使用本地运行的测试 NodeJS 文件添加队列。仅在 AWS 上存在此问题。 【参考方案1】:

您没有包含 lambda 函数的其余部分,但我假设您的数据库实例位于 VPC 中。如果是这样,您需要:

    将 lambda 放入 VPC 中 为 SQS 或 NAT 网关设置 VPC 端点(取决于您是只需要访问 SQS 还是还需要访问 Internet)。

关键说明(我学得很辛苦):当您将 lambda 函数添​​加到子网时,请确保仅将其添加到 private 子网,否则什么都行不通。

这需要相当多的修补才能做到正确,但这是可行的。以下是一些相关文档:

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

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

【讨论】:

以上是关于发送 SQS 消息超时的主要内容,如果未能解决你的问题,请参考以下文章

通过 SQS lambda 发送 SQS 消息

AWS Lambda 在向 SQS 发送消息之前完成

带有graphql和sqs的lambda在nodejs中向sqs发送2条消息?

text 发送消息给SQS

SQS 不能在 .Net 核心中仅发送 quations 消息

正确计算发送到死信 SQS 队列的消息数