You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2实例中sqs-consumer无法读取SQS消息问题排查

排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:27:37