AWS 消息通知系统 SNS

news/2024/9/23 0:55:34/

AWS 消息通知系统 SNS

  • 引言
  • 什么是 AWS SNS
  • SNS 的工作原理
  • SNS 的主要应用场景
  • 示例:创建 SNS 主题和订阅
    • 使用 AWS 管理控制台
    • 使用 AWS CLI
    • 使用 AWS SDK (Python Boto3)
  • 示例 CloudWatch 如何通过 SNS 发送告警通知

引言

《AWS 监控和管理服务 CloudWatch》有介绍 CloudWatch 收集日志和监控指标,接下来就要发送警告消息了,这里就用到 AWS 另外一个消息发布/订阅服务 SNS (Simple Notification Service)

SNS_3">什么是 AWS SNS

Amazon SNS (Simple Notification Service) 是一项高度可扩展、灵活且完全托管的消息发布/订阅服务。它允许应用程序、服务和设备之间以近乎实时的方式发送和接收通知或消息。开发者可以通过 SNS 轻松地向多个订阅者发布消息,并根据需要发送给不同类型的端点。

核心概念

  1. 主题(Topic):
    SNS 主题是消息的分类渠道,发布者将消息发送到主题,然后 SNS 会将消息广播给所有订阅者。
    每个 SNS 主题都有一个唯一的 ARN(Amazon Resource Name)标识符。

  2. 订阅者(Subscriber):
    订阅者是接收 SNS 主题消息的实体。可以是不同的端点或协议,包括:
    HTTP/HTTPS:通过 HTTP/HTTPS 端点接收消息。
    Email:通过电子邮件接收通知。
    SMS:通过短信接收通知。
    SQS:将消息发送到 Amazon SQS 队列。
    Lambda:触发 Lambda 函数执行。
    Application:推送通知到移动设备应用(通过 Firebase、APNS 等)。

  3. 发布者(Publisher):
    发布者是发送消息到 SNS 主题的实体。它可以是 AWS 服务(如 CloudWatch 警告、Lambda)或任何外部应用程序。

  4. 消息:
    发布者将消息发布到主题,消息会立即转发给所有订阅了该主题的订阅者。SNS 支持文本消息和 JSON 格式的消息。

SNS 的特点和优势

  • 高可用性:SNS 是完全托管的服务,自动扩展以满足消息发布和订阅的需求。
  • 高吞吐量:支持大规模、高速的消息发布和传递。
  • 多协议支持:SNS 支持通过多种协议(HTTP、Email、SMS、SQS、Lambda 等)发送通知。
  • 按需计费:SNS 按实际使用量计费,用户仅需为发布的消息和交付的通知付费。
  • 跨区域通知:SNS 可以在 AWS 跨区域之间发送消息,确保跨地域服务之间的通信。

SNS__32">SNS 的工作原理

  1. 创建 SNS 主题:用户创建一个 SNS 主题,用于管理发布者和订阅者之间的消息通信。
  2. 订阅主题:用户或系统可以订阅该主题,可以选择不同的通信协议(例如 HTTP、Email、SMS 等)。
  3. 发布消息:发布者将消息发送到 SNS 主题。
  4. 通知分发:SNS 将消息自动分发到所有订阅者。根据订阅者的协议类型,SNS 将以相应的方式发送消息。

SNS__38">SNS 的主要应用场景

  1. 分布式系统通知: 在分布式系统中,服务组件可以通过 SNS 通知其他组件事件或状态的变化,例如资源预警或服务状态更新。
  2. 报警和监控通知: 结合 Amazon CloudWatch,当监控指标超出设定的阈值时,CloudWatch 警告可以通过 SNS 发送电子邮件、短信或其他类型的通知。
  3. 消息推送: SNS 可以用于向移动设备发送推送通知,如 iOS 和 Android 设备上的应用程序更新或系统消息。
  4. 跨系统通信: 不同系统间需要通过消息传递进行异步通信时,SNS 可以作为中介,确保消息从发送方传递到接收方,甚至可以和 SQS 队列结合使用。
  5. 无服务器架构的事件驱动: 使用 SNS 触发 AWS Lambda 函数,实现无服务器架构的事件驱动处理,例如在某个事件发生时自动执行任务。

SNS__44">示例:创建 SNS 主题和订阅

使用 AWS 管理控制台

  1. 登录到 AWS 管理控制台。
  2. 打开 SNS 控制台。
  3. 在左侧导航栏中,选择“Topics”。
  4. 点击“Create topic”按钮。
  5. 选择“Standard”类型,输入主题名称,然后点击“Create topic”。
  6. 选择刚刚创建的主题,点击“Create subscription”按钮。
  7. 选择协议(例如 Email),并输入订阅端点(例如电子邮件地址)。
  8. 点击“Create subscription”。

使用 AWS CLI

# 创建 SNS 主题
aws sns create-topic --name MyTopic# 获取主题 ARN
TOPIC_ARN=$(aws sns list-topics --query "Topics[?contains(TopicArn, 'MyTopic')].TopicArn" --output text)# 创建订阅
aws sns subscribe --topic-arn $TOPIC_ARN --protocol email --notification-endpoint example@example.com# 发布消息
aws sns publish --topic-arn $TOPIC_ARN --message "Hello, this is a test message!"

使用 AWS SDK (Python Boto3)

import boto3# 创建 SNS 客户端
sns_client = boto3.client('sns')# 创建 SNS 主题
response = sns_client.create_topic(Name='MyTopic')
topic_arn = response['TopicArn']# 创建订阅
sns_client.subscribe(TopicArn=topic_arn,Protocol='email',Endpoint='example@example.com'
)# 发布消息
sns_client.publish(TopicArn=topic_arn,Message='Hello, this is a test message!'
)

CloudWatch__SNS__95">示例 CloudWatch 如何通过 SNS 发送告警通知

要通过 Amazon CloudWatch 使用 SNS 发送告警通知,可以按照以下步骤操作:

  1. 创建 SNS 主题:
    登录到 AWS 管理控制台。
    打开 Amazon SNS 控制台。
    创建一个新的 SNS 主题,并记下主题的 ARN(Amazon Resource Name)。
  2. 订阅 SNS 主题:
    SNS 控制台中,选择刚刚创建的主题。
    创建一个新的订阅,选择协议(如 Email、SMS 等),并输入相应的终端(如电子邮件地址或电话号码)。
  3. 创建 CloudWatch 警报:
    打开 Amazon CloudWatch 控制台。
    导航到“警报”部分,然后选择“创建警报”。
    选择一个现有的指标或创建一个新的指标来监控。
    配置警报条件(如阈值、时间段等)。
    在“警报操作”部分,选择“添加通知”。
    选择 SNS 主题,并选择之前创建的 SNS 主题。
  4. 配置警报动作:
    配置警报的状态变化时(如进入警报状态、OK 状态等)发送通知。
    完成警报配置并保存。

以下是一个示例 Python 脚本,使用 Boto3 库来创建 SNS 主题、订阅和 CloudWatch 警报:

import boto3# 创建 SNS 客户端
sns_client = boto3.client('sns')# 创建 SNS 主题
response = sns_client.create_topic(Name='MyTopic')
topic_arn = response['TopicArn']# 订阅 SNS 主题
sns_client.subscribe(TopicArn=topic_arn,Protocol='email',  # 或 'sms', 'lambda', 'sqs' 等Endpoint='your-email@example.com'  # 替换为您的电子邮件地址或电话号码
)# 创建 CloudWatch 客户端
cloudwatch_client = boto3.client('cloudwatch')# 创建 CloudWatch 警报
cloudwatch_client.put_metric_alarm(AlarmName='MyAlarm',MetricName='CPUUtilization',Namespace='AWS/EC2',Statistic='Average',Period=300,EvaluationPeriods=1,Threshold=70.0,ComparisonOperator='GreaterThanThreshold',AlarmActions=[topic_arn],Dimensions=[{'Name': 'InstanceId','Value': 'i-1234567890abcdef0'  # 替换为您的实例 ID},]
)

以下是一个示例 Python 脚本,使用 Boto3 库来创建 SNS 主题、订阅、CloudWatch Logs 过滤器和警报:

import boto3# 创建 SNS 客户端
sns_client = boto3.client('sns')# 创建 SNS 主题
response = sns_client.create_topic(Name='MyLogErrorTopic')
topic_arn = response['TopicArn']# 订阅 SNS 主题
sns_client.subscribe(TopicArn=topic_arn,Protocol='email',  # 或 'sms', 'lambda', 'sqs' 等Endpoint='your-email@example.com'  # 替换为您的电子邮件地址或电话号码
)# 创建 CloudWatch Logs 客户端
logs_client = boto3.client('logs')# 创建日志组和日志流(如果尚未创建)
log_group_name = 'MyLogGroup'
log_stream_name = 'MyLogStream'
logs_client.create_log_group(logGroupName=log_group_name)
logs_client.create_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name)# 创建指标过滤器
filter_name = 'ErrorFilter'
filter_pattern = 'ERROR'
metric_name = 'ErrorCount'
metric_namespace = 'MyNamespace'logs_client.put_metric_filter(logGroupName=log_group_name,filterName=filter_name,filterPattern=filter_pattern,metricTransformations=[{'metricName': metric_name,'metricNamespace': metric_namespace,'metricValue': '1'},]
)# 创建 CloudWatch 客户端
cloudwatch_client = boto3.client('cloudwatch')# 创建 CloudWatch 警报
cloudwatch_client.put_metric_alarm(AlarmName='LogErrorAlarm',MetricName=metric_name,Namespace=metric_namespace,Statistic='Sum',Period=300,EvaluationPeriods=1,Threshold=1.0,ComparisonOperator='GreaterThanOrEqualToThreshold',AlarmActions=[topic_arn]
)

http://www.ppmy.cn/news/1529087.html

相关文章

Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 在教育信息化的大潮中,作业管理作为教学过程中的重要环节,其效率与效果直接影…

“吉林一号”宽幅02B系列卫星

离轴四反光学成像系统 1.光学系统参数: 焦距:77.5mm; F/#:7.4; 视场:≥56゜; 光谱范围:400nm~1000nm。 2.说明: 光学系统采用离轴全反射式结构,整…

滑动窗口(6)_找到字符串中所有字母异位词

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 滑动窗口(6)_找到字符串中所有字母异位词 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&#x1f4…

极狐GitLab CI/CD 功能合集(超详细教程)

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

Java启动Tomcat: Can‘t load IA 32-bit .dll on a AMD 64-bit platform报错问题解决

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

C++调用C# DLL之踩坑记录

C是非托管代码,C#则是托管代码,无法直接调用 CLR的介绍见CLR简介 MSDN提到了两种非托管-托管的交互技术:CLR Interop和COM Interop 后者要将C# 类库注册为COM组件,本文只探讨CLR,要通过C CLR写中间层代码 方式一&…

Java 读取特定目录下子文件夹的 json格式文件并解析

一、需求   有一个目录结构,包含多个子文件夹,每个子文件夹中都有一个名为goods.txt的文件,文件内容以 JSON 格式存储。现在需要将所有的goods.txt文件内容读取出来,放在一个List集合中,以便进行后续的处理。 二、使…

记录可编辑表格(未完整)

每一行都独立 <el-table-column label"操作" width"220" fixed"right"><template #default"{ row, $index }"><el-buttonv-if"!row.tableEditFlag"type"primary"size"small"click"…