You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何每周自动执行用于备份的AWS CLI命令?

实现每周自动运行AWS CLI备份命令的方案

先优化你的命令(避免硬编码密钥)

原命令里的aws configure set硬编码了密钥,在自动化场景下风险极高,建议改用IAM角色或环境变量传递凭证,绝对不要在脚本中写入明文密钥。

调整后的脚本示例(优先推荐IAM角色,无需手动配置身份):

# 直接使用IAM角色的默认凭证,无需手动配置profile
aws s3 ls --endpoint-url=https://s3.wasabisys.com
aws s3 sync <SOURCE-BUCKET> <DESTINATION-BUCKET> --endpoint-url=https://s3.wasabisys.com

如果必须指定profile,可通过环境变量传递(仍需妥善保管密钥):

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="us-east-2"
export AWS_OUTPUT="text"

aws s3 ls --endpoint-url=https://s3.wasabisys.com
aws s3 sync <SOURCE-BUCKET> <DESTINATION-BUCKET> --endpoint-url=https://s3.wasabisys.com

方案一:EventBridge + Lambda(无服务器,推荐)

这是AWS原生的无服务器自动化方案,无需管理服务器资源:

  1. 创建Lambda函数

    • 选择Python 3.x作为运行时(用boto3实现S3同步比调用CLI更高效),示例代码:
      import boto3
      
      def lambda_handler(event, context):
          # 初始化Wasabi S3客户端
          s3 = boto3.client('s3', endpoint_url='https://s3.wasabisys.com')
          
          # 可选:列出桶内容用于验证
          response = s3.list_buckets()
          print("Existing buckets:")
          for bucket in response['Buckets']:
              print(f'  {bucket["Name"]}')
          
          # 执行S3同步操作
          source_bucket = '<SOURCE-BUCKET>'
          dest_bucket = '<DESTINATION-BUCKET>'
          
          # 分页遍历源桶对象并复制到目标桶
          paginator = s3.get_paginator('list_objects_v2')
          for page in paginator.paginate(Bucket=source_bucket):
              if 'Contents' in page:
                  for obj in page['Contents']:
                      s3.copy_object(
                          Bucket=dest_bucket,
                          Key=obj['Key'],
                          CopySource={'Bucket': source_bucket, 'Key': obj['Key']}
                      )
          return {"statusCode": 200, "body": "Sync completed successfully"}
      
    • 若坚持使用AWS CLI,需给Lambda添加包含CLI的层,或使用自定义运行时,但boto3方案更简洁可靠。
  2. 配置IAM角色权限

    • 给Lambda执行角色附加以下权限策略,允许S3列出、读写对象:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject",
                      "s3:PutObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::<SOURCE-BUCKET>",
                      "arn:aws:s3:::<SOURCE-BUCKET>/*",
                      "arn:aws:s3:::<DESTINATION-BUCKET>",
                      "arn:aws:s3:::<DESTINATION-BUCKET>/*"
                  ]
              }
          ]
      }
      
  3. 创建EventBridge触发规则

    • 进入EventBridge控制台,创建规则选择计划触发类型
    • 设置调度表达式(UTC时区),例如每周日凌晨2点执行:cron(0 2 ? * SUN *)
    • 目标选择你创建的Lambda函数,完成配置即可。

方案二:EC2实例 + Cron任务

如果更熟悉Linux定时任务,可使用EC2配合cron实现:

  1. 准备EC2实例

    • 创建或使用现有EC2实例,给实例附加具备S3同步权限的IAM角色(同方案一的策略)
    • 确保实例已安装AWS CLI(Amazon Linux默认预装)
  2. 编写备份脚本

    • 创建脚本文件,例如/home/ec2-user/s3-backup.sh:
      #!/bin/bash
      LOG_FILE="/var/log/s3-backup.log"
      echo "Backup started at $(date)" >> $LOG_FILE
      
      # 执行S3操作并记录日志
      aws s3 ls --endpoint-url=https://s3.wasabisys.com >> $LOG_FILE 2>&1
      aws s3 sync <SOURCE-BUCKET> <DESTINATION-BUCKET> --endpoint-url=https://s3.wasabisys.com >> $LOG_FILE 2>&1
      
      echo "Backup finished at $(date)" >> $LOG_FILE
      
    • 给脚本添加执行权限:chmod +x /home/ec2-user/s3-backup.sh
  3. 配置Cron任务

    • 编辑crontab:crontab -e
    • 添加定时规则(系统时区),例如每周日凌晨2点执行:
      0 2 * * 0 /home/ec2-user/s3-backup.sh
      
    • 保存退出后,cron会自动加载新任务。

关键注意事项

  • 安全优先:绝对不要在脚本或代码中硬编码访问密钥,始终使用IAM角色管理权限。
  • 时区适配:EventBridge使用UTC时区,EC2 cron默认使用实例系统时区,需根据需求调整时间表达式。
  • 日志监控:Lambda默认集成CloudWatch日志,EC2可通过配置的日志文件排查执行问题。
  • 提前测试:正式启用前手动触发一次任务,验证S3同步是否正常完成。

内容的提问来源于stack exchange,提问作者Gerson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:34:52