CLI复制
本教程演示如何使用 AWS CLI 脚本将一个 AWS 账户(账户 A)的 S3 存储桶内容复制到另一个账户(账户 B)。相比 S3 批处理操作,CLI 脚本方式更适合中小规模数据迁移(< 10TB)和快速一次性复制任务。
graph LR
A[账户 A<br/>源存储桶] -->|AWS CLI<br/>aws s3 sync/cp| B[账户 B<br/>目标存储桶]
C[IAM 用户/角色<br/>账户 A] -->|执行脚本| A
D[存储桶策略<br/>账户 B] -->|授权写入| B
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#f0f0f0
style D fill:#ffe1e1
- 已安装并配置 AWS CLI v2
- 源账户(账户 A)的访问凭证(Access Key 或 IAM 角色)
- 目标账户(账户 B)的访问凭证
- 源存储桶的读取权限
- 目标存储桶的写入权限
AWS CLI vs S3 批处理操作
Section titled “AWS CLI vs S3 批处理操作”| 特性 | AWS CLI | S3 批处理操作 |
|---|---|---|
| 适用数据量 | < 10TB | TB - PB 级别 |
| 设置复杂度 | 低(几分钟) | 中(需要配置清单、IAM 角色) |
| 执行速度 | 中等 | 快(并行处理) |
| 成本 | 仅数据传输和请求费用 | 额外收取批处理费用 |
| 详细报告 | 无 | 有(成功/失败详情) |
| 断点续传 | 支持(通过 sync) | 支持 |
| 适用场景 | 快速迁移、临时需求 | 大规模生产迁移 |
1. 安装和配置 AWS CLI
Section titled “1. 安装和配置 AWS CLI”安装 AWS CLI v2:
# Linux/macOScurl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/install
# 验证安装aws --version配置账户凭证:
# 配置账户 A(源账户)aws configure --profile account-a# 输入:# AWS Access Key ID: AKIA...# AWS Secret Access Key: ***# Default region name: us-east-1# Default output format: json
# 配置账户 B(目标账户)aws configure --profile account-b# 输入账户 B 的凭证验证配置:
# 验证账户 Aaws sts get-caller-identity --profile account-a
# 验证账户 Baws sts get-caller-identity --profile account-b2. 在目标账户配置存储桶策略
Section titled “2. 在目标账户配置存储桶策略”在账户 B 的目标存储桶上添加策略,允许账户 A 写入:
通过 CLI 应用策略:
# 创建策略文件cat > destination-bucket-policy.json <<'EOF'{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountWrite", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:root" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::destination-bucket/*" }, { "Sid": "AllowCrossAccountList", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:root" }, "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::destination-bucket" } ]}EOF
# 应用策略(使用账户 B 的 profile)aws s3api put-bucket-policy \ --bucket destination-bucket \ --policy file://destination-bucket-policy.json \ --profile account-b重要参数说明:
- 将
111111111111替换为账户 A 的 12 位账户 ID - 将
destination-bucket替换为实际的(账户B)目标存储桶名称
3. 验证权限
Section titled “3. 验证权限”# 从账户 A 测试访问目标存储桶aws s3 ls s3://destination-bucket/ \ --profile account-a
# 如果能列出内容或返回空列表,说明权限配置正确方法 1:使用 aws s3 sync(推荐)
Section titled “方法 1:使用 aws s3 sync(推荐)”aws s3 sync 是最常用的方法,支持增量同步和断点续传。
基本语法:
aws s3 sync s3://source-bucket s3://destination-bucket \ --source-region us-east-1 \ --region us-west-2 \ --profile account-a完整脚本示例:
#!/bin/bash
# 跨账户 S3 同步脚本set -e # 遇到错误立即退出
# ==================== 配置区域 ====================SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_REGION="us-east-1"DEST_REGION="us-west-2"SOURCE_PROFILE="account-a"DEST_PROFILE="account-b"LOG_FILE="s3-sync-$(date +%Y%m%d-%H%M%S).log"ACCOUNT_A_ID="111111111111"
# ==================== 颜色输出 ====================RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'NC='\033[0m' # No Color
# ==================== 生成桶策略文件 ====================cat > destination-bucket-policy.json <<EOF{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountWrite", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${ACCOUNT_A_ID}:root" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::${DESTINATION_BUCKET}/*" }, { "Sid": "AllowCrossAccountList", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${ACCOUNT_A_ID}:root" }, "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::${DESTINATION_BUCKET}" } ]}EOF# ==================== 应用桶策略 ====================aws s3api put-bucket-policy \ --bucket ${DESTINATION_BUCKET} \ --policy file://destination-bucket-policy.json \ --profile account-b
# ==================== 日志函数 ====================log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"}
error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" exit 1}
warn() { echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE"}
# ==================== 验证环节 ====================log "开始跨账户 S3 同步任务"log "源存储桶: s3://$SOURCE_BUCKET ($SOURCE_REGION)"log "目标存储桶: s3://$DESTINATION_BUCKET ($DEST_REGION)"
# 验证 AWS CLI 安装if ! command -v aws &> /dev/null; then error "AWS CLI 未安装,请先安装 AWS CLI v2"fi
# 验证源账户凭证log "验证源账户凭证..."if ! aws sts get-caller-identity --profile "$SOURCE_PROFILE" &> /dev/null; then error "源账户凭证验证失败,请检查 profile: $SOURCE_PROFILE"fiSOURCE_ACCOUNT=$(aws sts get-caller-identity --profile "$SOURCE_PROFILE" --query Account --output text)log "源账户 ID: $SOURCE_ACCOUNT"
# 验证源存储桶访问权限log "验证源存储桶访问权限..."if ! aws s3 ls "s3://$SOURCE_BUCKET" --profile "$SOURCE_PROFILE" --region "$SOURCE_REGION" &> /dev/null; then error "无法访问源存储桶: s3://$SOURCE_BUCKET"fi
# 获取源存储桶对象数量和大小log "统计源存储桶信息..."OBJECT_COUNT=$(aws s3 ls "s3://$SOURCE_BUCKET" --recursive --profile "$SOURCE_PROFILE" --region "$SOURCE_REGION" | wc -l)log "源存储桶对象数量: $OBJECT_COUNT"
# 验证目标存储桶访问权限(使用源账户凭证)log "验证目标存储桶跨账户访问权限..."if ! aws s3 ls "s3://$DESTINATION_BUCKET" --profile "$SOURCE_PROFILE" --region "$DEST_REGION" &> /dev/null; then error "使用源账户凭证无法访问目标存储桶,请检查存储桶策略"fi
# ==================== 执行同步 ====================log "开始同步对象..."log "执行命令: aws s3 sync s3://$SOURCE_BUCKET s3://$DESTINATION_BUCKET"
# 使用 sync 命令进行同步# --delete: 删除目标中源不存在的文件(可选)# --exact-timestamps: 使用精确时间戳比较# --no-progress: 禁用进度条(适合日志记录)aws s3 sync "s3://$SOURCE_BUCKET" "s3://$DESTINATION_BUCKET" \ --source-region "$SOURCE_REGION" \ --region "$DEST_REGION" \ --profile "$SOURCE_PROFILE" \ --acl bucket-owner-full-control \ --storage-class STANDARD \ --exclude ".aws/*" \ --exclude "*.tmp" 2>&1 | tee -a "$LOG_FILE"
SYNC_EXIT_CODE=${PIPESTATUS[0]}
if [ $SYNC_EXIT_CODE -eq 0 ]; then log "同步完成!"else error "同步过程中出现错误,退出码: $SYNC_EXIT_CODE"fi
# ==================== 验证结果 ====================log "验证同步结果..."DEST_OBJECT_COUNT=$(aws s3 ls "s3://$DESTINATION_BUCKET" --recursive --profile "$SOURCE_PROFILE" --region "$DEST_REGION" | wc -l)log "目标存储桶对象数量: $DEST_OBJECT_COUNT"
if [ "$OBJECT_COUNT" -eq "$DEST_OBJECT_COUNT" ]; then log "对象数量匹配!同步成功。"else warn "对象数量不匹配!源: $OBJECT_COUNT, 目标: $DEST_OBJECT_COUNT" warn "请检查同步日志: $LOG_FILE"fi
log "日志文件: $LOG_FILE"log "任务完成!"保存并运行脚本:
# 保存为 s3-cross-account-sync.shchmod +x s3-cross-account-sync.sh
# 运行脚本./s3-cross-account-sync.sh重要参数说明:
| 参数 | 说明 |
|---|---|
--acl bucket-owner-full-control | 确保目标账户拥有对象完全控制权 |
--storage-class STANDARD | 指定目标存储类(可选:STANDARD_IA, GLACIER 等) |
--exclude "*.tmp" | 排除临时文件 |
--delete | 删除目标中源不存在的文件(谨慎使用) |
--dryrun | 预演模式,不实际复制 |
--size-only | 仅比较大小,不比较时间戳(更快) |
方法 2:使用 aws s3 cp(递归复制)
Section titled “方法 2:使用 aws s3 cp(递归复制)”适用于完整复制所有对象,不进行增量比较。
#!/bin/bash
# 跨账户 S3 递归复制脚本
SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_PROFILE="account-a"SOURCE_REGION="us-east-1"DEST_REGION="us-west-2"
echo "开始递归复制..."
aws s3 cp "s3://$SOURCE_BUCKET" "s3://$DESTINATION_BUCKET" \ --recursive \ --source-region "$SOURCE_REGION" \ --region "$DEST_REGION" \ --profile "$SOURCE_PROFILE" \ --acl bucket-owner-full-control \ --storage-class STANDARD
echo "复制完成!"cp vs sync 对比:
| 特性 | aws s3 cp | aws s3 sync |
|---|---|---|
| 增量复制 | 否(总是复制所有文件) | 是(仅复制新增或修改的文件) |
| 适用场景 | 首次完整复制 | 持续同步、增量备份 |
| 速度 | 较慢(重复复制) | 较快(跳过已存在文件) |
| 带宽消耗 | 高 | 低 |
方法 3:分批复制(大规模数据)
Section titled “方法 3:分批复制(大规模数据)”对于大规模数据,可以分批处理以提高可控性。
#!/bin/bash
# 分批跨账户 S3 复制脚本# 按前缀分批处理,便于监控和故障恢复
SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_PROFILE="account-a"SOURCE_REGION="us-east-1"DEST_REGION="us-west-2"
# 定义要复制的前缀列表PREFIXES=( "2023/" "2024/01/" "2024/02/" "2024/03/" "images/" "documents/")
LOG_DIR="./sync-logs"mkdir -p "$LOG_DIR"
echo "开始分批复制,共 ${#PREFIXES[@]} 个批次"
for prefix in "${PREFIXES[@]}"; do LOG_FILE="$LOG_DIR/sync-${prefix//\//-}$(date +%Y%m%d-%H%M%S).log"
echo "================================================" echo "正在处理前缀: $prefix" echo "日志文件: $LOG_FILE" echo "================================================"
aws s3 sync "s3://$SOURCE_BUCKET/$prefix" "s3://$DESTINATION_BUCKET/$prefix" \ --source-region "$SOURCE_REGION" \ --region "$DEST_REGION" \ --profile "$SOURCE_PROFILE" \ --acl bucket-owner-full-control \ --storage-class STANDARD 2>&1 | tee "$LOG_FILE"
if [ ${PIPESTATUS[0]} -eq 0 ]; then echo "前缀 $prefix 同步成功" else echo "前缀 $prefix 同步失败,请检查日志: $LOG_FILE" exit 1 fi
# 短暂延迟,避免请求过于集中 sleep 2done
echo "所有批次处理完成!"方法 4:并行复制(加速传输)
Section titled “方法 4:并行复制(加速传输)”使用 GNU Parallel 或多个终端并行执行复制任务。
安装 GNU Parallel:
# Ubuntu/Debiansudo apt-get install parallel
# macOSbrew install parallel
# CentOS/RHELsudo yum install parallel并行复制脚本:
#!/bin/bash
# 并行跨账户 S3 复制脚本
SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_PROFILE="account-a"SOURCE_REGION="us-east-1"DEST_REGION="us-west-2"PARALLEL_JOBS=4 # 并行任务数
echo "获取对象列表..."
# 获取所有对象键aws s3api list-objects-v2 \ --bucket "$SOURCE_BUCKET" \ --query 'Contents[].Key' \ --output text \ --profile "$SOURCE_PROFILE" \ --region "$SOURCE_REGION" | tr '\t' '\n' > object-list.txt
TOTAL_OBJECTS=$(wc -l < object-list.txt)echo "共 $TOTAL_OBJECTS 个对象需要复制"
# 定义复制函数copy_object() { local key=$1 aws s3 cp "s3://$SOURCE_BUCKET/$key" "s3://$DESTINATION_BUCKET/$key" \ --source-region "$SOURCE_REGION" \ --region "$DEST_REGION" \ --profile "$SOURCE_PROFILE" \ --acl bucket-owner-full-control \ --storage-class STANDARD \ --only-show-errors}
export -f copy_objectexport SOURCE_BUCKET DESTINATION_BUCKET SOURCE_PROFILE SOURCE_REGION DEST_REGION
# 使用 GNU Parallel 并行复制cat object-list.txt | parallel -j $PARALLEL_JOBS copy_object {}
echo "并行复制完成!"1. 复制时保留元数据和标签
Section titled “1. 复制时保留元数据和标签”# 复制单个对象并保留所有元数据aws s3 cp s3://source-bucket/file.txt s3://destination-bucket/file.txt \ --profile account-a \ --metadata-directive COPY \ --tagging-directive COPY \ --acl bucket-owner-full-control
# 使用 sync 时自动保留元数据aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --metadata-directive COPY \ --acl bucket-owner-full-control2. 过滤特定文件类型
Section titled “2. 过滤特定文件类型”# 仅复制 PDF 文件aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --exclude "*" \ --include "*.pdf" \ --acl bucket-owner-full-control
# 排除大文件(> 1GB)aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --exclude "*" \ --include "*" \ --exclude "*.zip" \ --exclude "*.tar.gz" \ --acl bucket-owner-full-control3. 跨区域复制优化
Section titled “3. 跨区域复制优化”# 使用加速传输端点(需要启用 S3 Transfer Acceleration)aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --endpoint-url https://s3-accelerate.amazonaws.com \ --acl bucket-owner-full-control4. 复制特定版本的对象
Section titled “4. 复制特定版本的对象”# 列出对象所有版本aws s3api list-object-versions \ --bucket source-bucket \ --prefix "documents/" \ --profile account-a
# 复制特定版本aws s3api copy-object \ --copy-source source-bucket/file.txt?versionId=VERSION_ID \ --bucket destination-bucket \ --key file.txt \ --profile account-a \ --acl bucket-owner-full-control1. 实时监控复制进度
Section titled “1. 实时监控复制进度”# 在一个终端运行复制aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --acl bucket-owner-full-control
# 在另一个终端监控目标存储桶watch -n 5 'aws s3 ls s3://destination-bucket --recursive --profile account-a | wc -l'2. 生成复制报告
Section titled “2. 生成复制报告”#!/bin/bash
# 生成复制前后对比报告
SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_PROFILE="account-a"REPORT_FILE="copy-report-$(date +%Y%m%d-%H%M%S).txt"
echo "S3 跨账户复制报告" > "$REPORT_FILE"echo "生成时间: $(date)" >> "$REPORT_FILE"echo "======================================" >> "$REPORT_FILE"
# 源存储桶统计echo "" >> "$REPORT_FILE"echo "源存储桶: s3://$SOURCE_BUCKET" >> "$REPORT_FILE"SOURCE_COUNT=$(aws s3 ls "s3://$SOURCE_BUCKET" --recursive --profile "$SOURCE_PROFILE" | wc -l)SOURCE_SIZE=$(aws s3 ls "s3://$SOURCE_BUCKET" --recursive --summarize --human-readable --profile "$SOURCE_PROFILE" | grep "Total Size" | awk '{print $3, $4}')echo "对象数量: $SOURCE_COUNT" >> "$REPORT_FILE"echo "总大小: $SOURCE_SIZE" >> "$REPORT_FILE"
# 目标存储桶统计echo "" >> "$REPORT_FILE"echo "目标存储桶: s3://$DESTINATION_BUCKET" >> "$REPORT_FILE"DEST_COUNT=$(aws s3 ls "s3://$DESTINATION_BUCKET" --recursive --profile "$SOURCE_PROFILE" | wc -l)DEST_SIZE=$(aws s3 ls "s3://$DESTINATION_BUCKET" --recursive --summarize --human-readable --profile "$SOURCE_PROFILE" | grep "Total Size" | awk '{print $3, $4}')echo "对象数量: $DEST_COUNT" >> "$REPORT_FILE"echo "总大小: $DEST_SIZE" >> "$REPORT_FILE"
# 比较结果echo "" >> "$REPORT_FILE"echo "======================================" >> "$REPORT_FILE"if [ "$SOURCE_COUNT" -eq "$DEST_COUNT" ]; then echo "状态: ✓ 成功 - 对象数量匹配" >> "$REPORT_FILE"else echo "状态: ✗ 警告 - 对象数量不匹配" >> "$REPORT_FILE" echo "差异: $((SOURCE_COUNT - DEST_COUNT)) 个对象" >> "$REPORT_FILE"fi
cat "$REPORT_FILE"echo "报告已保存至: $REPORT_FILE"3. 验证对象完整性
Section titled “3. 验证对象完整性”#!/bin/bash
# 验证源和目标对象的 ETag(MD5)是否一致
SOURCE_BUCKET="source-bucket"DESTINATION_BUCKET="destination-bucket"SOURCE_PROFILE="account-a"SAMPLE_SIZE=100 # 随机采样数量
echo "随机采样验证 $SAMPLE_SIZE 个对象..."
# 获取随机样本aws s3 ls "s3://$SOURCE_BUCKET" --recursive --profile "$SOURCE_PROFILE" | \ awk '{print $4}' | \ shuf -n $SAMPLE_SIZE > sample-objects.txt
MISMATCH_COUNT=0
while IFS= read -r key; do # 获取源对象 ETag SOURCE_ETAG=$(aws s3api head-object \ --bucket "$SOURCE_BUCKET" \ --key "$key" \ --profile "$SOURCE_PROFILE" \ --query ETag --output text 2>/dev/null)
# 获取目标对象 ETag DEST_ETAG=$(aws s3api head-object \ --bucket "$DESTINATION_BUCKET" \ --key "$key" \ --profile "$SOURCE_PROFILE" \ --query ETag --output text 2>/dev/null)
if [ "$SOURCE_ETAG" != "$DEST_ETAG" ]; then echo "不匹配: $key" echo " 源 ETag: $SOURCE_ETAG" echo " 目标 ETag: $DEST_ETAG" ((MISMATCH_COUNT++)) fidone < sample-objects.txt
if [ $MISMATCH_COUNT -eq 0 ]; then echo "验证完成:所有采样对象 ETag 匹配!"else echo "警告:发现 $MISMATCH_COUNT 个对象不匹配"fi问题 1:权限被拒绝(403 Forbidden)
错误信息:
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied解决方案:
# 1. 验证目标存储桶策略aws s3api get-bucket-policy \ --bucket destination-bucket \ --profile account-b
# 2. 确认源账户 IDaws sts get-caller-identity --profile account-a
# 3. 测试目标存储桶访问aws s3 ls s3://destination-bucket/ --profile account-a
# 4. 检查 KMS 密钥策略(如果使用加密)aws kms describe-key --key-id KEY_ID --profile account-b问题 2:复制速度慢
优化方案:
# 1. 启用 S3 Transfer Acceleration(需要在存储桶上启用)aws s3api put-bucket-accelerate-configuration \ --bucket source-bucket \ --accelerate-configuration Status=Enabled \ --profile account-a
# 2. 使用并行复制# 参考"方法 4:并行复制"
# 3. 使用 AWS DataSync(大规模迁移)问题 3:对象所有权不正确
现象:目标账户无法访问已复制的对象
解决方案:
# 确保使用 --acl bucket-owner-full-controlaws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --acl bucket-owner-full-control
# 或启用目标存储桶的 Bucket Owner Enforced 设置aws s3api put-bucket-ownership-controls \ --bucket destination-bucket \ --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}] \ --profile account-b问题 4:同步中断后如何恢复
解决方案:
# aws s3 sync 自动支持断点续传# 只需重新运行相同的命令即可aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --acl bucket-owner-full-control
# sync 会自动跳过已存在且未修改的文件问题 5:跨区域复制成本高
优化方案:
# 1. 使用同区域复制(如果可能)# 源和目标存储桶在同一区域
# 2. 使用 S3 Intelligent-Tiering 存储类aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --storage-class INTELLIGENT_TIERING \ --acl bucket-owner-full-control
# 3. 批量压缩后再传输# 适用于文本、日志等可压缩内容| 操作类型 | 定价(美国东部) | 说明 |
|---|---|---|
| GET 请求 | $0.0004/1000 | 从源存储桶读取 |
| PUT 请求 | $0.005/1000 | 写入目标存储桶 |
| LIST 请求 | $0.005/1000 | 列出对象(sync 使用) |
数据传输成本
Section titled “数据传输成本”| 传输类型 | 定价 |
|---|---|
| 同账户同区域 | 免费 |
| 跨账户同区域 | 免费 |
| 跨区域(出站) | $0.02/GB(前 10TB) |
| 跨区域(入站) | 免费 |
复制 1TB(100 万个对象)从美国东部到美国西部:
GET 请求: 1,000,000 × $0.0004/1000 = $0.40PUT 请求: 1,000,000 × $0.005/1000 = $5.00数据传输: 1,000 GB × $0.02/GB = $20.00总成本: $25.401. 执行前预演
Section titled “1. 执行前预演”# 使用 --dryrun 参数预览操作aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --dryrun2. 使用日志记录
Section titled “2. 使用日志记录”# 将输出重定向到日志文件aws s3 sync s3://source-bucket s3://destination-bucket \ --profile account-a \ --acl bucket-owner-full-control 2>&1 | tee sync-log.txt3. 定期增量同步
Section titled “3. 定期增量同步”# 创建 cron 任务定期同步# 编辑 crontabcrontab -e
# 添加每天凌晨 2 点执行同步0 2 * * * /path/to/s3-cross-account-sync.sh >> /var/log/s3-sync.log 2>&14. 使用 CloudWatch 监控
Section titled “4. 使用 CloudWatch 监控”# 发送自定义指标到 CloudWatchaws cloudwatch put-metric-data \ --namespace S3Sync \ --metric-name ObjectsCopied \ --value $DEST_OBJECT_COUNT \ --profile account-a5. 数据验证
Section titled “5. 数据验证”# 复制完成后进行校验# 1. 比较对象数量# 2. 随机采样验证 ETag# 3. 比较总大小# 参考"监控和验证"章节替代方案对比
Section titled “替代方案对比”AWS CLI vs 其他方法
Section titled “AWS CLI vs 其他方法”| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| AWS CLI | < 10TB, 快速迁移 | 简单快速, 无需额外配置 | 无详细报告, 需手动监控 |
| S3 批处理 | TB-PB 级, 生产环境 | 并行处理, 详细报告 | 配置复杂, 需等待清单 |
| AWS DataSync | 大规模迁移, 持续同步 | 自动化, 数据验证 | 额外成本, 需 Agent |
| S3 Replication | 实时复制, 灾备 | 自动持续, 实时同步 | 仅新对象, 配置复杂 |
| 第三方工具 | 特殊需求 | 功能丰富 | 额外成本, 安全风险 |
AWS CLI 提供了灵活、高效的跨账户 S3 复制解决方案,特别适合:
- 中小规模数据迁移(< 10TB)
- 临时性、一次性复制任务
- 快速原型验证
- 需要精细控制的场景
通过合理配置权限、使用 aws s3 sync 命令,并结合监控和验证脚本,可以安全可靠地完成跨账户数据复制任务。