【问题标题】:Trigger Amazon SNS message via Amazon Lambda通过 Amazon Lambda 触发 Amazon SNS 消息
【发布时间】:2015-10-12 13:58:57
【问题描述】:

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

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

我在文档方面遇到了困难;亚马逊的文档只讨论了如何通过 SNS 触发 Lambda 代码,而不是相反。有没有人有我如何做到这一点的例子?

【问题讨论】:

  • 你能找到答案吗?我现在遇到了同样的问题,文档仍然仅限于此特定操作'

标签: amazon-web-services amazon-sns aws-lambda


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,您可以使用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>"
        } ]
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用下面的 lambda 将 SNS 消息推送给用户,但您必须知道该用户的终端节点 ARN 是什么。例如,如果在 Android 应用程序中,当用户登录时,您将让应用程序向您的后端发送 GCM(Google 云消息传递)令牌(例如,通过触发 lambda 的 API 调用)。然后,连接到 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
          });
      
      };

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 2014-11-17
        • 2017-08-22
        • 2016-11-30
        • 1970-01-01
        • 2016-09-18
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多