Nag
Nag

Reputation: 377

How to send SMS using Amazon SNS from a AWS lambda function

Amazon SNS provides a facility to send SMS globally.

I want to send SMS from a Lambda function were we provide the mobile number and text message and use SNS to deliver that message but I didn't find a helpful documentation or example code for NodeJS or java.

Can any one suggest a solution?

Code:

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

Upvotes: 3

Views: 13109

Answers (6)

Muhammad Reda
Muhammad Reda

Reputation: 27053

Here's what I did

  1. Create a new Lambda function Author from scratch with your Runtime of choice. (I went to latest, Node.js 12.x)

  2. For execution role, choose Create a new role from AWS policy templates.

  3. Type in your Role name and because you want to send SMS to any mobile number, you must set Resource to *.

  4. Type this as your IAM Role Template.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sns:Publish"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
  1. Use this code snippet
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. That's all. Click Deploy then Test and you should receive an SMS.

Upvotes: 1

guneetgstar
guneetgstar

Reputation: 652

It works fine if can make sure you have the right access to publish to SNS.

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

Permissions to my lambda:

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

Note that you have to allow all the resources to send SMS using PhoneNumber

Here is a link to all the supported SNS regions

Upvotes: 0

Harry Sarshogh
Harry Sarshogh

Reputation: 2197

Based on latest AWS SNS > SMS documenration, When you don't have any topicArn and you need to send a text message directly to a phone number, you need to send following params:

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;

Upvotes: 1

Vivek B
Vivek B

Reputation: 1

Here is a link to a tutorial for building an Alexa skill that connects with AWS SNS to send a text message.

Upvotes: 0

user5398398
user5398398

Reputation: 121

Please try with setting the region explicitly to "us-east-1". I managed to send SMS to India by explicitly setting this region. I also tried with "ap-south-1", but was not successful.

Upvotes: 1

Rafal Wiliński
Rafal Wiliński

Reputation: 2390

So, you need to write Lambda function which is invoked somehow, let's say via HTTP request so you'll also need to setup API Gateway to route connections to your Lambda function.

Next, your Lambda function will push that data to "SNS Topic" while SMS Subscription will "poll" for any new data in this "Topic". As soon as any data gets into this topic, it will be consumed by subscription and SMS will be sent.

Few days ago I wrote a post about SNS & Lambda which might help you. Flow you wanted to achieve is pretty similar to one described in this article.

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

Documentation pages that might help:

Upvotes: 2

Related Questions