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

EC2实例执行S3 Sync命令未完成数据传输即停止

S3跨桶时间范围同步异常问题解决

问题背景

我有一台Linux系统的EC2实例,用于执行aws s3命令,需要将s3://source桶中2022-08-11至2023-01-11(过去6个月)的数据同步到s3://target桶,所用凭据权限充足。

遇到的问题

  1. 初始执行命令:
aws s3 sync "s3://source" "s3://target" --query "Contents[?LastModified>='2022-08-11' && LastModified<='2023-01-11']"

运行约10分钟后停止,仅同步小部分数据,怀疑是SSM会话终止导致。

  1. 改用nohup后台执行:
nohup aws s3 sync "s3://source" "s3://target" --query "Contents[?LastModified>='2022-08-11' && LastModified<='2023-01-11']" --exclude "*.log" --exclude "*.bak" &

运行约20分钟后仍意外停止,查看EC2实例监控(实例监控图)未发现明显异常。

核心问题定位

aws s3 sync不支持--query参数,这个参数仅适用于aws s3 ls、aws s3api list-objects等返回结构化数据的命令。在sync中使用无效参数会导致命令逻辑异常,甚至中途退出,这是命令停止的主要原因之一。

正确解决方案

方法1:通过列表筛选+循环同步

先列出符合时间范围的文件,再逐个同步,同时用后台执行保证会话断开后任务继续:

nohup bash -c 'aws s3 ls s3://source --recursive | awk '\''$1 >= "2022-08-11" && $1 <= "2023-01-11" {print $4}'\'' | while read -r file; do aws s3 cp "s3://source/$file" "s3://target/$file"; done' > s3_sync.log 2>&1 &
  • 说明:
    • aws s3 ls --recursive递归列出源桶所有文件,输出包含修改日期
    • awk过滤出符合时间范围的文件路径
    • 循环执行aws s3 cp完成单个文件同步
    • 日志输出到s3_sync.log,方便后续排查错误

方法2:利用文件命名规则过滤(如果适用)

如果源桶文件命名包含时间戳(如20220812_data.csv),可直接用sync的通配符过滤:

nohup aws s3 sync s3://source s3://target \
  --exclude "*" \
  --include "202208*" --include "202209*" --include "202210*" \
  --include "202211*" --include "202212*" --include "202301*" \
  --exclude "*.log" --exclude "*.bak" > s3_sync.log 2>&1 &

方法3:使用S3批量操作(推荐大规模数据)

对于超大量数据同步,AWS官方推荐S3 Batch Operations:

  1. 通过s3api list-objects-v2筛选出符合时间条件的对象,保存为CSV文件
  2. 在S3控制台创建批量操作任务,选择"复制对象",上传CSV文件指定同步对象
  3. 任务由AWS后台执行,无需占用EC2资源,稳定性更高

额外排查方向

如果按上述方法执行后仍出现停止,可排查:

  • 资源耗尽:执行dmesg | grep -i kill查看是否因内存不足(OOM)被系统杀死进程
  • 网络异常:查看s3_sync.log中的错误信息,确认是否存在S3连接中断问题
  • 权限细节:虽然凭据有基础权限,但需确认是否有对象级别的权限限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:45:29