AWS中国区SmokePing网络监控部署指南:Docker容器化与SNS告警集成

核心摘要

  • SmokePing基于Docker容器化部署,资源占用低,单台t3.small实例即可运行完整监控系统
  • 支持ICMP、TCP、DNS、HTTP等多协议探测,可监控专线网络质量、跨区域服务性能及关键业务端口
  • 通过Amazon SNS或自定义Python脚本实现告警推送,支持Master/Slave分布式架构扩展
  • RRD数据库高效存储历史监控数据,便于故障溯源与性能趋势分析

AWS中国区SmokePing网络监控部署指南:Docker容器化与SNS告警集成

为什么需要轻量级网络监控方案

在亚马逊云科技中国区运营环境中,由于缺乏托管的网络监控管理服务(如Network Synthetic Monitor),运维团队在多个关键场景中面临监控盲区。Direct Connect专线网络质量波动、Overlay网络可达性异常、跨区域服务访问延迟以及关键业务端口的可用性状态,这些都需要持续性的监控覆盖。

市面上主流的监控方案如Prometheus blackbox-exporter + Grafana组合虽然功能全面,但其部署复杂度和资源消耗往往超出轻量级监控场景的实际需求。对于仅需监控特定网络链路或服务端点的场景,一个能在单台小型实例上稳定运行、同时提供直观可视化界面的解决方案更具实用价值。

SmokePing技术特性与架构优势

SmokePing作为一款经过长期验证的开源网络延迟监测工具,在轻量化监控领域具备显著优势。其核心设计理念是以最小的系统开销实现精确的网络性能测量。

核心技术优势

  • 容器化部署:基于Docker的部署方式将依赖项降至最低,环境一致性得到保障
  • 资源效率:内存和CPU占用极低,t3.small甚至更小规格的实例即可满足运行需求
  • 配置灵活性:通过文本配置文件定义监控目标和探测参数,版本控制友好
  • 可视化呈现:内置Web界面提供网络性能趋势图表,延迟抖动一目了然

功能覆盖范围

  • 精确延迟测量:同时追踪数据包丢失率和往返时间(RTT)变化
  • 多协议支持:涵盖ICMP、TCP、DNS、HTTP等常用网络协议
  • 多级告警机制:支持基于丢包模式和延迟阈值的复合告警规则
  • RRD数据存储:采用环形数据库高效存储时序数据,自动归档历史记录
  • 分布式架构:Master/Slave模式支持跨可用区或跨区域的多点探测

这套方案还支持与Amazon SNS集成或通过第三方API推送告警通知,确保运维团队能够及时响应网络异常。如果您正在寻找多云账单代付解决方案来优化云资源成本管理,轻量级监控工具的选择同样需要考虑运维效率与成本平衡。

部署前的环境准备

在开始SmokePing部署之前,需要完成以下基础设施准备工作:

EC2访问密钥对

准备用于SSH登录的密钥对,确保能够安全连接到目标实例进行配置操作。

安全组配置

创建安全组并开放必要端口:SSH端口(22)用于管理访问,监控页面端口(默认8888)用于Web界面访问。根据实际网络架构,可能还需要开放探测目标所需的出站规则。

EC2 IAM角色配置

IAM角色的权限配置需根据实际功能需求确定:

ECR镜像拉取权限(使用自建ECR作为镜像源时需要):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage"
            ],
            "Resource": "*"
        }
    ]
}

告警功能权限:如需使用SNS发送通知或通过Lambda触发自定义告警脚本,需添加相应的sns:Publishlambda:InvokeFunction权限。

VPC Endpoint配置(可选)

若EC2部署在无互联网访问的私有子网中,需要为ECR、SNS、Lambda等服务创建VPC Endpoint,确保实例能够访问这些AWS服务。

SmokePing安装与配置流程

构建ECR镜像(推荐)

由于linuxserver/docker-smokeping官方镜像的下载可能受网络环境影响,建议将镜像下载后更新组件并推送至ECR,便于后续稳定使用。

官方Dockerfile未预装Python环境,无法直接使用自定义Python脚本实现告警。根据告警需求选择不同的代码仓库:

  • 需要Python脚本告警(SNS、Lambda或自定义API):git clone https://github.com/mengchen-tam/docker-smokeping
  • 仅使用SMTP告警git clone https://github.com/linuxserver/docker-smokeping

ECR镜像构建脚本

使用以下Bash脚本构建并推送镜像至ECR,执行前需更新相关参数:

#!/bin/bash
set -e

# 默认参数
ECR_ACCOUNT=""
ECR_REGION=""
ECR_REPO_NAME=""
TAG="latest"
DOCKER_DIR="/xxxx/docker-smokeping"

# 构建完整的 ECR 仓库 URL
ECR_URL="${ECR_ACCOUNT}.dkr.ecr.${ECR_REGION}.amazonaws.com.cn"
ECR_REPO="${ECR_URL}/${ECR_REPO_NAME}"
FULL_IMAGE_NAME="${ECR_REPO}:${TAG}"

echo "===== SmokePing Docker 构建和推送脚本 ====="
echo "ECR 账号: $ECR_ACCOUNT"
echo "ECR 区域: $ECR_REGION"
echo "ECR URL: $ECR_URL"
echo "仓库名称: $ECR_REPO_NAME"
echo "镜像标签: $TAG"
echo "目标镜像: $FULL_IMAGE_NAME"

# 进入 docker-smokeping 目录
cd "$DOCKER_DIR"

# 构建 Docker 镜像
echo "正在构建 Docker 镜像..."
docker build \
    --no-cache \
    --pull \
    -t "$FULL_IMAGE_NAME" .

# 登录到 ECR
echo "正在登录到 ECR..."
aws ecr get-login-password --region $ECR_REGION | docker login --username AWS --password-stdin $ECR_URL

# 检查仓库是否存在,如果不存在则创建
if ! aws ecr describe-repositories --repository-names $ECR_REPO_NAME --region $ECR_REGION &> /dev/null; then
    echo "创建 ECR 仓库 $ECR_REPO_NAME..."
    aws ecr create-repository --repository-name $ECR_REPO_NAME --region $ECR_REGION
fi

# 推送镜像到 ECR
echo "正在推送镜像到 ECR..."
docker push "$FULL_IMAGE_NAME"

echo "===== 完成! ====="
echo "镜像已成功构建并推送到: $FULL_IMAGE_NAME"

EC2实例配置与软件安装

启动一台Ubuntu 24 EC2实例(使用默认Ubuntu AMI),推荐t3.small或更高规格。配置要点:

  • 附加准备好的密钥对和安全组
  • Metadata response hop limit需设置为2(确保容器内能访问实例元数据)
  • 启动后通过Modify IAM role附加准备好的EC2角色

登录EC2后安装必要软件:

sudo snap install aws-cli --classic
sudo apt update
sudo apt upgrade
sudo apt install docker.io docker-compose

SmokePing容器初始化

按以下步骤完成容器部署和配置文件提取:

# 第1步:将当前用户添加到 docker 组
sudo usermod -aG docker $USER
newgrp docker

# 第2步:设置环境变量
export AWS_ACCOUNT_ID=""
export AWS_REGION=""
export REPO_NAME=""
export ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com.cn"
export IMAGE_TAG="latest"

# 第3步:ECR登录
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REGISTRY}

# 第4步:拉取和标记镜像
docker pull ${ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}
docker tag ${ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} smokeping:${IMAGE_TAG}

# 第5步:首次运行容器
docker run --name smokeping -d --rm -p 8888:80 -e TZ=Asia/Shanghai smokeping:${IMAGE_TAG}

# 第6步:准备数据目录
sudo mkdir -p /data/smokeping
sudo chown -R $USER:$USER /data/smokeping

# 第7步:复制初始配置文件到EC2文件系统中
docker cp smokeping:/data/ /data/smokeping/
docker cp smokeping:/config/ /data/smokeping/

# 第8步:停止临时容器
docker stop smokeping

# 第9步:挂载本地文件启动smokeping
docker run --name smokeping -d \
    --restart unless-stopped \
    -p 8888:80 \
    -e TZ=Asia/Shanghai \
    -v ~/smokeping/data:/data \
    -v ~/smokeping/config:/config \
    smokeping:${IMAGE_TAG}

配置文件目录结构

安装完成后,/data/smokeping目录结构如下:

smokeping/
├── config/                 # 配置文件目录
│   ├── Alerts             # 告警配置文件,定义告警规则和触发条件
│   ├── Database           # 数据库配置文件,定义 RRD 数据库存储参数
│   ├── General            # 通用配置文件,包含基本设置如所有者信息、网站标题等
│   ├── Presentation       # 展示配置文件,定义网页显示相关参数
│   ├── Probes             # 探测器配置文件,定义不同类型的监控探测方式
│   ├── Slaves             # 从节点配置文件,用于分布式监控设置
│   └── Targets            # 监控目标配置文件,定义要监控的主机和服务
└── data/                   # 数据存储目录
    ├── DNS/               # DNS监控相关的数据目录
    └── DNSProbes/         # DNS探测器的数据目录

其中TargetsAlerts是最核心的配置文件,其他配置通常保持默认即可。

监控目标配置示例

根据实际监控需求编辑/data/smokeping/config/Targets文件。以下是一个针对AWS中国区服务的监控配置示例:

*** Targets ***

probe = FPing

menu = Top
title = AWS China Network Latency
remark = AWS中国区网络延迟监控

+ Console
menu = 控制台
title = AWS控制台监控
remark = AWS中国区控制台访问监控

++ BeijingConsole
menu = 北京控制台
title = AWS北京区控制台
host = console.amazonaws.cn

++ NingxiaConsole
menu = 宁夏控制台
title = AWS宁夏区控制台
host = cn-northwest-1.console.amazonaws.cn

+ Storage
menu = 存储服务
title = AWS存储服务监控
remark = AWS中国区存储服务监控
probe = TCPPing

++ BeijingS3
menu = 北京S3
title = AWS北京区S3
host = s3.cn-north-1.amazonaws.com.cn
port = 443

++ NingxiaS3
menu = 宁夏S3
title = AWS宁夏区S3
host = s3.cn-northwest-1.amazonaws.com.cn
port = 443

+ DNS
menu = DNS服务
title = AWS DNS服务监控
remark = AWS中国区DNS服务器监控

++ DNS_115
menu = DNS-115
title = AWS DNS Server 115
host = ns-intl-115.awsdns-cn-07.com
port = 53

++ DNS_1457
menu = DNS-1457
title = AWS DNS Server 1457
host = ns-1457.awsdns-cn-27.net
port = 53

Docker Compose配置

创建docker-compose.yml文件以便于容器管理:

cd /data/smokeping/
cat > docker-compose.yml << 'EOF'
version: '3'
services:
  smokeping:
    container_name: smokeping
    image: smokeping
    ports:
      - "8888:80"
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
    volumes:
      - /data/smokeping/data:/data
      - /data/smokeping/config:/config
    restart: unless-stopped
EOF

使用Docker Compose启动服务:

docker stop smokeping
docker remove smokeping
cd /data/smokeping/
docker-compose up -d

SmokePing使用指南

访问监控界面

通过http://[EC2公网IP]:8888访问SmokePing Web界面。由于默认探测间隔为300秒,首次访问需等待约5分钟才能看到监控数据。如需更换访问端口,修改/data/smokeping/docker-compose.yml中的端口映射配置即可。

配置更新与数据持久化

根据监控需求修改/data/smokeping/config/目录下的配置文件后,执行docker-compose restart使配置生效。历史监控数据保存在/data/smokeping/data目录中,采用RRD文件格式按目录层级存储:

├── data
│   ├── Console
│   │   ├── BeijingConsole.rrd
│   │   └── NingxiaConsole.rrd

配置更新或镜像升级不会导致历史数据丢失,这一设计确保了监控数据的连续性和可追溯性。

历史数据查询

在Web界面中点击对应的监控图表可进入详细监控页面。在详细页面中,支持通过拖选时间段或指定time range参数查看特定时间段的监控数据,便于故障时间点的精确定位。

告警系统配置

告警规则定义

/data/smokeping/config/Alerts文件中定义告警类型和通知方式:

*** Alerts ***

to = |/config/alertsns.py
from = [email protected]

+someloss
type = loss
# in percent
pattern = >0%,*12*,>0%,*12*,>0%
comment = loss 3 times in a row

+hostdown
type = loss
# in percent
pattern = >60%
edgetrigger = yes
comment = Massive loss for 5 mins

告警通知方式选择:

  • SMTP环境:直接配置收件邮箱地址
  • 内网环境:通过脚本触发Lambda或SNS服务

目标级别告警配置

config/Targets文件中为特定目录或主机启用告警:

+ Demo_Monitor
menu = Monitor Demo (Demo using fake IP)
title = Monitor Demo (Demo using fake IP)
alerts = someloss,hostdown

此配置将对Demo_Monitor目录下所有监控目标启用somelosshostdown两种告警类型。

SNS告警脚本实现

以下Python脚本实现了与Amazon SNS的集成,通过EC2实例元数据服务获取临时凭证:

#!/usr/bin/env python3
# 导入必要的库
import sys
import time
import boto3
import requests
import json
from datetime import datetime

def get_imdsv2_token():
    """
    获取 EC2 实例元数据服务 V2 版本的 token
    这是 AWS 推荐的安全实践,用于防止 SSRF 攻击
    """
    token_url = "http://169.254.169.254/latest/api/token"
    headers = {
        "X-aws-ec2-metadata-token-ttl-seconds": "21600"
    }
    token = requests.put(token_url, headers=headers).text
    return token

def get_credentials():
    """
    从 EC2 实例元数据服务获取临时安全凭证
    """
    # 首先获取 IMDSv2 token
    token = get_imdsv2_token()
    headers = {
        "X-aws-ec2-metadata-token": token
    }
    
    # 获取 IAM 角色名称
    role_name_url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
    role_name = requests.get(role_name_url, headers=headers).text
    
    # 使用角色名称获取临时凭证
    credentials_url = f"http://169.254.169.254/latest/meta-data/iam/security-credentials/{role_name}"
    credentials = requests.get(credentials_url, headers=headers).json()
    
    return credentials

def send_sns(topic_arn, message):
    """
    发送消息到 AWS SNS 主题
    """
    # 获取临时凭证
    credentials = get_credentials()
    
    # 初始化 SNS 客户端
    sns = boto3.client(
        'sns',
        region_name='cn-north-1',
        aws_access_key_id=credentials['AccessKeyId'],
        aws_secret_access_key=credentials['SecretAccessKey'],
        aws_session_token=credentials['Token']
    )
    
    try:
        # 发布消息到 SNS 主题
        response = sns.publish(
            TopicArn=topic_arn,
            Message=message
        )
        print(f"Message published successfully: {response['MessageId']}")
        return response
    except Exception as e:
        print(f"Failed to publish message: {str(e)}")
        return None

def main():
    """
    主函数:处理命令行参数并发送告警
    命令行参数格式:alertname target losspattern rtt hostname
    """
    # 验证命令行参数数量
    if len(sys.argv) != 6:
        print("Usage: {} alertname target losspattern rtt hostname".format(sys.argv[0]))
        sys.exit(1)
    
    # 解析命令行参数
    alertname = sys.argv[1]
    target = sys.argv[2]
    losspattern = sys.argv[3]
    rtt = sys.argv[4]
    hostname = sys.argv[5]
    
    # 生成当前时间戳并记录日志
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_message = f"""
    {current_time}: Received parameters:
    alertname: {alertname}
    target: {target}
    losspattern: {losspattern}
    rtt: {rtt}
    hostname: {hostname}
    """
    print(log_message)
    
    # 构建告警消息
    alert_message = f"SMOKEPING_ALERT|{int(time.time())}|{alertname}|{target}|{losspattern}|{rtt}|{hostname}"
    print(alert_message)
    
    # 构建格式化的 SNS 消息
    sns_message = f"""
SmokePing Alert Details:
========================
Alert Name: {alertname}
Target: {target}
Loss Pattern: {losspattern}
RTT: {rtt}
Hostname: {hostname}
Time: {current_time}
"""
    
    # 发送到 SNS 主题(需替换实际的 AWS 账号和主题名)
    topic_arn = "arn:aws-cn:sns:cn-north-1::"
    send_sns(topic_arn, sns_message)

if __name__ == "__main__":
    main()

SNS告警功能检查清单

  • Targets配置中明确指定需要触发告警的监控目标
  • 确保EC2能够通过公网或VPC Endpoint访问SNS服务
  • SNS可替换为其他API(如第三方短信服务),需相应修改Python脚本

实施要点与注意事项

网络连通性验证

部署完成后,建议先使用pingtelnet命令从EC2实例手动验证目标主机的可达性,确保安全组和网络ACL配置正确。

探测间隔调优

默认300秒的探测间隔适用于大多数场景。对于需要更高精度监控的关键链路,可在Probes配置中调整step参数,但需注意更短的间隔会增加系统负载。

存储容量规划

RRD数据库采用固定大小的环形存储结构,长期运行不会导致磁盘空间持续增长。但监控目标数量较多时,建议预留足够的/data分区空间。

高可用性考量

对于生产环境,可考虑部署Master/Slave架构,将Slave节点分布在不同可用区,既能实现多点探测,也能提供一定程度的冗余能力。

方案适用场景

这套SmokePing监控方案特别适合以下场景:

  • 尚未建立完整网络监控体系的环境,需要快速搭建基础监控能力
  • Direct Connect专线底层网络质量的持续监测
  • 外部依赖服务(如第三方API、合作伙伴系统)的可用性监控
  • 跨区域服务访问延迟的基准测量与趋势分析
  • 预算有限但需要可视化监控界面的轻量级运维场景

AWS/GCP/多云账单代付 – 免实名 & 支持 USDT 支付 | Payment 解决方案为企业提供灵活的

AWS账单代付

AWS/阿里云/谷歌云官方认证架构师,专注云计算解决方案。