获取AWS SMS的交付状态

时间:2017-04-25 02:15:01

标签: node.js amazon-web-services sms aws-sdk amazon-sns

我正在通过节点SDK从AWS发送短信。短信很顺利,我正在尝试获取交付信息。显然它不是那么容易,需要设置SNS将日志发送到Cloudwatch并解析CloudWatch以获取查询MessageId的交付信息:https://stackoverflow.com/a/40327061/2054629

如果我通过SNS网络界面发送短信,日志我会看到cloudwatch中的日志,但是当我通过节点SDK发送它们时却看不到。在从节点发送之前,我无法获得有关如何设置内容的信息。

理想情况下,我希望实现以下目标:

const sendSMS = async (message, number) => {
    // send the SMS
    // wait to get delivery info
    // resolve with delivery info, or reject if failed
}

目前我有:

import AWS from 'aws-sdk';

AWS.config.update({
  accessKeyId: accessKey,
  secretAccessKey: secretKey,
  region: 'us-east-1',
});

const sns = new AWS.SNS();

const sendSMS = async (message, number) => {
  return await new Promise((resolve, reject) => {
    sns.publish({
      Message: message,
      MessageStructure: 'string',
      PhoneNumber: number,
    }, (err, res) => {
      if (err) { return reject(err); }
      resolve(res);
    });  
  });
}

仅向AWS发送SMS请求并使用

等解析
{
  ResponseMetadata: { RequestId: '7e0999a3-xxxx-xxxx-xxxx-xxxxxxxxxxxx' },
  MessageId: 'f7f21871-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
}

我不确定是否必须设置SNS应用程序才能获取日志,我宁愿不要保持简单。

3 个答案:

答案 0 :(得分:1)

通过更改import语句(缺少ES5 / 6支持),您的代码似乎与nodejs v6一样正常。启用日志记录到cloudwatch后,每条SMS(通过Web界面和此代码)都会在CloudWatch日志中创建日志记录。我认为您应该重新安装AWS SDK或避免使用ES5 / 6来使SDK正常工作。

对于第二个问题,如果邮件未送达,您将收到错误:

(err, res) => {
      if (err) { return reject(err); }
      resolve(res);
    }); 

如果邮件成功发送,您会收到如下响应:

{ ResponseMetadata: { RequestId: 'e31feda6-669c-5b13-XXX-bc25b07877b5' },
  MessageId: '53555115-6acb-5684-XXXX-0096bc2f6a22' }

答案 1 :(得分:1)

您可能已经这样做了,但要为SMS发送配置cloudwatch日志,您必须配置SMS首选项。为此,您需要创建一个IAM角色以允许cloudwatch日志访问。通过AWS控制台进行操作非常简单。步骤在http://docs.aws.amazon.com/sns/latest/dg/sms_preferences.html

处给出

如果需要,您甚至可以控制成功交付的百分比+记录失败的短信。完成此操作后,无论您发送短信的方式如何,都应该开始查看cloudwatch日志。

我想将此添加为评论,但我没有足够的代表。如果它不起作用,我会删除这个答案。

答案 2 :(得分:0)

为什么不使用像Send With SES(https://www.sendwithses.com/)这样的包装器来为您收集交付统计信息,而不是与AWS争吵?