无法让 aws lambda 通过 aws sns 发送短信

cannot get aws lambda to send sms via aws sns

我已经复制了互联网上各种指南中的示例,包括最近关于 SO 的主题:

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

我已经在我的本地 nodejs 服务器上成功实现了来自 https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/sns-examples-sending-sms.html 的代码,但是当我在 Lambda 上执行相同的操作时,什么也没有发生,甚至 console.log???

这是我在 Lambda 中使用的代码:

const AWS = require('aws-sdk');

exports.handler = async (event) => {
  AWS.config.update({region: 'eu-west-2'});
  var params = {
    Message: 'TEXT_MESSAGE', /* required */
    PhoneNumber: '+1346879',
  };

  // Create promise and SNS service object
  var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();

// Handle promise's fulfilled/rejected states
  publishTextPromise.then(
    function(data) {
      console.log("MessageID is " + data.MessageId);
    const response = {
        statusCode: 200,
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(data)
    };
    console.log('Server response function');
    return response;
    }).catch(
      function(error) {
      //console.error(err, err.stack);
          const response = {
        statusCode: 500,
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({error: 'Internal server error', message: error})
    };
    return response;
  });
}

不用说,我尝试了各种风格的看似基本的代码... 日志正是这样说的:

    2020-10-29T00:29:21.820+00:00   START RequestId: 8dbaedac-1f98-4319-9ac5-acba1d8860c5 Version: $LATEST

2020-10-29T00:29:22.242+00:00   Lambda Insights extension initializing.

2020-10-29T00:29:22.242+00:00   EXTENSION Name: cloudwatch_lambda_agent State: Ready Events: [INVOKE,SHUTDOWN]

2020-10-29T00:29:22.838+00:00   END RequestId: 8dbaedac-1f98-4319-9ac5-acba1d8860c5

2020-10-29T00:29:22.838+00:00

Copy
REPORT RequestId: 8dbaedac-1f98-4319-9ac5-acba1d8860c5  Duration: 594.62 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 99 MB  Init Duration: 448.90 ms    
REPORT RequestId: 8dbaedac-1f98-4319-9ac5-acba1d8860c5 Duration: 594.62 ms Billed Duration: 600 ms Memory Size: 128 MB Max Memory Used: 99 MB Init Duration: 448.90 ms

我在我的用户和 lambda 上以完全相同的方式设置了权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sns:*",
            "Resource": "*"
        }
    ]
}

有什么想法吗?

我认为你必须return承诺确保所有任务都将执行到最后。

If your code performs an asynchronous task, return a promise to make sure that it finishes running. When you resolve or reject the promise, Lambda sends the response or error to the invoker.

const AWS = require('aws-sdk');

exports.handler = async (event) => {
    AWS.config.update({region: 'eu-west-2'});
    var params = {
        Message: 'TEXT_MESSAGE', /* required */
        PhoneNumber: '+1346879',
    };

    // Create promise and SNS service object
    var publishTextPromise = new AWS.SNS({apiVersion: '2010-03-31'}).publish(params).promise();

    return new Promise((resolve, reject) => {
        // Handle promise's fulfilled/rejected states
        publishTextPromise.then((data) => {
            console.log("MessageID is " + data.MessageId);
            const response = {
                statusCode: 200,
                headers: {
                    "Content-Type": "application/json"
                },
                body: JSON.stringify(data)
            };
            console.log('Server response function');
            resolve(response);
        }).catch((error) => { reject(Error(error)); });
    });
}
  • 检查 lambda 执行时间,尝试将其增加到 15 分钟。
  • 此 SNS 有两种类型的消息 1.Promotional 2.Transactional
  • 默认选择促销。如果最终用户为其号码启用了免打扰。那么您的消息将不会送达。
  • 如果与交易相关,请使用以下对象发送交易消息。

    {
       Message: 'Message',
       PhoneNumber: '+XXX',
       MessageAttributes: {
        'AWS.SNS.SMS.SMSType': {
           DataType: 'String',
           StringValue: 'Transactional'
        }
     }