AWS Systems Manager 自动化:配置 EC2 实例定期执行磁盘清理与日志归档

1. 核心概念
  • Systems Manager:AWS 的集中式运维管理服务,支持自动化任务、补丁管理、状态监控等。
  • 自动化文档(Automation Document):定义自动化任务的 YAML/JSON 文件,包含执行步骤和参数。
  • 维护窗口(Maintenance Window):设置定期执行任务的计划时间表。

2. 配置步骤
2.1 IAM 角色配置

为 EC2 实例附加 IAM 角色,使其具有以下权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "ssm:SendCommand"
      ],
      "Resource": "*"
    }
  ]
}

2.2 创建自动化文档

在 Systems Manager 中创建自定义文档(类型:Automation),内容如下:

name: DiskCleanupAndLogArchive
description: "执行磁盘清理与日志归档"
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  InstanceId:
    type: "String"
    description: "目标 EC2 实例 ID"
  LogPath:
    type: "String"
    default: "/var/log"
  S3Bucket:
    type: "String"
    description: "日志归档的 S3 存储桶"
mainSteps:
  - name: CleanDisk
    action: "aws:runCommand"
    inputs:
      DocumentName: "AWS-RunShellScript"
      InstanceIds: ["{{ InstanceId }}"]
      Parameters:
        commands:
          - "sudo find /tmp -type f -mtime +7 -delete"
          - "sudo journalctl --vacuum-time=7d"
  
  - name: ArchiveLogs
    action: "aws:runCommand"
    inputs:
      DocumentName: "AWS-RunShellScript"
      InstanceIds: ["{{ InstanceId }}"]
      Parameters:
        commands:
          - "tar -czvf /tmp/archive-$(date +%Y%m%d).tar.gz {{ LogPath }}"
          - "aws s3 cp /tmp/archive-*.tar.gz s3://{{ S3Bucket }}/"
          - "rm -f /tmp/archive-*.tar.gz"

2.3 设置维护窗口
  1. 在 Systems Manager 控制台创建维护窗口:
    • 名称:WeeklyLogMaintenance
    • 计划:使用 cron 表达式(例如每周日凌晨 2 点:cron(0 2 ? * SUN *))
  2. 注册目标 EC2 实例:
    • 通过实例 ID 或标签(如 Environment=Production)选择
  3. 添加任务:
    • 任务类型:Automation
    • 文档:选择 DiskCleanupAndLogArchive
    • 参数:
      • InstanceId: 目标实例 ID
      • S3Bucket: 日志存储桶(如 my-log-bucket)

3. 关键脚本说明
  • 磁盘清理:
    • 删除 /tmp 下超过 7 天的文件
    • 清理系统日志(保留最近 7 天)
    sudo find /tmp -type f -mtime +7 -delete
    sudo journalctl --vacuum-time=7d
    

  • 日志归档:
    • 压缩日志目录:tar -czvf /tmp/archive-$(date +%Y%m%d).tar.gz /var/log
    • 上传至 S3:aws s3 cp /tmp/archive-*.tar.gz s3://my-bucket/
    • 清理本地临时文件:rm -f /tmp/archive-*.tar.gz

4. 验证与监控
  1. 执行验证:
    • 手动在维护窗口中触发任务
    • 检查 S3 存储桶是否生成压缩日志
  2. CloudWatch 监控:
    • 配置 Events 规则捕获 AutomationExecution 状态变更
    • 失败时触发 SNS 告警
  3. 日志查看:
    • 在 Systems Manager > Run Command 中查看任务执行日志

5. 最佳实践
  • 安全加固:
    • 使用 KMS 加密 S3 存储桶中的日志
    • 限制 IAM 角色的最小权限范围
  • 错误处理:
    • 在自动化文档中添加 timeoutSeconds 参数防止超时
    • 使用 aws:waitForApt 步骤确保命令依赖就绪
  • 成本优化:
    • 设置 S3 生命周期策略,自动转移日志至 Glacier
    • 对维护窗口执行频率进行成本评估

注:此方案适用于 Linux 实例。Windows 实例需改用 PowerShell 脚本(如 Remove-Item 和 Compress-Archive)。

更多推荐