使用 AWS Lambda 控制台通过 SNS 发送推送

Using AWS Lambda Console to send push using SNS

我在互联网上尝试了所有可能的解决方案,但没有希望

我想做的是简单地使用 aws lambda 函数(通过 aws 控制台)从 DynamoDB(未包含在问题中)获取用户 fcm 令牌,使用该令牌创建 endpointArn,将推送发送到该特定设备

我测试使用 SNS 控制台发送并且推送成功到达设备,但我未能使用 Lambda 函数将它发送到设备,尽管它提供了成功状态和消息 ID

这是我使用的代码

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'us-east-1'});
const sns = new AWS.SNS()

const sampleMessage = {
    "GCM": { 
        "notification": { 
            "body": "Sample message for Android endpoints", 
            "title":"Title Test" 
        } 
    }
}



exports.handler = async (event) => {

    const snsPayload = JSON.stringify(sampleMessage);

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    
    const params = {
        PlatformApplicationArn: '<Platform Arn>',
        Token: '<FCM Token>'
    };
    
     try {
        const endpointData = await sns.createPlatformEndpoint(params).promise();

        const paramsMessage = {
            Message: snsPayload,
            TargetArn: endpointData.EndpointArn
        };
        var publishTextPromise = await sns.publish(paramsMessage).promise();

        response.MessageId = publishTextPromise.MessageId;
        response.result = 'Success';
        
     }
     catch (e) {
         console.log(e.stack)
         response.result = 'Error'
     }
  

    return response;
};

经过反复试验,我找到了解决我自己问题的方法

1- 有效载荷的 GCM 部分应该是字符串而不是 json 2- 消息参数应该有一个属性,明确地将负载的 MIME 类型设置为 Json

考虑到所有这些

 const GCM_data = { 
    'notification': { 
        'body': 'Hellow from lambda function', 
        'title': 'Notification Title' 
    } 
}

const data = {
    "GCM": JSON.stringify(GCM_data)
}
const snsPayload = JSON.stringify(data)

参数应该是这样的

const paramsMessage = {
        Message: snsPayload,
        TargetArn: endpointData.EndpointArn,
        MessageStructure: 'json'
    };

这会起作用:)