name: aws-ecs-monitor
version: 1.0.1
description: AWS ECS 生产环境健康监控与 CloudWatch 日志分析工具 —— 监控 ECS 服务健康状态、ALB 目标组、SSL 证书,并提供深入的 CloudWatch 日志分析,用于错误分类、重启检测和生产告警。
metadata:
openclaw:
requires:
bins: ["aws", "curl", "python3"]
anyBins: ["openssl"]
用于 AWS ECS 服务的生产环境健康监控与日志分析。
aws CLI 并具备相应 IAM 权限:ecs:ListServices, ecs:DescribeServiceselasticloadbalancing:DescribeTargetGroups, elasticloadbalancing:DescribeTargetHealthlogs:FilterLogEvents, logs:DescribeLogGroupscurl:用于 HTTP 健康检查。python3:用于 JSON 处理和日志分析。openssl:用于 SSL 证书检查(可选)。所有配置均通过环境变量进行:
| 变量 | 是否必需 | 默认值 | 描述 |
|---|---|---|---|
ECS_CLUSTER |
是 | — | ECS 集群名称 |
ECS_REGION |
否 | us-east-1 |
AWS 区域 |
ECS_DOMAIN |
否 | — | 用于 HTTP/SSL 检查的域名(未设置则跳过) |
ECS_SERVICES |
否 | 自动检测 | 要监控的服务名称,用逗号分隔 |
ECS_HEALTH_STATE |
否 | ./data/ecs-health.json |
写入健康状态 JSON 文件的路径 |
ECS_HEALTH_OUTDIR |
否 | ./data/ |
日志和告警的输出目录 |
ECS_LOG_PATTERN |
否 | /ecs/{service} |
CloudWatch 日志组模式({service} 会被替换) |
ECS_HTTP_ENDPOINTS |
否 | — | 用于 HTTP 探测的 name=url 键值对,用逗号分隔 |
ECS_HEALTH_STATE(默认:./data/ecs-health.json)—— 健康状态 JSON 文件。ECS_HEALTH_OUTDIR(默认:./data/)—— 日志、告警和分析报告的输出目录。scripts/ecs-health.sh —— 健康监控器# 完整检查
ECS_CLUSTER=my-cluster ECS_DOMAIN=example.com ./scripts/ecs-health.sh
# 仅 JSON 输出
ECS_CLUSTER=my-cluster ./scripts/ecs-health.sh --json
# 静默模式(无告警,仅更新状态文件)
ECS_CLUSTER=my-cluster ./scripts/ecs-health.sh --quiet
退出码:0 = 健康,1 = 不健康/降级,2 = 脚本错误
scripts/cloudwatch-logs.sh —— 日志分析器# 从服务拉取原始日志
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh pull my-api --minutes 30
# 显示所有服务的错误
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh errors all --minutes 120
# 深度分析,包含错误分类
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh diagnose --minutes 60
# 检测容器重启
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh restarts my-api
# 根据健康状态文件自动诊断
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh auto-diagnose
# 所有服务的汇总报告
ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh summary --minutes 120
选项:--minutes N(默认:60)、--json、--limit N(默认:200)、--verbose
当未设置 ECS_SERVICES 时,两个脚本都会从集群自动检测服务:
aws ecs list-services --cluster $ECS_CLUSTER
日志组通过模式解析(默认 /ecs/{service})。可通过 ECS_LOG_PATTERN 覆盖:
# 如果您的日志组是 /ecs/prod/my-api, /ecs/prod/my-frontend 等
ECS_LOG_PATTERN="/ecs/prod/{service}" ECS_CLUSTER=my-cluster ./scripts/cloudwatch-logs.sh diagnose
健康监控器在检测到问题时可以触发日志分析器进行自动诊断。将 ECS_HEALTH_OUTDIR 设置为共享目录,并同时运行两个脚本:
export ECS_CLUSTER=my-cluster
export ECS_DOMAIN=example.com
export ECS_HEALTH_OUTDIR=./data
# 运行健康检查(失败时自动触发日志分析)
./scripts/ecs-health.sh
# 或独立运行日志分析
./scripts/cloudwatch-logs.sh auto-diagnose --minutes 30
日志分析器将错误分类为:
panic —— Go panicfatal —— 致命错误oom —— 内存不足timeout —— 连接/请求超时connection_error —— 连接被拒绝/重置http_5xx —— HTTP 5xx 响应python_traceback —— Python 回溯exception —— 通用异常auth_error —— 权限/授权失败structured_error —— JSON 结构化的错误日志error —— 通用的 ERROR 级别消息健康检查噪声(来自 ALB 的 GET/HEAD /health 请求)会自动从错误计数和 HTTP 状态分布中过滤掉。