AWS 消息通知系统 SNS
- 引言
- [什么是 AWS SNS](#什么是 AWS SNS)
- [SNS 的工作原理](#SNS 的工作原理)
- [SNS 的主要应用场景](#SNS 的主要应用场景)
- [示例:创建 SNS 主题和订阅](#示例:创建 SNS 主题和订阅)
-
- [使用 AWS 管理控制台](#使用 AWS 管理控制台)
- [使用 AWS CLI](#使用 AWS CLI)
- [使用 AWS SDK (Python Boto3)](#使用 AWS SDK (Python Boto3))
- [示例 CloudWatch 如何通过 SNS 发送告警通知](#示例 CloudWatch 如何通过 SNS 发送告警通知)
引言
《AWS 监控和管理服务 CloudWatch》有介绍 CloudWatch 收集日志和监控指标,接下来就要发送警告消息了,这里就用到 AWS 另外一个消息发布/订阅服务 SNS (Simple Notification Service)
什么是 AWS SNS
Amazon SNS (Simple Notification Service) 是一项高度可扩展、灵活且完全托管的消息发布/订阅服务。它允许应用程序、服务和设备之间以近乎实时的方式发送和接收通知或消息。开发者可以通过 SNS 轻松地向多个订阅者发布消息,并根据需要发送给不同类型的端点。
核心概念
-
主题(Topic):
SNS 主题是消息的分类渠道,发布者将消息发送到主题,然后 SNS 会将消息广播给所有订阅者。
每个 SNS 主题都有一个唯一的 ARN(Amazon Resource Name)标识符。
-
订阅者(Subscriber):
订阅者是接收 SNS 主题消息的实体。可以是不同的端点或协议,包括:
HTTP/HTTPS:通过 HTTP/HTTPS 端点接收消息。
Email:通过电子邮件接收通知。
SMS:通过短信接收通知。
SQS:将消息发送到 Amazon SQS 队列。
Lambda:触发 Lambda 函数执行。
Application:推送通知到移动设备应用(通过 Firebase、APNS 等)。
-
发布者(Publisher):
发布者是发送消息到 SNS 主题的实体。它可以是 AWS 服务(如 CloudWatch 警告、Lambda)或任何外部应用程序。
-
消息:
发布者将消息发布到主题,消息会立即转发给所有订阅了该主题的订阅者。SNS 支持文本消息和 JSON 格式的消息。
SNS 的特点和优势
- 高可用性:SNS 是完全托管的服务,自动扩展以满足消息发布和订阅的需求。
- 高吞吐量:支持大规模、高速的消息发布和传递。
- 多协议支持:SNS 支持通过多种协议(HTTP、Email、SMS、SQS、Lambda 等)发送通知。
- 按需计费:SNS 按实际使用量计费,用户仅需为发布的消息和交付的通知付费。
- 跨区域通知:SNS 可以在 AWS 跨区域之间发送消息,确保跨地域服务之间的通信。
SNS 的工作原理
- 创建 SNS 主题:用户创建一个 SNS 主题,用于管理发布者和订阅者之间的消息通信。
- 订阅主题:用户或系统可以订阅该主题,可以选择不同的通信协议(例如 HTTP、Email、SMS 等)。
- 发布消息:发布者将消息发送到 SNS 主题。
- 通知分发:SNS 将消息自动分发到所有订阅者。根据订阅者的协议类型,SNS 将以相应的方式发送消息。
SNS 的主要应用场景
- 分布式系统通知: 在分布式系统中,服务组件可以通过 SNS 通知其他组件事件或状态的变化,例如资源预警或服务状态更新。
- 报警和监控通知: 结合 Amazon CloudWatch,当监控指标超出设定的阈值时,CloudWatch 警告可以通过 SNS 发送电子邮件、短信或其他类型的通知。
- 消息推送: SNS 可以用于向移动设备发送推送通知,如 iOS 和 Android 设备上的应用程序更新或系统消息。
- 跨系统通信: 不同系统间需要通过消息传递进行异步通信时,SNS 可以作为中介,确保消息从发送方传递到接收方,甚至可以和 SQS 队列结合使用。
- 无服务器架构的事件驱动: 使用 SNS 触发 AWS Lambda 函数,实现无服务器架构的事件驱动处理,例如在某个事件发生时自动执行任务。
示例:创建 SNS 主题和订阅
使用 AWS 管理控制台
- 登录到 AWS 管理控制台。
- 打开 SNS 控制台。
- 在左侧导航栏中,选择"Topics"。
- 点击"Create topic"按钮。
- 选择"Standard"类型,输入主题名称,然后点击"Create topic"。
- 选择刚刚创建的主题,点击"Create subscription"按钮。
- 选择协议(例如 Email),并输入订阅端点(例如电子邮件地址)。
- 点击"Create subscription"。
使用 AWS CLI
bash
# 创建 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)
python
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 发送告警通知
要通过 Amazon CloudWatch 使用 SNS 发送告警通知,可以按照以下步骤操作:
- 创建 SNS 主题:
登录到 AWS 管理控制台。
打开 Amazon SNS 控制台。
创建一个新的 SNS 主题,并记下主题的 ARN(Amazon Resource Name)。 - 订阅 SNS 主题:
在 SNS 控制台中,选择刚刚创建的主题。
创建一个新的订阅,选择协议(如 Email、SMS 等),并输入相应的终端(如电子邮件地址或电话号码)。 - 创建 CloudWatch 警报:
打开 Amazon CloudWatch 控制台。
导航到"警报"部分,然后选择"创建警报"。
选择一个现有的指标或创建一个新的指标来监控。
配置警报条件(如阈值、时间段等)。
在"警报操作"部分,选择"添加通知"。
选择 SNS 主题,并选择之前创建的 SNS 主题。 - 配置警报动作:
配置警报的状态变化时(如进入警报状态、OK 状态等)发送通知。
完成警报配置并保存。
以下是一个示例 Python 脚本,使用 Boto3 库来创建 SNS 主题、订阅和 CloudWatch 警报:
python
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 过滤器和警报:
python
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]
)