EC2实例中sqs-consumer无法读取SQS消息问题排查
以下是针对你遇到的问题的排查方向:
核对队列URL与区域配置
确认代码中config.sqs.endpoint是正确的SQS队列完整URL(格式应为https://sqs.<区域>.amazonaws.com/<账户ID>/<队列名>),且config.sqs.region与队列实际所在区域完全一致。避免出现区域不匹配(比如队列在us-west-2,代码里写了us-east-1)或URL错误的情况。调整AWS凭证优先级
EC2实例已附加IAM角色,此时AWS SDK会自动优先使用实例角色的凭证,无需手动配置环境变量中的AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。建议删除EC2上的这两个环境变量,避免凭证来源冲突导致的隐性问题。同步sqs-consumer版本
检查EC2上项目的package.json中sqs-consumer的版本是否与本地开发环境一致。部分新版本的sqs-consumer已变更初始化方式(比如v10+版本使用new Consumer()替代Consumer.create()),版本不一致可能导致初始化异常。完善日志捕获
守护进程的stdout/stderr可能未被正确记录,导致看不到初始化信息或隐性错误。将进程输出重定向到日志文件:node your-consumer-app.js >> consumer.log 2>&1查看日志中是否有消费者启动的提示,或未被捕获的错误信息。
配置长轮询提高消息获取概率
默认短轮询可能存在漏读消息的情况,在消费者配置中添加长轮询参数:const consumer = Consumer.create({ region: config.sqs.region, queueUrl: config.sqs.endpoint, shouldDeleteMessages: true, waitTimeSeconds: 20, // 开启长轮询,最长可设20秒 handleMessage: (message) => { console.log('Processing message: ', message); }, });验证EC2网络连通性
确保EC2实例能访问SQS服务端点:- 如果EC2在公有子网,检查安全组出站规则是否允许HTTPS(443端口)访问互联网。
- 如果EC2在私有子网,确认已配置NAT网关,或VPC中创建了SQS的VPC端点,否则实例无法访问公网SQS服务。
可通过以下命令测试连通性:
curl -v https://sqs.<你的区域>.amazonaws.com确认handleMessage的异步处理逻辑
如果后续修改过handleMessage为异步函数,需确保返回Promise,否则sqs-consumer可能无法正确识别处理状态。即使当前是同步逻辑,也可以显式返回Promise避免潜在问题:handleMessage: (message) => { console.log('Processing message: ', message); return Promise.resolve(); }
内容的提问来源于stack exchange,提问作者Falcon Stakepool

