从 Lambda 向订阅主题的所有用户发送 SNS 通知

Posted

技术标签:

【中文标题】从 Lambda 向订阅主题的所有用户发送 SNS 通知【英文标题】:Send SNS notification to all Users that subscribed the topic from Lambda 【发布时间】:2021-12-29 06:00:46 【问题描述】:

我在 nodejs (AWS Lambda) 中创建了一个带有后端的电子商务 ios 应用程序。当用户登录/登录时,该应用订阅了我创建的用于发送通知的 SNS 主题,并将 推送令牌和设备 ARN 存储在数据库中。 现在,当我们向商店添加新商品时,我想向所有订阅该 SNS 主题的用户发送推送通知。 目前,为了发送通知,我正在从数据库中获取所有用户并循环访问用户以获取他们的推送令牌并将通知一一发送给用户,这是一个非常昂贵的过程,并且 API 花费了太多时间。

现在我要做的是从 Lambda 中点击 SNS 主题并将通知正文传递给该主题,该 SNS 主题将向所有订阅该主题的用户发送通知。 我已经搜索过了,但找不到任何解决方案。

我发送通知的代码是

await Promise.all(targetArns.map(async (item, index) => 
         const publishNotificationParams =  
            "TargetArn": item,
            "Message": JSON.stringify(
              "default": JSON.stringify(
                  "category" : title,
                  "alert" : 
                    "title" : title,
                    "body" : 'New product is launced',
                    "data" : product
                  ,
                  "badge" : 1,
                  "sound" : "chime.aiff"
                ),
                "APNS_SANDBOX": JSON.stringify(params),
                "APNS": JSON.stringify(params)
            ),
            "MessageStructure": "json"
        ;
        var publishTextPromise = sns.publish(publishNotificationParams).promise();
       publishTextPromise.then(
        function(data) 
          console.log(`Message $publishNotificationParams.Message sent to the topic $publishNotificationParams.TargetArn`);
        ).catch(
          function(err) 
          console.error(err, err.stack);
        );
     ));

但为此我必须从数据库中获取每个用户获取他们的端点 ARN,然后通过迭代发送通知。

我想调用 SNS 主题传递通知正文,SNS 将向每个订阅该 SNS 主题的用户发送通知。

我这样做是因为我想节省从数据库中获取每个用户然后发送通知的成本

【问题讨论】:

docs.aws.amazon.com/sns/latest/dg/… 请提供足够的代码,以便其他人更好地理解或重现问题。 @hoangdv 我以前读过这个,但找不到我想要的解决方案。 从 lambda 向所有主题用户发送通知 那么,你的问题是什么? 【参考方案1】:

这就是您实现该流程的方式。我认为您已经实现了其中的某些部分。

    创建一个主题,用于向所有用户发送通知:https://docs.aws.amazon.com/sns/latest/api/API_CreateTopic.html

    为使用您的应用的不同平台创建平台应用:https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html

    当用户注册您的应用时,为该应用创建与用户平台对应的平台端点:https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html

    3.1。如果您希望能够直接定位此用户,还可以将此 ARN 存储在某处以供直接发布(就像您现在所做的那样)。

    现在还为端点 ARN 的步骤 1 中创建的主题创建订阅:https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html

    发布到第 1 步中创建的主题:https://docs.aws.amazon.com/sns/latest/api/API_Publish.html

SNS 会自动将消息散播给所有订阅者(您的所有用户),因此每个订阅者都会收到通知,而无需您遍历每个用户。

【讨论】:

目前取得的成就:IOS和Andriod用户分别订阅了他们的SNS主题。 Lambda 函数中创建的基本 API 现在我想要的是 API/Lambda 将输入作为字符串并将该字符串发送到两个 SNS 主题。我已经创建了 Lambda 函数,但无法从 Lambda 调用 SNS 主题以通过迭代向所有用户发送通知。

以上是关于从 Lambda 向订阅主题的所有用户发送 SNS 通知的主要内容,如果未能解决你的问题,请参考以下文章

AWS SNS子脚本与lambda函数的触发器?

如何通过电子邮件订阅带有电子邮件端点的 Amazon SNS 主题?

使用 AWS Lambda 观看 SNS 主题并通过 websocket 交付?

Terraform:通知 SNS 的 CloudWatch 事件

100,000 个主题限制的 AWS SNS 解决方法

您如何向从应用程序本身订阅主题的用户发送 Firebase 推送通知