Я работаю над сервисом AWS Serverless, который использует Программируемое SMS от Twilio для доставки текстовых сообщений.
Моя установка постоянно успешно доставляет сообщения, когда я запускаю стек локально (например, sls offline start
), но в развернутой среде я, похоже, не могу даже вызвать метод на Клиент Twilio.
Вот как настраивается доставка сообщений:
const twilio = require('twilio');
const twilioClient = twilio(
process.env.TWILIO_SID,
process.env.TWILIO_TOKEN,
{
lazyLoading: true,
}
);
export function sendMessage(user, message) {
twilioClient.messages.create({
from: process.env.TWILIO_NUMBER,
to: user.phone,
body: message,
}, function(err, message) {
console.log('error', err);
console.log('message', message);
});
}
// And then usage in a Serverless Function Handler
function example(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
// user is also determined here
sendMessage(user, 'This is a message');
return {
body: JSON.stringify({}),
statusCode: 200
};
}
Локально это работает, и я могу видеть результат message
журнала, а в error
журнале ничего нет. Однако при развертывании выполнение этого ничего не дает - метод, похоже, даже не вызывается (и я могу проверить в журналах Twilio, что не было выполнено ни одного вызова API), поэтому в обратном вызове не ведутся журналы error
или message
.
При отладке пробовал следующее:
- Я зарегистрировал все переменные среды (Twilio SSID, токен аутентификации, номер телефона), а также аргументы функции, и все они кажутся на месте. Я также проверил саму лямбда-функцию, чтобы убедиться, что переменные среды существуют.
- Я изучил свои журналы CloudWatch; никаких ошибок или исключений не регистрируется. Кроме того, что метод Twilio не вызывается, функция Lambda выполняется без проблем.
- Я пробовал регистрировать такие вещи, как
twilio
иtwilioClient.messages.create
, чтобы убедиться, что определение клиента и функции каким-то образом не было уничтожено. - Я подумал, может быть, это связано с
context.callbackWaitsForEmptyEventLoop
, поэтому я изменил его сfalse
наtrue
.
Я пришел с пустыми руками, я не могу понять, почему это будет работать локально, но не при развертывании.
Изменить: в соответствии с примером клиента Twilio, если вы опустите функцию обратного вызова, метод вернет обещание. Я пошел дальше и попытался дождаться ответа метода:
export function sendMessage(user, message) {
return twilioClient.messages.create({
from: process.env.TWILIO_NUMBER!,
to: user.phone,
body: message,
});
}
// Usage...
async function example(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
try {
const message = await sendMessage(user, 'This is a message');
console.log('message', message)
} catch (error) {
console.log('error', error);
}
return {
body: JSON.stringify({}),
statusCode: 200
};
}
В этом примере лямбда-функция выполнена успешно, но ни сообщение, ни ошибка не регистрируются.