使用SNS,Lambda和Node.js创建推送通知作业

页面出现时,单击“创建平台应用程序”:

接下来,您需要为您的应用程序创建一个名称,为您的Push通知平台选择Apple生产或Apple开发,然后从您已经创建的证书中上传信息(请参阅先决条件)。 在查找器中选择您的证书,如果使用一个证书将其导出,请输入密码,然后单击“从文件加载凭据”。 您的证书和私钥应该自动填充。

单击创建平台应用程序。 创建应用程序后,记下应用程序ARN(Amazon资源名称)。 我们将在步骤3中使用它。

2.创建SNS主题:

导航到左侧导航菜单中的主题,单击创建新主题。 填写主题名称和显示名称。 就我而言,我只想创建一个推送通知,该通知将发送给整个用户群,因此我创建了一个名为all_app_users的主题。 创建主题后,请记下ARN。 我们将在步骤3中使用它。

3.配置程序访问

在我们的node.js代码中,我们将需要配置一个具有适当权限的用户aws-sdk,以创建SNS终结点并订阅我们的all_app_users主题。 返回AWS控制台,导航至IAM,然后单击Users。 创建一个新用户,选择一个名称,然后选中“访问类型”的“编程访问”,然后单击“下一步”:权限:

在权限屏幕上,单击附加现有策略,然后单击创建策略:

在弹出的IAM屏幕上,选择“策略生成器”。 然后在Edit Permissions中,选择适用于AWS Service的Amazon SNS,在Actions字段下检查CreatePlatformEndpoint,然后从步骤1插入应用程序ARN:

单击“添加语句”,然后重复上述步骤以创建允许该用户创建all_app_users主题的订阅的all_app_users 。 再次为AWS服务选择Amazon SNS,为“操作”选择“订阅”,然后从步骤2插入SNS主题ARN。单击下一步,将策略名称更改为sns-programmatic-access,然后单击创建策略。

返回创建用户的窗口,搜索sns-programmatic-access(您可能需要单击刷新按钮),然后单击其旁边的复选框以将其选中。 单击“下一步:查看”,然后单击按钮以完成创建用户。 在下一个屏幕上,将显示您的访问密钥ID和秘密访问密钥。 现在记下这些凭据,因为您将无法再次访问密钥*。 我们会将这些凭证插入到我们的node.js代码中,以配置我们的AWS客户端。

*如果您最终丢失了密钥,则可以通过IAM管理控制台创建新密钥。

4.向平台注册用户:

这部分取决于您当前如何处理设备令牌的注册。 在本例中,我们当前正在将设备令牌发送到服务器,以将它们存储在数据库中。 为了实现SNS,我们将需要在包含该设备令牌的SNS应用程序上创建一个平台终结点,然后将该设备预订到我们的all_app_users主题。

为此,我们将需要aws-sdk npm模块:

npm install -save aws-sdk

在我们的代码中,让我们使用在上一步中创建的凭证来配置我们的AWS客户端:

在“配置触发器”屏幕上,单击“下一步”。 我们将在确认该功能正常工作后再设置触发器。

在“配置功能”屏幕上,我们需要在all_app_users主题上设置具有SNS:Publish权限的角色。 向下滚动到Lambda函数处理程序和角色部分。 在角色下,选择创建自定义角色:

在打开的IAM窗口中,将“角色名称”更改为所需的名称(我使用notificationsRole)。 然后单击允许。 现在,您的Lambda角色应设置为刚创建的角色。 最后,单击下一步,然后完成创建函数。

现在,我们只需要使用策略生成器添加SNS:Publish权限。 导航到IAM管理控制台,在左侧导航菜单中单击“角色”,然后选择我们刚刚创建的角色(如果使用该名称,则为“ notificationsRole”)。 在此角色的摘要页面上,选择“内联策略”标题下的“创建角色策略”:

在下一个屏幕上选择“策略生成器”。 这部分现在应该看起来很熟悉。 在这里,我们要选择Amazon SNS作为AWS服务,选择发布作为操作,并选择步骤2中的主题ARN:

单击添加语句,然后单击下一步。 最后,添加名称(如果需要),然后单击“应用策略”。 现在我们应该全部设置角色以发布有关我们主题的消息。

6.编写Lambda函数代码

最后一点,当然是编写用于将消息发布到我们的主题的函数,它实际上非常简单。 首先,我们需要AWS开发工具包。 在本地目录中安装它:

npm install -save aws-sdk

接下来创建一个名为index.js的文件。 当Lambda运行我们的函数时,它将在index.js中寻找一个称为处理程序的函数。 在我们的处理程序函数中,我们需要做的就是从以前将消息发布到主题ARN。 我的代码如下所示:

在下一个屏幕中,在下拉菜单中选择创建新规则,填写名称和可选的规则描述。 对于规则类型,我们要选择Schedule表达式和cron表达式(下面将对其进行描述),然后保存触发器(并启用它)。

Cron表达式使您可以使用以空格分隔的值字符串(或子表达式)来指定计划:

cron(Minutes Hours Day-of-month Month Day-of-week Year)

我不会在cron表达式上介绍太多细节,因为Amazon提供了很多很好的文档。 我特别的cron表达式: cron(0 17 1 * ? *)表示每月第一天的17:00(UTC)运行。

结论

你有它! 通过此代码,我们能够创建新的推送通知功能,从而为我们向整个用户群发送通知提供了一种方式,并且随着我们增长到一百万个用户(及以后),它应该能够与我们一起扩展。 尽管SNS是此用例的理想解决方案,但我们仍将通过现有的推送服务发送一些其他新的推送通知,因为我们希望获得与该设备关联的用户的更细粒度的可见性。