无法从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
相关产品推荐
相关产品推荐

