【问题标题】:Twilio programmable SMS not sending in deployed Lambda functionTwilio 可编程 SMS 未在部署的 Lambda 函数中发送
【发布时间】:2020-04-27 09:53:57
【问题描述】:

我正在开发一个Serverless AWS 服务,它使用Twilio's programmable SMS 来传递短信。

当我在本地运行堆栈时(例如sls offline start),我的设置始终成功地传递消息,但在部署的环境中,我似乎甚至无法调用Twilio client 上的方法。

以下是消息传递的设置方式:

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 调用),因此在回调。

在调试中我尝试了以下方法:

  • 我已经记录了所有环境变量(Twilio SSID、身份验证令牌、电话号码)以及函数参数,它们似乎都已到位。我还检查了 Lambda 函数本身以确保环境变量存在。
  • 我检查了我的 CloudWatch 日志;不记录任何错误或异常。除了没有被调用的 Twilio 方法之外,Lambda 函数的执行没有问题。
  • 我已尝试记录 twiliotwilioClient.messages.create 之类的内容,以确保客户端和函数定义不会以某种方式被清除。
  • 我认为可能与context.callbackWaitsForEmptyEventLoop 有关,所以我将其从false 更改为true

我空了,我不明白为什么这会在本地工作,但在部署时却不行。


编辑:根据Twilio client example,如果您省略回调函数,该方法将返回一个 Promise。我继续尝试等待方法的响应:

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
  };
}

在此示例中,Lambda 函数成功,但消息和错误均未记录。

【问题讨论】:

  • 我没有使用过 Lambda,但使用了 Twilio 函数,你需要注意异步函数和关联回调以指示函数结束 - 特别是 - twilio.com/docs/runtime/functions/…。这可能是这种情况下发生的事情吗?也许这里有一些细节? docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html
  • @Alan 我怀疑你在做某事,但不幸的是我没能解决它。我更新了我的问题,指出我尝试了基于 Promise 的方法,但没有成功。

标签: node.js aws-lambda twilio serverless twilio-api


【解决方案1】:

我试过了,效果很好。我试图使我的代码与使用类似,但做了一些更改。

const twilio = require('twilio');

const twilioClient = twilio(
  process.env.TWILIO_SID,
  process.env.TWILIO_TOKEN
);

let user = '+14075551212';

function sendMessage(user, message) {
  return twilioClient.messages.create({
    from: process.env.TWILIO_NUMBER,
    to: user,
    body: message,
  });
}

exports.handler = async function(event, context, callback) {
  try {
    const message = await sendMessage(user, 'This is a message');
    console.log('message', message);
    callback(null, {result: 'success'});
  } catch (error) {
    console.log('error', error);
    callback("error");
  }
};

【讨论】:

  • 谢谢你,艾伦!果然,就像你提到的那样,这是书面的。我将把它标记为答案。不幸的是,就我而言,我认为还有其他事情发生,我认为这是我在 Lambda 函数上设置的 VPC。它需要与 RDS 实例进行通信,我认为它在那里的某个地方阻止了对 Twilio 的出站请求。我忽略了在我原来的帖子中提到这一点,道歉。如果您有任何 VPC / 子网 / NAT 网关知识,我会全力以赴。否则,感谢您的回答!
  • 嗨乔迪,我有,但不是我的专长。最好换个帖子。您的拓扑图将帮助其他人提供更集中的答案。我通常认为 IAM 权限更多是 Lambda 的问题,但我并没有真正使用它,100% 在我不断增长的待办事项列表上。
  • 我需要的是await。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2017-12-30
  • 2020-05-18
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多