Skip to content

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 CLIS3 批处理操作
适用数据量< 10TBTB - PB 级别
设置复杂度低(几分钟)中(需要配置清单、IAM 角色)
执行速度中等快(并行处理)
成本仅数据传输和请求费用额外收取批处理费用
详细报告有(成功/失败详情)
断点续传支持(通过 sync)支持
适用场景快速迁移、临时需求大规模生产迁移

安装 AWS CLI v2:

# Linux/macOS
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./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 的凭证

验证配置:

# 验证账户 A
aws sts get-caller-identity --profile account-a
# 验证账户 B
aws sts get-caller-identity --profile account-b

在账户 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)目标存储桶名称
# 从账户 A 测试访问目标存储桶
aws s3 ls s3://destination-bucket/ \
--profile account-a
# 如果能列出内容或返回空列表,说明权限配置正确

aws s3 sync 是最常用的方法,支持增量同步和断点续传。

基本语法:

aws s3 sync s3://source-bucket s3://destination-bucket \
--source-region us-east-1 \
--region us-west-2 \
--profile account-a

完整脚本示例:

./s3-cross-account-sync.sh
#!/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"
fi
SOURCE_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.sh
chmod +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 cpaws 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 2
done
echo "所有批次处理完成!"

使用 GNU Parallel 或多个终端并行执行复制任务。

安装 GNU Parallel:

# Ubuntu/Debian
sudo apt-get install parallel
# macOS
brew install parallel
# CentOS/RHEL
sudo 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_object
export SOURCE_BUCKET DESTINATION_BUCKET SOURCE_PROFILE SOURCE_REGION DEST_REGION
# 使用 GNU Parallel 并行复制
cat object-list.txt | parallel -j $PARALLEL_JOBS copy_object {}
echo "并行复制完成!"
# 复制单个对象并保留所有元数据
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-control
# 仅复制 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-control
# 使用加速传输端点(需要启用 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-control
# 列出对象所有版本
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-control
# 在一个终端运行复制
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'
#!/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"
#!/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++))
fi
done < 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. 确认源账户 ID
aws 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-control
aws 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 使用)
传输类型定价
同账户同区域免费
跨账户同区域免费
跨区域(出站)$0.02/GB(前 10TB)
跨区域(入站)免费

复制 1TB(100 万个对象)从美国东部到美国西部:

GET 请求: 1,000,000 × $0.0004/1000 = $0.40
PUT 请求: 1,000,000 × $0.005/1000 = $5.00
数据传输: 1,000 GB × $0.02/GB = $20.00
总成本: $25.40
# 使用 --dryrun 参数预览操作
aws s3 sync s3://source-bucket s3://destination-bucket \
--profile account-a \
--dryrun
# 将输出重定向到日志文件
aws s3 sync s3://source-bucket s3://destination-bucket \
--profile account-a \
--acl bucket-owner-full-control 2>&1 | tee sync-log.txt
# 创建 cron 任务定期同步
# 编辑 crontab
crontab -e
# 添加每天凌晨 2 点执行同步
0 2 * * * /path/to/s3-cross-account-sync.sh >> /var/log/s3-sync.log 2>&1
# 发送自定义指标到 CloudWatch
aws cloudwatch put-metric-data \
--namespace S3Sync \
--metric-name ObjectsCopied \
--value $DEST_OBJECT_COUNT \
--profile account-a
# 复制完成后进行校验
# 1. 比较对象数量
# 2. 随机采样验证 ETag
# 3. 比较总大小
# 参考"监控和验证"章节
方法适用场景优点缺点
AWS CLI< 10TB, 快速迁移简单快速, 无需额外配置无详细报告, 需手动监控
S3 批处理TB-PB 级, 生产环境并行处理, 详细报告配置复杂, 需等待清单
AWS DataSync大规模迁移, 持续同步自动化, 数据验证额外成本, 需 Agent
S3 Replication实时复制, 灾备自动持续, 实时同步仅新对象, 配置复杂
第三方工具特殊需求功能丰富额外成本, 安全风险

AWS CLI 提供了灵活、高效的跨账户 S3 复制解决方案,特别适合:

  • 中小规模数据迁移(< 10TB)
  • 临时性、一次性复制任务
  • 快速原型验证
  • 需要精细控制的场景

通过合理配置权限、使用 aws s3 sync 命令,并结合监控和验证脚本,可以安全可靠地完成跨账户数据复制任务。