【问题标题】:How to send SMS using Amazon SNS from a AWS lambda function如何通过 AWS lambda 函数使用 Amazon SNS 发送 SMS
【发布时间】:2016-11-30 01:05:15
【问题描述】:

Amazon SNS 提供了一种在全球范围内发送 SMS 的工具。

如果我们提供手机号码和短信并使用 SNS 传递该消息,我想从 Lambda 函数发送 SMS,但我没有找到适用于 NodeJS 或 java 的有用文档或示例代码。

任何人都可以提出解决方案吗?

代码:

  var params = {
  Message: 'Hi this is message from AWS_SNS', /* required */
  MessageAttributes: {
    someKey: {
      DataType: 'String' ,
      StringValue: 'String'
    },
      },
  MessageStructure: 'String',
  PhoneNumber: '+91MyNUMBER',
  Subject: 'MYSubject',
  //TargetArn: 'arn:aws:sns:us-west-2:798298080689:SMS',
  //TopicArn: 'arn:aws:sqs:us-west-2:798298080689:SendSMS'
};
sns.publish(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
};

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-lambda amazon-sns


    【解决方案1】:

    这就是我所做的

    1. 使用您选择的运行时创建一个新的 Lambda 函数 Author from scratch。 (我去了最新的,Node.js 12.x

    2. 对于执行角色,选择Create a new role from AWS policy templates

    3. 输入您的Role name,因为您想向任何手机号码发送短信,您必须将Resource 设置为*

    4. 键入此作为您的 IAM 角色模板。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "sns:Publish"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ]
    }
    
    1. 使用此代码 sn-p
    const AWS = require('aws-sdk');
    const SNS = new AWS.SNS();
    
    exports.handler = async (event) => {
        let params = {
            PhoneNumber: '+123xxxxxxx',
            Message: 'You are receiving this from AWS Lambda'
        };
    
        return new Promise((resolve, reject) => {
            SNS.publish(params, function(err, data) {
                if(err) {
                    reject(err);
                }
                else {
                    resolve(data);
                }
            })
        })
    }
    
    1. 就是这样。点击Deploy,然后点击Test,您应该会收到一条短信。

    【讨论】:

      【解决方案2】:

      如果可以确保您有权发布到SNS,它就可以正常工作。

      const smsParams = ()=>({
              Message: getUpdateMessage(order),
              PhoneNumber: `+91${order.contactNo}`,
              MessageAttributes: {
                  'AWS.SNS.SMS.SMSType' : {
                      DataType : 'String',
                      StringValue: 'Transactional'
                  },
              },
          })
      

      我的 lambda 的权限:

      - Effect: 'Allow'
            Action:
              - "sns:Publish"
            Resource:
              - '*'
      

      请注意,您必须允许所有资源使用PhoneNumber 发送SMS

      这里是所有supported SNS regions的链接

      【讨论】:

        【解决方案3】:

        基于最新的 AWS SNS > SMS 文档,当您没有任何 topicArn 并且需要直接向电话号码发送短信时,您需要发送以下参数:

        const AWS = require('aws-sdk');
        AWS.config.update({region: 'eu-west-1'});
        const sns = new AWS.SNS();
        
        const publish = (phone, text, subject) => {
         
        // Create publish parameters
        var params = {
          Message: text,
          Subject: subject,
          PhoneNumber: phone,
          MessageAttributes: {
                'AWS.SNS.SMS.SMSType' : {
                  DataType : 'String',
                  StringValue: 'Transactional'
                },
              },
        };
        
        console.log('------------- text message param before sending------------');
        console.log(params);
        console.log('----------------------------------------------------');
            
        // Create promise and SNS service object
        var publishTextPromise = sns.publish(params).promise();
        
        // Handle promise's fulfilled/rejected states
        publishTextPromise.then(
          function(data) {
            console.log("MessageID is " + data.MessageId);
          }).catch(
            function(err) {
            console.error(err, err.stack);
          });
        
        }
        
        exports.publish = publish;
        

        【讨论】:

          【解决方案4】:

          这里是 a link 的教程,用于构建与 AWS SNS 连接以发送文本消息的 Alexa 技能。

          【讨论】:

          • 链接已损坏。
          • 更新了链接!
          【解决方案5】:

          请尝试将区域明确设置为“us-east-1”。我通过明确设置此区域设法将 SMS 发送到印度。我也尝试了“ap-south-1”,但没有成功。

          【讨论】:

            【解决方案6】:

            因此,您需要编写以某种方式调用的 Lambda 函数,比如说通过 HTTP 请求,因此您还需要设置 API Gateway 以将连接路由到您的 Lambda 函数。

            接下来,您的 Lambda 函数会将这些数据推送到“SNS 主题”,而 SMS 订阅将“轮询”此“主题”中的任何新数据。一旦有任何数据进入该主题,它将被订阅消费并发送短信。

            几天前,我写了一篇关于 SNS 和 Lambda 的文章,可能会对您有所帮助。您想要实现的流程与本文中描述的流程非常相似。

            https://medium.com/@rafalwilinski/use-aws-lambda-sns-and-node-js-to-automatically-deploy-your-static-site-from-github-to-s3-9e0987a073ec#.3x6wbrz91

            可能有帮助的文档页面:

            【讨论】:

            • 嗨@Rafal Wiliński 我已经关注推送到 SNS 文档并能够通过有效的 TopicARN 发送消息,但是当我在婴儿车中使用电话号码时,它会抛出错误为 { [UnexpectedParameter: Unexpected key 'PhoneNumber' found in params] 消息:'Unexpected key \'PhoneNumber\' found in params',
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-01-12
            • 1970-01-01
            • 1970-01-01
            • 2015-10-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多