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

无法从AWS Lambda函数向SQS发送消息的排查求助

问题分析与修复方案

问题1:异步逻辑错误

doSend函数里,await send(...)已经把Promise解析成了具体返回值,后续调用response.then()完全无效——因为response不是Promise对象,所以成功/失败的日志都不会触发。同时,send函数如果抛出错误,await会直接抛出异常,但doSend没有做try/catch处理,错误被静默,导致你看不到任何报错信息。

问题2:Lambda未等待异步操作完成

直接调用doSend()但没等待它执行完毕,Lambda的执行环境会在事件循环为空时立即终止,可能SQS发送操作还没完成就被中断了。

问题3:SQSClient区域配置缺失(代码未体现)

你的队列在us-east-1,但代码里new SQSClient({})是空配置,即使你说指定了区域,也需要确保代码里明确设置region参数,否则SDK可能无法正确连接到对应区域的SQS服务。


修复后的完整代码

import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";

const message = {
  label: "test",
};

// 明确指定队列所在区域
const client = new SQSClient({ region: "us-east-1" });
const SQS_QUEUE_URL = "https://sqs.us-east-1.amazonaws.com/...";

const send = async (message, sqsQueueUrl = SQS_QUEUE_URL) => {
  const command = new SendMessageCommand({
    QueueUrl: sqsQueueUrl,
    DelaySeconds: 5,
    MessageAttributes: {
      Label: {
        DataType: "String",
        StringValue: message.label,
      },
    },
    MessageBody: "Sent test data to SQS queue",
  });
  return await client.send(command);
};

const doSend = async (message, sqsQueueUrl) => {
  try {
    const response = await send(message, sqsQueueUrl);
    console.log("Message has been sent to SQS Q1", response.MessageId);
  } catch (err) {
    console.error("Something went wrong", err);
    // 抛出错误让Lambda标记为执行失败,便于排查
    throw err;
  }
};

// Lambda入口必须等待异步操作完成
export const handler = async () => {
  await doSend(message, SQS_QUEUE_URL);
  return { statusCode: 200, body: "Message sent successfully" };
};

额外检查点

  • 确认Lambda执行角色的权限策略中,明确包含目标SQS队列的sqs:SendMessage权限(策略需指定队列ARN,而非仅全SQS权限)。
  • 修复后查看CloudWatch日志,成功时会打印消息的MessageId,失败时会输出具体错误信息,方便进一步排查。

内容的提问来源于stack exchange,提问作者zayaanra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:01:16