如何通过AWS CLI将EC2文件移至S3并删除源文件?
实现Debian EC2到S3的文件移动(传输完成后自动删除源文件)
针对你用SFTP服务器接收文件、定时同步到S3但源文件堆积的问题,下面是几种实用的解决方案:
方案1:直接用aws s3 mv命令(最简方式)
aws s3 mv本身就是复制+删除源文件的组合操作,适合批量处理目录下的文件:
# 递归移动整个目录的文件到S3,传输成功后自动删除EC2上的源文件 aws s3 mv /path/to/local/sftp/files s3://your-target-bucket/ --recursive
注意:如果传输过程中出现错误(比如网络中断),未成功上传的文件会保留在EC2上,不会被删除;已成功上传的会被移除。
如果需要排除某些文件,可以加--exclude或--include参数:
# 只移动后缀为.log的文件,其他保留 aws s3 mv /path/to/local/sftp/files s3://your-target-bucket/ --recursive --include "*.log" --exclude "*"
方案2:先同步再验证删除(更稳妥,适合需校验的场景)
如果担心mv命令的异常情况,可先同步到S3,再验证文件存在后删除源文件:
- 先执行同步(确保文件上传完成):
aws s3 sync /path/to/local/sftp/files s3://your-target-bucket/
- 遍历本地文件,验证S3中存在后删除:
for file in /path/to/local/sftp/files/*; do # 跳过目录,只处理文件 [ -f "$file" ] || continue # 检查S3中是否存在对应文件 if aws s3 ls "s3://your-target-bucket/$(basename "$file")" >/dev/null 2>&1; then # 验证通过,删除本地文件 rm "$file" fi done
这种方式能避免因网络波动导致文件未上传就被删除的问题,但需要注意:如果S3中已有同名文件,会直接判定存在并删除本地文件,若需要校验文件内容一致性,可以结合MD5值对比:
# 校验MD5的示例 local_md5=$(md5sum "$file" | awk '{print $1}') s3_md5=$(aws s3api head-object --bucket your-target-bucket --key "$(basename "$file")" --query 'ETag' --output text | tr -d '"') if [ "$local_md5" = "$s3_md5" ]; then rm "$file" fi
方案3:封装成定时任务脚本(适合生产环境)
把上述逻辑封装成脚本,配合cron定时执行,同时添加日志记录方便排查:
创建脚本/usr/local/bin/s3-move-files.sh:
#!/bin/bash # 配置参数 LOCAL_DIR="/path/to/local/sftp/files" S3_BUCKET="s3://your-target-bucket" LOG_FILE="/var/log/s3-move.log" # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } # 检查本地目录是否存在 if [ ! -d "$LOCAL_DIR" ]; then log "错误:本地目录 $LOCAL_DIR 不存在" exit 1 fi # 执行移动操作 log "开始移动文件到S3..." aws s3 mv "$LOCAL_DIR" "$S3_BUCKET" --recursive >> "$LOG_FILE" 2>&1 # 检查命令执行结果 if [ $? -eq 0 ]; then log "文件移动完成" else log "文件移动过程中出现错误,请查看日志详情" fi
给脚本添加执行权限:
chmod +x /usr/local/bin/s3-move-files.sh
然后配置cron定时执行(比如每小时执行一次):
crontab -e
添加一行:
0 * * * * /usr/local/bin/s3-move-files.sh
注意:cron的环境变量可能不包含AWS CLI的路径,若执行失败,可把
aws换成绝对路径(比如/usr/local/bin/aws),可以通过which aws查看路径。
额外注意事项
- IAM权限:确保EC2实例的IAM角色拥有
s3:PutObject、s3:ListBucket、s3:GetObject权限(根据使用的命令调整) - 磁盘空间:如果文件很大,建议分批次处理,避免一次性占用过多带宽或磁盘I/O
- 备份机制:若文件重要,可先在S3启用版本控制,避免误删或传输错误导致数据丢失
内容的提问来源于stack exchange,提问作者rocky_alpine
相关产品推荐
相关产品推荐

