Twilio Node.js代码作为AWS SQS事件Lambda触发器无法发送短信求助
问题根本原因
你的Lambda handler是async异步函数,但调用sendMessage时没有等待内部异步操作完成就直接返回了。Lambda执行环境在handler返回后会立刻冻结运行进程,后台未完成的Twilio接口请求、以及对应的then/catch回调逻辑都不会被执行,自然没有任何日志输出。
修复代码
你只需要把异步逻辑改成await等待的形式即可,修改后的代码如下:
// 本地测试时可保留dotenv,部署到Lambda环境无需引入 require('dotenv').config() const client = require('twilio')(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN); exports.handler = async function (event, context) { console.info('phoneNumber', event.Records[0].messageAttributes.Phone.stringValue); console.info('smsContent', event.Records[0].body); console.info('from phone number', process.env.TWILIO_PHONE_NUMBER); console.info('TWILIO_ACCOUNT_SID', process.env.TWILIO_ACCOUNT_SID); console.info('TWILIO_AUTH_TOKEN', process.env.TWILIO_AUTH_TOKEN); // 等待异步发送逻辑执行完成再返回 await sendMessage(event); return context.logStreamName; } // 改造sendMessage为async函数,返回Promise async function sendMessage(event) { try { const message = await client.messages.create({ body: event.Records[0].body, from: process.env.TWILIO_PHONE_NUMBER, to: event.Records[0].messageAttributes.Phone.stringValue }) console.info('messageId', message.sid) } catch (err) { console.error('delivery error', err); } }
额外说明
- 如果是部署到AWS Lambda环境,不需要引入dotenv依赖,直接在Lambda函数配置的「环境变量」页配置对应的参数即可,dotenv只会读取本地工程下的.env文件,部署到Lambda后不会生效。
- 如果你需要批量处理SQS多条记录,遍历Records数组时要把所有异步请求用
Promise.all包裹等待,避免出现同样的提前返回问题。
内容的提问来源于stack exchange,提问作者Dan Friedman
相关产品推荐
相关产品推荐

