跳至内容
AWS

AWS SNS:实时通知完整指南

本教程带您从创建第一个主题开始,一步步实现消息过滤和死信队列等高级功能,并附有详尽的操作步骤和实用代码示例。
Dario Radečić's photo
Dario Radečić
已更新 · 15分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

在您的应用程序中管理实时通知可能极具挑战——至少在没有合适的消息服务时是这样。

Amazon Simple Notification Service(SNS)提供了全托管的消息解决方案,帮助解耦并扩展微服务、分布式系统和无服务器应用。SNS 允许您通过多种传输协议(如 HTTP/S、电子邮件、短信和移动推送通知)向大量订阅者发送消息。AWS SNS 负责消息投递中的繁重工作,包括可靠投递、重试和退避等功能,让您可以专注于构建核心应用功能。

AWS SNS 遵循发布-订阅模型,既易于扩展,也易于理解。单条已发布消息可同时分发到多个端点,这使 SNS 非常适合事件驱动架构。

在本教程中,我将带您完成设置并使用 AWS SNS 在各个渠道发送通知的全过程。

什么是 AWS SNS?

Amazon Simple Notification Service(SNS)是 AWS 的托管发布/订阅消息服务,可帮助您解耦微服务、分布式系统和无服务器应用。

SNS 基于简单的发布-订阅模型:发布者将消息发送到主题,订阅者接收这些消息。可以把 SNS 主题看作通信渠道——您向这个渠道发布消息,所有订阅了它的人会立即收到通知。其妙处在于,发布者无需知道谁在接收消息,订阅者也无需知道谁在发送消息。

您可能想知道它与其他 AWS 消息服务(如 Simple Queue Service(SQS))有何不同。简而言之,SQS 使用主要用于异步处理任务的基于队列模型,而 SNS 专注于同时向多个接收方广播消息。这使 SNS 十分适合需要通知多个系统某事件刚刚发生的场景。您可以在 SQS vs SNS 博文中了解更多区别。 

SNS 支持多种投递协议,从而为订阅者接收通知的方式提供了灵活性。

AWS SNS 的关键特性

SNS 内置了众多特性,使其成为您所需的唯一通知服务。下面列出几个:

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

但 SNS 最出色的部分当属可扩展性。SNS 会根据应用需求自动扩展。无论您每天发送 10 条还是 1000 万条通知,服务都会相应调整,无需人工干预。

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

设置 AWS SNS

在使用 SNS 发送第一条通知之前,您需要完成一些设置步骤。

步骤 1:创建 AWS 账户

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

前往AWS 主页,并在右上角点击“Create an AWS Account(创建 AWS 账户)”按钮。您需要提供电子邮件地址、创建密码并填写一些基本账户信息。AWS 还会要求提供信用卡信息——别担心,SNS 有相当慷慨的免费套餐,只要不超出限额就不会产生费用。

账户设置完成后,您就可以继续了。不过,我强烈建议创建专用 IAM 用户,而不是使用根账户。本文不展开这一话题,请参阅官方说明以获取详细指南。

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

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

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

  • 在控制台顶部的搜索栏输入“SNS”
  • 点击顶部导航栏的“Services(服务)”,在“Application Integration(应用集成)”类别下找到 SNS
  • 直接前往SNS 控制台

无论采用哪种方式,您都将看到如下界面:

Image 1 - AWS SNS service page

图片 1 - AWS SNS 服务页面

进入 SNS 仪表板后,您会在左侧看到“Topics(主题)”“Subscriptions(订阅)”和“Mobile(移动)”等选项。仪表板可概览 SNS 资源和最近活动。

对于新账户,这里可能几乎是空的——这是正常的。现在,让我们创建第一个 SNS 主题。

步骤 3:创建 SNS 主题

SNS 主题本质上是一个通信渠道,发布者将消息发送到该渠道,订阅者进行监听。

把它想象成广播电台——电台在特定频率(主题)上广播,任何调到该频率的听众都会收到广播。在 SNS 术语中,您的应用将消息发布到主题,所有订阅该主题的端点都会接收这些消息。

以下是创建首个 SNS 主题的方法:

  1. 在图片 1所示的界面中输入主题名称。
  2. 点击“Next step(下一步)”按钮。
  3. 类型选择“Standard”(FIFO 主题的用例不同,稍后会介绍)。
  4. (可选)输入显示名称。该名称会包含在发送给短信或电子邮件订阅者的消息中。
  5. 其他设置暂时保持默认。
  6. 点击“Create topic(创建主题)”。

如果您更喜欢看图,界面应类似如下:

Image 2 - SNS topic creation

图片 2 - 创建 SNS 主题

确认设置无误后,向下滚动,直到看到“Create topic(创建主题)”按钮:

Image 3 - SNS topic creation (2)

图片 3 - 创建 SNS 主题(2)

就是这样!您的 SNS 主题已经可以使用。您会看到主题 ARN(Amazon 资源名称)等详细信息,它能唯一标识您的主题:

Image 4 - Created topic details

图片 4 - 已创建主题详情

新主题已可用于订阅,但当前还没有任何订阅者,这意味着您发布的消息不会被投递。别担心,下一部分添加订阅者后就能解决。

SNS 订阅者与订阅

正如我之前所说,SNS 主题就像广播电台。它目前还没有听众,但当您添加订阅者以接收消息后就不一样了。

什么是 SNS 订阅者?

订阅者是指在主题发布消息时从您的 SNS 主题接收通知的任何端点。

可以参考新闻简报的类比。每次您发布新一期(消息),它都会投递到邮件列表中的所有人。SNS 会自动且可扩展地完成这一过程,并为您处理所有投递细节。

AWS 支持多种订阅者类型,从而为消息处理方式提供了灵活性。主要类型如下:

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

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

步骤 1:添加订阅者

现在您已了解订阅者的概念,让我们为主题添加一个订阅者。本教程将使用最易上手的电子邮件方式。

以下是在 SNS 主题中添加电子邮件订阅者的方法:

  1. 在主题详情页(见图片 4)点击“Create subscription(创建订阅)”按钮。
  2. 在“Protocol(协议)”下拉框中选择“Email”。
  3. 在“Endpoint(端点)”字段中输入应接收通知的电子邮件地址。
  4. 其余设置保持默认值。
  5. 点击“Create subscription(创建订阅)”。

您的界面应类似如下:

Image 5 - Creating an email subscription

图片 5 - 创建电子邮件订阅

点击“Create subscription(创建订阅)”后,AWS 会将该订阅添加到您的主题,但其状态为“pending confirmation(待确认)”:

Image 6 - Pending confirmation state

图片 6 - 待确认状态

这是一个重要的安全特性,AWS 需要确认电子邮件地址的所有者确实希望接收这些通知。

步骤 2:确认订阅

添加订阅者后,对方必须确认愿意接收来自您 SNS 主题的通知。

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

典型的确认邮件如下所示:

Image 7 - SNS confirmation email

图片 7 - SNS 确认邮件

收件人只需点击邮件中的“Confirm subscription(确认订阅)”链接。随后会跳转到一个页面,确认订阅已生效:

Image 8 - Subscription confirmation message

图片 8 - 订阅确认消息

短信订阅的流程类似——AWS 会发送包含确认链接的短信,收件人需按指引确认。HTTP/HTTPS 端点需要对 AWS 发送的确认请求作出响应,而像 Lambda 函数和 SQS 队列等 AWS 资源可配置为自动确认。

您可以在 SNS 控制台左侧边栏点击“Subscriptions(订阅)”查看订阅状态。已确认的订阅状态为“Confirmed(已确认)”,等待确认的为“Pending confirmation(待确认)”。

Image 9 - Subscription status

图片 9 - 订阅状态

订阅确认后,您就可以开始发送消息了!发布到主题的任何消息都会根据各自协议投递给所有已确认的订阅者。

SNS 订阅设置到此结束。下一节将介绍如何向主题发布消息,并测试订阅者是否正确接收。

向 SNS 主题发布消息

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

步骤 1:发布消息

一个不错的起点是通过 AWS 控制台发布消息。

要发送第一条消息,导航到主题详情页,在右上角点击“Publish message(发布消息)”(见图片 4)。这将打开消息发布表单,您可以在此撰写通知。会看到消息主题和正文字段。主题可选,但对电子邮件通知很有帮助,因为它会成为邮件主题行。

作为简单测试消息,您可以输入类似如下的内容:

Image 10 - First message contents

图片 10 - 首条消息内容

满意后,向下滚动并点击表单底部的“Publish message(发布消息)”按钮:

Image 11 - Publishing a message via the console

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

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

Image 12 - Message received in email

图片 12 - 邮件中收到的消息

很简单,对吧?接下来看看如何进一步自定义。

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

SNS 允许您根据不同类型的订阅者自定义消息展示方式。

在发布消息时,您会注意到“Message structure(消息结构)”选项。默认设置为“Identical payload for all delivery protocols(对所有传输协议使用相同负载)”,即所有订阅者收到完全相同的消息。不过,您也可以选择“Custom payload for each delivery protocol(为每种传输协议自定义负载)”,以便为每种订阅者类型定制消息格式。

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

  • Email-JSON: 将原始 JSON 负载发送到电子邮件端点。
  • Email: 发送包含主题和正文的格式化电子邮件。

Image 13 - Payload customization

图片 13 - 自定义负载

对于短信通知,请牢记 160 个字符限制。SNS 会投递更长的消息,但会被视为多条消息。您还可以将短信类型设置为“Promotional(促销)”或“Transactional(事务性)”,影响投递优化:

SMS options page in AWS SNS

图片 14 - 短信选项

您现在已了解如何通过 AWS 控制台发送并自定义电子邮件通知。接下来,您将学习如何通过 CLI 和 Python 实现相同操作。

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

控制台非常适合手动测试,但在真实环境中,您会希望以编程方式发布消息。

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

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

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

Image 15 - Message publishing through AWS CLI

图片 15 - 通过 AWS CLI 发布消息

很快,您会在收件箱中看到一条类似的消息:

Image 16 - Message publishing through AWS CLI (2)

图片 16 - 通过 AWS CLI 发布消息(2)

对于更复杂的应用,AWS SDK 提供了多种编程语言对 SNS 的编程访问。 

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

import boto3

# Initialize the SNS client
sns_client = boto3.client("sns", region_name="eu-central-1")

# Topic ARN (Amazon Resource Name)
topic_arn = "sns-arn"

# Publish a simple message
response = sns_client.publish(
    TopicArn=topic_arn, Message="Hello from Python!", Subject="Python Notification"
)

# Check if the message was sent successfully
if "MessageId" in response:
    print(f"Message published successfully! Message ID: {response['MessageId']}")

Image 17 - Message publishing through Python SDK

图片 17 - 通过 Python SDK 发布消息

同样,消息会立刻投递到我的收件箱:

Image 18 - Message publishing through Python SDK (2)

图片 18 - 通过 Python SDK 发布消息(2)

这就是使用 SNS 发布消息的全部内容!从简单的控制台到使用 AWS CLI 或 SDK 的编程发布,您已经掌握多种发送通知的方法。 

> 初次接触 Python 中的 AWS Boto?报名我们的课程,迅速上手。

下一节,我们将探索一些高级特性,助您将 SNS 通知提升到新水平。

SNS 高级特性

到目前为止,您已掌握 SNS 的基础。在本节中,您将看到几项使 SNS 更加强大的高级功能。

SNS 消息过滤

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

消息过滤通过允许订阅者基于消息属性筛选接收的消息来解决这个问题。可将其视为设置电子邮件过滤器——您创建规则来决定哪些消息能够通过。对于 SNS,这些规则称为过滤策略(filter policies)。

首先,您可以在订阅上设置过滤策略,使其仅接收相关消息:

Image 19 - Notification filter policies

图片 19 - 通知过滤策略

在此示例中,仅当消息具有数值属性 order_value 且不小于 1500 时,订阅者才会接收通知。

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

import boto3

# Initialize the SNS client
sns_client = boto3.client("sns", region_name="eu-central-1")

# Topic ARN (Amazon Resource Name)
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 脚本后,您会看到如下结果:

Image 20 - Sending a notification through Python

图片 20 - 通过 Python 发送通知

只有当 order_value 的值不小于 1500 时,您才会收到通知:

Image 21 - Notification content

图片 21 - 通知内容

简而言之,过滤策略允许您在无需修改发布代码的情况下发送定向通知。最好的是,过滤发生在 AWS 端,而非您的应用中,从而提升效率并减少不必要流量。

SNS 死信队列(DLQ)

即便是最可靠的系统,消息投递也可能偶尔失败。

死信队列(DLQ)是一个特殊的 Amazon SQS 队列,SNS 可将无法投递给订阅者的消息发送到此处。通常在订阅者不可用或返回错误时发生。SNS 不会让这些失败的消息丢失,而是将其重定向到 DLQ,您可以稍后分析或重试投递。

设置 DLQ 包括两个步骤。首先,创建一个 SQS 队列作为 DLQ:

Image 22 - Creating an SQS queue

图片 22 - 创建 SQS 队列

然后,在 SNS 订阅中配置使用该队列接收不可投递的消息:

Image 23 - Adding redrive policy to the SQS queue

图片 23 - 为 SQS 队列添加重试转发策略

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

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

将 AWS Lambda 与 SNS 结合使用

Lambda 函数为处理 SNS 消息打开了广阔空间。

当您将 Lambda 函数订阅到 SNS 主题时,每当有消息发布,函数都会自动触发。Lambda 的无服务器特性意味着您无需管理任何用于消息处理的基础设施,并能根据消息量自动扩展。

首先创建一个 Lambda 函数:

Image 24 - Creating a Lambda function

图片 24 - 创建 Lambda 函数

然后,编写类似如下的代码:

def lambda_handler(event, context):
    # SNS messages come in the 'Records' array
    for record in event["Records"]:
        # Extract the message
        message = record["Sns"]["Message"]
        subject = record["Sns"]["Subject"]
        timestamp = record["Sns"]["Timestamp"]

        # Process the message
        print(f"Received message: {message}")
        print(f"Subject: {subject}")
        print(f"Timestamp: {timestamp}")

        # Your business logic here
        # For example, store the message in a database
        # or trigger another AWS service
        print("ALL DONE!")

    # Return success
    return {"statusCode": 200, "body": "Message processed successfully"}

Image 25 - Lambda function code

图片 25 - Lambda 函数代码

代码准备就绪后,点击“Add trigger(添加触发器)”将 Lambda 函数连接到 SNS:

Image 26 - Connecting SNS to Lambda

图片 26 - 将 SNS 连接到 Lambda

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

Image 27 - Test notification

图片 27 - 测试通知

Lambda 函数允许您查看日志,这意味着可以看到最近的函数调用——也就是发送通知的结果:

Image 28 - Lambda function logs

图片 28 - Lambda 函数日志

Lambda 函数几乎可以对这些消息执行任何操作——将其存入数据库、触发其他 AWS 服务、发送电子邮件,甚至调用外部 API。这使 SNS 与 Lambda 成为构建事件驱动架构的强大组合。您可以在AWS Lambda 入门教程中了解更多有关 Lambda 函数的内容。 

接下来,您将学习 SNS 监控与日志记录的基础。

监控与记录 SNS 活动

跟踪 SNS 活动对于维护可靠的通知系统至关重要。

将 Amazon CloudWatch 与 SNS 配合使用

Amazon CloudWatch 为包括 SNS 在内的所有 AWS 服务提供全面监控。将 CloudWatch 与 SNS 集成后,您可以洞察重要的运营指标,如消息投递率、失败次数和 API 使用模式。

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

值得重点监控的 SNS 指标包括:

  • NumberOfMessagesPublished: 跟踪发布到主题的消息数量。
  • NumberOfNotificationsDelivered: 显示成功投递到订阅者的消息数量。
  • NumberOfNotificationsFailed: 突出显示投递失败尝试,可能指示配置问题。
  • PublishSize: 衡量已发布消息的大小,帮助您保持在服务限制范围内。

Image 29 - Default Cloudwatch dashboard for SNS

图片 29 - SNS 的默认 CloudWatch 仪表板

设置CloudWatch 告警可帮助您在问题影响用户之前快速响应。例如,您可以创建当消息投递失败超过某一阈值时触发的告警:

  1. 在 CloudWatch 控制台中,前往“Alarms(告警)”部分。
  2. 点击“Create alarm(创建告警)”,选择您要监控的 SNS 指标。
  3. 定义阈值(例如,5 分钟内失败投递超过 5 次)。
  4. 配置通知操作,例如向运维团队发送告警。

如果您更喜欢图示步骤,可先为感兴趣的指标(如 NumberOfNotificationsFailed)创建一个告警。设置触发该告警的阈值:

Image 30 - Alarm creation

图片 30 - 创建告警

完成——告警已创建并处于激活状态:

Image 31 - Alarm creation (2)

图片 31 - 创建告警(2)

这些告警能够帮助您主动处理问题,而不是等到用户反馈不满时才发现。

查看 SNS 日志

AWS CloudTrail 会捕获您 AWS 账户中的所有 API 活动,包括 SNS 服务内执行的操作。

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

在 CloudTrail 中访问 SNS 日志的方法:

  1. 在 AWS 账户中打开 CloudTrail 控制台(您可能需要先创建一个新的 trail)。
  2. 导航到“Event history(事件历史)”以查看近期的 SNS 活动。
  3. 在“Event source(事件来源)”中输入“sns.amazonaws.com”进行筛选。

如果文字说明还不够清晰,请参考下图。首先创建一个新的 trail:

Image 32 - Creating a new trail

图片 32 - 创建新 trail

然后在“Event history(事件历史)”中,仅筛选 SNS 的事件:

Image 33 - Filtering logs

图片 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 端点通常是最具成本效益的选项。电子邮件通知虽方便,但由于每条消息成本更高,应谨慎使用。

消息过滤同样是强大的降本工具。通过在订阅上实施过滤策略,您可确保消息仅投递给有兴趣的订阅者。例如,若您有一个包含所有系统告警的主题,或许只希望值班工程师在其值班期间接收严重级别告警,而不是所有通知:

# Subscribe with a filter policy
response = sns.subscribe(
    TopicArn="sns-arn",
    Protocol="email",
    Endpoint="oncall@example.com",
    Attributes={"FilterPolicy": '{"severity": ["critical"]}'},
)

最后,定期在 AWS Cost Explorer 中回顾 SNS 使用情况,寻找整合主题或移除未使用订阅的机会。未使用或重复的资源不仅会增加不必要的成本,还会使架构复杂化。

通过遵循这些最佳实践,您将构建一个安全、可扩展且具成本效益的 SNS 实施方案——既能提供可靠的通知服务,又无需担心意外开支或安全问题。

总结 AWS SNS

如果您需要在分布式应用之间实现实时通知,AWS SNS 就是不二之选。它易于使用,与其他 AWS 服务集成良好,并可无限扩展以满足您的需求。

SNS 的发布-订阅模型使实现可同时覆盖多个渠道的通知系统变得直截了当。从创建主题和管理订阅者,到实现消息过滤和死信队列等高级功能,您现在已具备构建稳健通知基础设施的知识。

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

随着应用继续采用事件驱动架构,SNS 等服务的价值与日俱增。无论您在构建简单的告警系统还是复杂的微服务,本教程中的模式都能为系统组件间的有效通信打下基础。

要进一步学习 AWS,请查看 DataCamp 的以下课程:

您甚至可以使用 DataCamp 来备考 AWS 认证考试——AWS Cloud Practitioner(CLF-C02)。

FAQs

什么是 AWS SNS?它与 SQS 有何不同?

AWS SNS(Simple Notification Service,简单通知服务)是一项全托管的消息服务,可让您将通知从发布者发送到多个订阅者。不同于 SQS(Simple Queue Service,简单队列服务)采用的基于队列的模型——每条消息由单个消费者处理,SNS 使用发布-订阅模型,可将单条消息同时广播给许多接收者。这一根本差异使 SNS 非常适合事件通知,而 SQS 更适用于任务处理。

哪些类型的端点可以订阅 SNS 主题?

AWS SNS 支持广泛的订阅端点类型,包括电子邮件地址、短信手机号、SQS 队列、Lambda 函数、HTTP/HTTPS 端点以及移动推送通知。这种多样性为通知的投递与处理提供了灵活性,使您能够用同一条已发布消息同时触达人工接收者(通过电子邮件或短信)和其他系统(通过 Lambda、SQS 或 HTTP 端点)。

如何保护我的 SNS 主题安全?

保护 SNS 主题安全需要通过遵循最小权限原则的 IAM 策略来实施适当的访问控制。您可以限制谁能向主题发布以及谁能管理订阅,并使用主题策略来控制哪些 AWS 账户可以订阅。对于敏感数据,AWS SNS 支持服务端加密以保护消息内容在传输过程中的安全。定期使用 CloudTrail 日志进行安全审计,有助于识别未授权访问尝试或 SNS 实施中的潜在漏洞。

如何在 SNS 中实施消息过滤?

SNS 的消息过滤允许订阅者只接收与其相关的通知。订阅者基于消息属性定义过滤策略(filter policies)来实现这一点。当您发布带有特定属性(如订单金额、区域或优先级)的消息时,SNS 会将这些属性与每位订阅者的过滤策略进行对比,仅在匹配时才投递消息。过滤发生在 AWS 端而非您的应用中,从而提升效率并减少不必要的消息流量。

死信队列(DLQ)在 SNS 中如何工作?

死信队列(DLQ)为 SNS 的消息投递失败提供安全网。当消息无法投递给订阅者(通常因订阅者不可用或返回错误)时,SNS 可将其重定向到指定的 SQS 队列,而不是直接丢失。借助 DLQ,您可以捕获、分析并潜在地重试这些失败的投递。对于关乎业务关键的通知,该机制尤为有价值,可提供对投递问题的可见性,防止其被忽视。


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
常驻克罗地亚的高级数据科学家。顶级科技写作者,已发表 700 多篇文章,累计获得超过 1,000 万次阅读。著有《使用 TPOT 实现机器学习自动化》。
主题
AWS

通过这些课程进一步学习 AWS!

课程

AWS 概念

2 小时
53.3K
探索 Amazon Web Services (AWS) 的世界,了解它为何处于云计算前沿。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多