AWS SNS:实时通知完整指南

管理应用程序间的实时通知可能是一个巨大的挑战 – 至少在没有正确的消息服务的情况下。

亚马逊简单通知服务(SNS)为解耦和扩展微服务、分布式系统和无服务器应用程序提供了完全托管的消息解决方案。SNS允许您通过多种传输协议(如HTTP/S、电子邮件、短信和移动推送通知)向大量订阅者发送消息。AWS SNS处理所有消息传递的繁重工作,包括可靠传递、重试和退避功能,让您可以专注于构建核心应用程序功能。

AWS SNS 遵循 发布-订阅 模型,易于扩展和理解。单个发布的消息可以同时分发到多个端点,使 SNS 成为事件驱动架构的理想选择。

在本教程中,我将带您逐步设置和使用 AWS SNS 来跨多个渠道发送通知。

什么是 AWS SNS?

Amazon 简单通知服务(SNS) 是 AWS 的托管发布/订阅消息服务,允许您解耦微服务、分布式系统和无服务器应用程序。

SNS采用简单的发布-订阅模型,其中发布者将消息发送到主题,订阅者接收这些消息。将SNS主题视为通信频道 – 您将消息发布到此频道,订阅的任何人都会立即收到通知。这个系统的美妙之处在于,发布者无需知道谁接收他们的消息,而订阅者也无需知道谁发送消息给他们。

您可能想知道这与其他AWS消息服务(如简单队列服务(SQS))有何不同。简单来说,SQS使用基于队列的模型,主要设计用于异步处理任务,而SNS专注于向多个接收者同时广播消息。这使得SNS非常适合需要通知许多系统某个事件刚刚发生的情况。您可以在SQS与SNS博文中了解更多差异。

SNS支持多种传递协议,从而让您灵活地为订阅者提供通知。

AWS SNS的主要特点

SNS拥有多项功能,使其成为您唯一需要的通知服务。我列出其中一些:

  • 扇出架构:SNS可以同时向数千个端点传递消息,从而让您通过单个API调用在整个应用程序生态系统中广播更新。
  • 多种传输协议: 您不仅限于一种消息发送方式。SNS支持HTTP/HTTPS端点、电子邮件、短信、移动推送通知,甚至将SQS队列作为订阅端点。
  • 消息过滤: 并非每个订阅者都需要每条消息。通过消息过滤,订阅者可以创建过滤策略,仅接收他们关心的消息,从而减少噪音和处理开销。
  • 消息存档: 如果您需要保存所有发送的通知记录,您会高兴地知道SNS与Amazon S3集成用于消息存档,并与Amazon Redshift集成用于分析。
  • 交付状态跟踪: 您可以监视通知的交付状态,确保它们准确到达目的地。这对于短信和移动推送通知特别有用,因为交付并非保证。
  • 加密: 您的敏感数据通过 SNS 的服务器端加密得到保护,确保您的消息在传输过程中保持机密。

但 SNS 最棒的部分就是 可伸缩性。SNS 可根据您的应用程序需求自动扩展。无论您每天发送十条还是一千万条通知,该服务都会相应调整,而无需任何手动干预。

接下来,我将向您展示如何设置 SNS。

设置 AWS SNS

在您可以使用 SNS 发送第一条通知之前,您需要按照一些设置步骤来准备好一切。

步骤 1:创建 AWS 账户

如果您还没有 AWS 账户,您需要先创建一个才能开始使用 SNS。

前往AWS首页,并单击右上角的“创建AWS帐户”按钮。您需要提供您的电子邮件地址,创建一个密码,并输入一些基本的帐户信息。AWS还会要求您提供信用卡详细信息 – 不用担心,SNS有一个相当慷慨的免费套餐,并且除非超出限制,否则不会收费。

一旦您的账户设置完成,您就可以继续进行下一步了。然而,我强烈建议创建一个专用的IAM用户,而不是使用您的根账户。这超出了今天文章的范围,请参考官方说明获取详细指导。

步骤2:在AWS管理控制台中设置SNS

现在您已经拥有了AWS账户,是时候访问SNS服务了。

使用您的凭证登录AWS管理控制台并找到SNS。您可以通过三种方式实现这一点:

  • 在控制台顶部的搜索栏中键入”SNS”
  • 单击顶部导航栏中的”服务”,在”应用集成”类别下找到SNS
  • 直接转到SNS控制台

无论采用哪种方式,您应该看到以下屏幕:

图片1 – AWS SNS服务页面

一旦进入SNS仪表板,您会看到左侧菜单,其中包括“主题”,“订阅”和“移动”等选项。仪表板会为您提供SNS资源和最近活动的概览。

对于新账户来说,这里会显得相当空 — 这是正常的。现在,让我们创建第一个SNS主题。

步骤3:创建SNS主题

SNS主题基本上是一个通信频道,发布者向其发送消息,订阅者进行监听。

可以将其想象成广播电台 – 电台在特定频率(主题)上进行广播,任何调到该频率的人都可以收听到广播。在SNS术语中,您的应用会向主题发布消息,所有订阅了该主题的端点都会收到这些消息。

以下是如何创建您的第一个SNS主题:

  1. 在您在图像1中看到的屏幕上,输入主题名称。
  2. 单击“下一步”按钮。
  3. 选择“标准”作为类型(FIFO主题有不同的用例,我们稍后会介绍)。
  4. (可选)输入显示名称。这将包括在发送给短信或电子邮件订阅者的消息中。
  5. 现在保留所有其他设置为默认设置。
  6. 点击“创建主题”。

如果您更喜欢图片而不是文本,那么您的屏幕应该是这样的:

图像2 – SNS 主题创建

当您对数值满意后,向下滚动直到看到“创建主题”按钮:

图像3 – SNS 主题创建(2)

就是这样!您的SNS主题现在可以使用了。您将看到诸如主题ARN(Amazon资源名称)之类的详细信息,它唯一标识您的主题:

图像4 – 创建的主题详细信息

您的新主题已准备好订阅,但目前还没有订阅者,这意味着您发布的任何消息都不会传递到任何地方。别担心,在下一部分中添加订阅者时会解决这个问题。

SNS订阅者和订阅

正如我之前所说,您的SNS主题就像一个广播电台。目前它没有听众,但当您添加订阅者接收您的消息时,这种情况将会改变。

什么是SNS订阅者?

订阅者是从您的SNS主题接收通知的任何端点,当发布消息时就会收到通知。

考虑一下新闻简报的类比。每次发布新版本(消息)时,它都会被传送到您邮件列表中的每个人那里。SNS使这一过程自动化和可扩展,并为您处理所有传送物流。

AWS支持各种订阅者类型,这让您在处理消息时具有灵活性。我将列出主要类型如下:

  • 电子邮件地址:直接向电子邮件收件箱发送纯文本通知。
  • SMS号码:向手机传送短信通知。
  • SQS 队列: 将消息路由到其他 AWS 服务以进行进一步处理。
  • Lambda 函数: 触发无服务器代码执行以响应通知。
  • HTTP/HTTPS 端点: 将消息发送到 Web 应用程序或 API。
  • 移动推送:直接将通知推送至移动应用。

每种订阅者类型都有其自身的优势和用例。例如,电子邮件和短信非常适合人类接收者,而SQS队列和Lambda函数则更适合系统间通信。

步骤1:添加订阅者

现在您了解了什么是订阅者,让我们向您的主题添加一个。在本教程中,我将使用电子邮件,因为它是设置最简单的。

以下是如何将电子邮件订阅者添加到您的SNS主题:

  1. 从您主题的详细页面(显示在图像 4中)点击“创建订阅”按钮。
  2. 在“协议”下拉菜单中,选择“电子邮件”。
  3. 在“端点”字段中,输入应接收通知的电子邮件地址。
  4. 保持所有其他设置为默认值。
  5. 点击“创建订阅”。

您的屏幕应该看起来像这样:

图像5 – 创建电子邮件订阅

单击“创建订阅”后,AWS将将订阅添加到您的主题,但它将处于“待确认”状态:

图像6 – 待确认状态

这是一个重要的安全功能,因为AWS希望确保电子邮件地址的所有者确实希望接收这些通知。

步骤2:确认订阅

添加订阅者后,他们必须确认他们希望从您的SNS主题接收通知。

AWS会自动向您指定的地址发送确认电子邮件订阅。 该电子邮件包含一个链接,收件人必须点击该链接以激活订阅。 在此之前,发布到该主题的任何消息都不会传递到此端点。

这是典型确认电子邮件的外观:

图像7 – SNS确认电子邮件

收件人只需点击电子邮件中的“确认订阅”链接。 他们将被带到一个页面,确认他们的订阅现在已激活:

图像8 – 订阅确认消息

对于短信订阅用户,流程类似 – AWS 发送一条包含确认链接的短信,接收者必须按照链接进行确认。HTTP/HTTPS 端点需要响应来自 AWS 的确认请求,而 AWS 资源(如 Lambda 函数和 SQS 队列)可以配置为自动确认。

您可以通过单击 SNS 控制台左侧边栏中的“订阅”部分来检查订阅状态。已确认的订阅将显示“已确认”状态,而等待确认的订阅将显示“待确认”。

图 9 – 订阅状态

一旦订阅已确认,您就可以开始发送消息了!发布到主题的任何消息都将通过指定的协议传递给所有已确认的订阅者。

设置SNS订阅就是这样。在下一部分中,您将学习如何向您的主题发布消息,并测试您的订阅者是否正确接收到这些消息。

发布消息到SNS主题

现在您已经设置了SNS主题并添加了订阅者,是时候发送您的第一条通知了。

步骤1:发布消息

通过AWS控制台发布消息是一个很好的开始。

要发送您的第一条消息,请转到您主题的详细页面,然后单击右上角的“发布消息”按钮(请参见图片 4)。这将打开消息发布表单,在那里您可以撰写通知。您将看到消息主题和正文的字段。主题是可选的,但对于电子邮件通知很有帮助,因为它将成为电子邮件的主题行。

对于简单的测试消息,您可以输入类似于以下内容:

图片 10 – 第一条消息的内容

当您满意您的消息时,请向下滚动并单击表单底部的“发布消息”按钮:

图片11 – 通过控制台发布消息

点击后,SNS立即将您的消息分发给所有已确认的订阅者。如果您设置了电子邮件订阅,您应该在几秒钟内收到测试消息:

图片12 – 电子邮件中收到的消息

简单,不是吗?现在让我们看看如何进一步自定义。

第2步:发送短信和电子邮件通知

SNS允许您自定义消息在不同类型的订阅者中显示的方式。

在发布消息时,您会注意到”消息结构”选项。默认情况下,它设置为”所有传递协议的相同有效载荷”,这意味着所有订阅者接收完全相同的消息。但是,您也可以选择”每个传递协议的自定义有效载荷”,这样您可以为每种订阅者类型定制消息格式。

对于电子邮件通知,您有两种格式选项:

  • 电子邮件-JSON:向电子邮件端点发送原始JSON有效载荷。
  • 电子邮件:发送带主题和消息正文的格式化电子邮件。

图像 13 – 负载定制

对于短信通知,请记住有160个字符的限制。SNS将传递更长的消息,但它们将被视为多条消息。您还可以将短信消息类型设置为“促销”或“交易”,这会影响传递优化:

图像 14 – 短信选项

您现在知道如何通过AWS控制台发送和定制电子邮件通知。接下来,您将学习如何通过CLI和Python执行相同操作。

步骤 3:使用AWS CLI或SDK发布消息

控制台非常适合进行手动测试,但在现实世界中,您希望以编程方式发布消息。

AWS命令行界面(CLI)使得从您的终端或自动化脚本发送SNS消息变得轻松。

假设您已经安装并配置了AWS CLI,请运行以下命令通过CLI发布消息: AWS CLI已安装并配置 通过CLI发布消息的命令:

aws sns publish --topic-arn "sns-arn" --subject "CLI Notification" --message "Hello from the AWS CLI!"

图像15 – 通过AWS CLI发布消息

立即,您将在收件箱中看到类似的消息:

图像16 – 通过AWS CLI发布消息(2)

对于更高级的应用程序,AWS SDK提供了许多编程语言中对SNS的编程访问。

以下是使用Python和boto3库发布消息的简单示例:

import boto3 # 初始化SNS客户端 sns_client = boto3.client("sns", region_name="eu-central-1") # 主题ARN(Amazon资源名称) topic_arn = "sns-arn" # 发布简单消息 response = sns_client.publish( TopicArn=topic_arn, Message="Hello from Python!", Subject="Python Notification" ) # 检查消息是否成功发送 if "MessageId" in response: print(f"Message published successfully! Message ID: {response['MessageId']}")

图像17 – 通过Python SDK发布消息

再次,消息立即发送到我的收件箱:

图像18 – 通过Python SDK发布消息(2)

这就是使用SNS发布消息的全部内容!现在您有多种发送通知的方式,从简单的控制台界面到使用AWS CLI或SDK进行编程发布。

> 刚接触AWS Boto in Python?立即报名参加我们的课程,快速掌握技能

在下一节中,我们将探讨一些SNS的高级功能,让您的通知更上一层楼。

高级SNS功能

到目前为止,您已经学会了SNS的基础知识。在本节中,您将了解几个使SNS真正强大的高级功能。

SNS 消息过滤

向所有订阅者发送相同的通知通常会导致终端点收到他们不关心的消息。

消息过滤通过允许订阅者根据消息属性过滤他们接收的消息来解决这个问题。可以将其类比为设置电子邮件过滤器 – 您创建规则来决定哪些消息可以通过。对于 SNS,这些规则被称为过滤策略

首先,您可以在订阅上设置过滤策略,以便它们只接收相关的消息:

图像 19 – 通知过滤策略

在此示例中,订阅者将仅收到具有数值大于或等于1500的属性order_value的消息通知。

现在,要发送这样的通知,您可以使用以下Python代码:

import boto3 # 初始化SNS客户端 sns_client = boto3.client("sns", region_name="eu-central-1") # 主题ARN(Amazon资源名称) topic_arn = "arn:aws:sns:eu-central-1:105036517833:TestTopic" response = sns_client.publish( TopicArn=topic_arn, Message="A new high-value order has been placed", Subject="New Order Notification", MessageAttributes={ "order_value": {"DataType": "Number", "StringValue": "2000"}, "region": {"DataType": "String", "StringValue": "EU"}, "category": {"DataType": "String", "StringValue": "Electronics"}, }, ) print(response)

运行Python脚本后,您将看到以下内容:

图像20 – 通过Python发送通知

只有当订单价值order_value达到或超过1500时,您才会收到通知:

图像21 – 通知内容

简而言之,过滤策略允许您发送定向通知,而无需更改发布代码。最好的部分是过滤发生在AWS端,而不是在您的应用程序中,这提高了效率并减少了不必要的流量。

SNS死信队列(DLQ)

即使是最可靠的系统,消息传递有时也可能失败。

死信队列(DLQ)是一个特殊的Amazon SQS队列,SNS可以将无法传递给其订阅者的消息发送到该队列。通常情况下,当订阅者不可用或返回错误时会发生这种情况。与其永久丢失这些失败的消息,SNS会将它们重定向到DLQ,您可以稍后分析它们或重试传递。

设置DLQ涉及两个步骤。首先,创建一个SQS队列作为您的DLQ:

图片22 – 创建一个SQS队列

然后,配置您的SNS订阅以使用此队列处理无法传递的消息:

图片23 – 将重试策略添加到SQS队列

此配置需要正确的权限,因为SNS需要能够向SQS队列发送消息。在AWS控制台中,您可以通过简单的复选框设置此项,但如果您正在使用CloudFormation或其他基础设施即代码工具,则需要添加适当的IAM权限。

有了DLQ,您可以监控投递失败并在需要时采取行动。例如,您可以设置一个警报,当消息开始出现在DLQ中时触发,提醒您可能存在订阅者的问题,但这超出了本节的范围。

使用AWS Lambda与SNS

Lambda函数为处理SNS消息打开了一系列可能性。

当您将Lambda函数订阅到SNS主题时,每当发布消息时该函数将自动触发。Lambda的无服务器方法意味着您无需管理任何基础设施来处理消息,因为它会根据消息量自动扩展。

首先,创建一个Lambda函数:

图像24 – 创建一个Lambda函数

然后,填写类似于以下代码:

def lambda_handler(event, context): # SNS 消息以 'Records' 数组的形式到达 for record in event["Records"]: # 提取消息 message = record["Sns"]["Message"] subject = record["Sns"]["Subject"] timestamp = record["Sns"]["Timestamp"] # 处理消息 print(f"Received message: {message}") print(f"Subject: {subject}") print(f"Timestamp: {timestamp}") # 你的业务逻辑在这里 # 例如,将消息存储在数据库中 # 或触发另一个 AWS 服务 print("ALL DONE!") # 返回成功 return {"statusCode": 200, "body": "Message processed successfully"}

图 25 – Lambda 函数代码

一旦你的代码准备好,点击 “添加触发器” 按钮将 Lambda 函数连接到 SNS:

图 26 – 将 SNS 连接到 Lambda

现在该函数已连接到队列,这意味着你可以发送测试通知:

图像 27 – 测试通知

λ函数允许您监视日志,这意味着您可以查看最近的函数调用 – 发送通知的结果:

图像 28 – Lambda函数日志

这些消息让λ函数可以做几乎任何事情 – 将它们存储在数据库中,触发其他AWS服务,发送电子邮件,甚至调用外部API。这使得SNS和Lambda成为构建事件驱动架构的强大组合。您可以在《使用AWS Lambda入门》教程中了解更多关于Lambda函数的内容。

接下来,您将学习SNS监控和记录的基础知识。

监控和记录SNS活动

跟踪您的社交网络活动对于维护可靠的通知系统至关重要。

使用Amazon CloudWatch与SNS

Amazon CloudWatch为您的所有AWS服务提供全面监控,包括SNS。当您将CloudWatch与SNS设置好后,您将获得重要运营指标的可见性,如消息传递速率、失败情况和API使用模式。

要开始使用CloudWatch监控SNS,请导航到您AWS帐户中的CloudWatch控制台。从那里,您可以访问AWS自动为您收集的预配置SNS指标。

监控的最有价值的SNS指标包括:

  • 已发布消息数量:跟踪发布到您的主题的消息数量。
  • 已发送通知数量:显示成功发送消息给订阅者的次数。
  • 发送通知失败数量:突出显示发送失败的尝试,这可能表明配置问题。
  • 发布大小:用于测量已发布消息的大小,帮助您保持在服务限制范围内。

图像 29 – SNS 的默认 CloudWatch 仪表板

设置 CloudWatch 警报 可帮助您在问题影响用户之前快速做出响应。例如,您可能希望创建一个在消息传递失败超过一定阈值时触发的警报:

  1. 在 CloudWatch 控制台中,导航到“警报”部分。
  2. 单击“创建警报”,然后选择要监视的SNS指标。
  3. 定义您的阈值(例如,在5分钟内超过5次投递失败)。
  4. 配置通知操作,例如向运营团队发送警报。

如果您喜欢图像胜过说明,请从为感兴趣的指标创建警报开始,例如 NumberOfNotificationsFailed。设置将触发警报的阈值:

图像30 – 创建警报

就是这样 – 警报现在已创建并处于活动状态:

图像31 – 创建警报(2)

这些警报可以帮助您及时解决问题,而不是从不满意的用户那里得知问题。

审查SNS日志

AWS CloudTrail记录您AWS账户中的所有API活动,包括SNS服务中执行的操作。

在您的SNS主题上执行的每个操作——无论是通过控制台、CLI还是SDK——都会在CloudTrail日志中生成一个条目。这些日志为安全分析、资源变更跟踪和合规审计提供了宝贵信息。

访问CloudTrail中的SNS日志:

  1. 在您的AWS账户中打开CloudTrail控制台(您可能需要创建一个新跟踪)。
  2. 导航到“事件历史记录”以查看最近的SNS活动。
  3. 通过选择“事件来源”并输入“sns.amazonaws.com”来过滤事件。

如果文字说明不足够,请参考下面的图片。首先创建一个新的跟踪:

图像32 – 创建新的跟踪

然后在“事件历史记录”下,过滤事件以仅包括SNS的事件。

图像33 – 过滤日志

日志会自动存储在一个S3存储桶中,这意味着这种方法为您的日志提供了永久存储,并实现了更高级的查询能力。

> AWS存储是如何工作的?阅读我们关于S3和EFS的指南。

总之,通过将CloudWatch指标与CloudTrail日志相结合,您可以创建一个全面的监控系统,有助于确保您的SNS基础设施可靠运行。

使用AWS SNS的最佳实践

您现在了解了AWS SNS的基本和高级功能。剩下要讨论的是创建主题和发送消息的最佳实践。

保护SNS主题

在设置SNS基础设施时,安全性应该是首要考虑因素。如果没有适当的控制,您的主题可能会容易受到未经授权访问,这是一个巨大的安全风险。

AWS身份和访问管理(IAM)提供了保护您的SNS主题所需的工具。首先要创建遵循最小权限原则的策略 – 仅授予每个用户或服务所需的特定权限。例如,您可能希望某些应用程序仅发布消息,而其他应用程序仅需要订阅主题。

以下是一个限制发布到特定主题的示例IAM策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "sns-arn" } ] }

您还可以使用主题策略来控制哪些AWS账户可以订阅您的主题。如果您在组织边界之间共享数据,这一点尤为重要。

不要忘记定期使用AWS CloudTrail审核权限,并移除不再需要的访问权限。

管理消息量

如果处理不当,高消息量可能会使订阅者不堪重负。这就是将SNS与其他AWS服务结合使用的重要性所在。

一个常见的模式是“扇出”架构,您可以将消息发布到一个SNS主题,该主题有多个SQS队列订阅。然后每个队列可以以自己的速度输入到不同的处理系统中。这样可以将发布者与消费者解耦,并在流量激增时提供缓冲。

对于实时处理需求,考虑将Lambda函数订阅到您的主题。Lambda会根据消息量自动扩展,无需预配和管理服务器。

降低成本

虽然SNS成本效益高,但随着消息量的增长,费用可能会迅速累积。一些策略选择可以帮助控制成本。

首先,对订阅协议要有选择性。HTTP/HTTPS端点通常是最经济的选择。电子邮件通知虽然方便,但由于每条消息产生更高的成本,应该谨慎使用。

消息过滤是另一个强大的节约成本的工具。通过在订阅上实施过滤策略,确保消息只传递给感兴趣的订阅者。例如,如果您有一个适用于所有系统警报的主题,您可能希望您值班工程师在值班期间仅接收关键警报,而不是每个通知:

# 使用过滤策略订阅 response = sns.subscribe( TopicArn="sns-arn", Protocol="email", Endpoint="[email protected]", Attributes={"FilterPolicy": '{"severity": ["critical"]}'}, )

最后,定期在AWS成本资源管理器中审查您的SNS使用情况,并寻找合并主题或删除未使用订阅的机会。未使用或重复的资源不仅会增加不必要的成本,还会使您的架构复杂化。

通过遵循这些最佳实践,您将创建一个安全、可扩展且具有成本效益的SNS实现 – 这是您拥有可靠的通知服务而不会有意外费用或安全问题所需的一切。

总结AWS SNS

如果您需要跨分布式应用程序实时通知,请毋需再寻找,AWS SNS就是您的不二选择。它易于使用,与其他AWS服务很好地集成,且可无限扩展以满足您的需求。

在SNS中的发布-订阅模型使得实现可以同时到达多个通道的通知系统变得简单。从创建主题和管理订阅者到实现消息过滤和死信队列等高级功能,您现在具备了构建强大通知基础设施的知识。

您还了解了监控、安全和成本管理的关键方面,确保您的SNS实施在生产环境中保持可靠和高效。

随着应用程序继续采用事件驱动架构,像SNS这样的服务变得越来越有价值。无论您是构建简单的警报系统还是复杂的微服务,本教程中的模式为您的系统组件之间的有效通信提供了基础。

要了解更多关于AWS的信息,请跟随DataCamp提供的这些课程:

您甚至可以使用DataCamp来准备AWS认证考试 – AWS云从业者(CLF-C02)

Source:
https://www.datacamp.com/tutorial/aws-sns