如何每周自动执行用于备份的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原生的无服务器自动化方案,无需管理服务器资源:
创建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方案更简洁可靠。
- 选择Python 3.x作为运行时(用boto3实现S3同步比调用CLI更高效),示例代码:
配置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>/*" ] } ] }
- 给Lambda执行角色附加以下权限策略,允许S3列出、读写对象:
创建EventBridge触发规则
- 进入EventBridge控制台,创建规则选择计划触发类型
- 设置调度表达式(UTC时区),例如每周日凌晨2点执行:
cron(0 2 ? * SUN *) - 目标选择你创建的Lambda函数,完成配置即可。
方案二:EC2实例 + Cron任务
如果更熟悉Linux定时任务,可使用EC2配合cron实现:
准备EC2实例
- 创建或使用现有EC2实例,给实例附加具备S3同步权限的IAM角色(同方案一的策略)
- 确保实例已安装AWS CLI(Amazon Linux默认预装)
编写备份脚本
- 创建脚本文件,例如
/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
- 创建脚本文件,例如
配置Cron任务
- 编辑crontab:
crontab -e - 添加定时规则(系统时区),例如每周日凌晨2点执行:
0 2 * * 0 /home/ec2-user/s3-backup.sh - 保存退出后,cron会自动加载新任务。
- 编辑crontab:
关键注意事项
- 安全优先:绝对不要在脚本或代码中硬编码访问密钥,始终使用IAM角色管理权限。
- 时区适配:EventBridge使用UTC时区,EC2 cron默认使用实例系统时区,需根据需求调整时间表达式。
- 日志监控:Lambda默认集成CloudWatch日志,EC2可通过配置的日志文件排查执行问题。
- 提前测试:正式启用前手动触发一次任务,验证S3同步是否正常完成。
内容的提问来源于stack exchange,提问作者Gerson
相关产品推荐
相关产品推荐

