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

如何通过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,再验证文件存在后删除源文件:

  1. 先执行同步(确保文件上传完成):
aws s3 sync /path/to/local/sftp/files s3://your-target-bucket/
  1. 遍历本地文件,验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:35:41