通过 Amazon Lambda 触发 Amazon SNS 消息

Trigger Amazon SNS message via Amazon Lambda

我有一个 Amazon Lambda 实例和一个 Amazon SNS 实例。 Lambda 代码监视我们数据库中的更改,我希望它调用 Amazon SNS 以向我们的用户发送推送。例如:

当我们某个论坛上的用户收到新消息时,Lambda 代码会在每次 运行(每 10 分钟)时识别此更改,并应通过 SNS 向用户的智能手机发送推送。

当涉及到文档时,我运行陷入困境; Amazon 的文档只讲如何通过 SNS 触发 Lambda 代码,反之则没有。有没有人有我如何完成此操作的示例?

在 Lambda 上下文中推送 SNS 通知没有什么特别之处。我会认为它只是您与之交互的另一个外部服务。

您可以做的是在您的 lambda 代码中引入 AWS SDK,然后使用该代码进行 SNS 调用。您将需要注入正确的凭据才能调用 Amazon SNS API(但如果您正在与数据库对话,您可能会执行类似的操作来获取数据库端点和凭据)

是的,您可以使用AWS Lambda来实现您想要的。您还需要提供适当的 IAM Permissions 允许您的 Lambda IAM Role 向您发布消息 SNS Topic.

示例SNS Publish IAM Policy

{
    "Statement":[ {
        "Effect":"Allow",
        "Action":"sns:Publish",
        "Resource":"arn:aws:sns:*:<your account id>:<your topic id>"
    } ]
}

您可以使用下面的 lambda 将 SNS 消息推送给用户,但您必须知道该用户的端点 ARN 是什么。例如,如果在 Android 应用程序中,当用户登录时,您将让该应用程序向您的后端发送一个 GCM(Google 云消息传递)令牌(通过触发的 API 调用一个 lambda,例如)。然后,连接到 GCM 的后端可以使用此令牌来查找与该用户对应的端点 ARN,并将其放入下面的 lambda 中。或者,您可以让应用程序将端点 ARN 直接发送到您的后端,但我认为这可能不太安全。确保您授予 IAM 权限以通过 SNS 发布到您的应用程序。您可以使用下面的 lambda 来推送消息:

var AWS = require('aws-sdk');
var sns = new AWS.SNS({apiVersion: '2010-03-31'});

exports.handler = (event, context, callback) => {

    console.log(JSON.stringify(event))

var payload = {
"default": "The message string.",
"GCM":"{"+
   "\"notification\":{"+
       "\"body\":\"PUT NOTIFICATION BODY HERE\","+
       "\"title\":\"PUT NOTIFICATION TITLE HERE\""+
   "}"+
"}"
};

  payload = JSON.stringify(payload);

    var params = {
      TargetArn: 'PUT THE ENDPOINT ARN HERE',
      Subject: 'foo2',
      MessageStructure: 'json',
      Message: payload
    }
    sns.publish(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });

};