Skip to content

DataSync(unknown)

AWS DataSync 是一项在线数据传输服务,可简化、自动化和加速在本地存储系统与 AWS 存储服务之间,以及 AWS 存储服务之间移动数据。本教程演示如何使用 DataSync 将数据从账户 A 的 S3 存储桶传输到账户 B 的 S3 存储桶。

graph TB
    subgraph "账户 A - 源账户"
        A[源 S3 存储桶]
        B[DataSync 源位置]
        C[DataSync 任务]
        D[IAM 角色 - 源]
    end
    
    subgraph "账户 B - 目标账户"
        E[目标 S3 存储桶]
        F[DataSync 目标位置]
        G[IAM 角色 - 目标]
        H[存储桶策略]
    end
    
    A -->|读取数据| B
    B -->|配置源| C
    F -->|配置目标| C
    C -->|使用角色| D
    C -->|传输数据| F
    F -->|写入数据| E
    D -->|跨账户访问| H
    G -->|本地访问| E
    
    style A fill:#e1f5ff
    style E fill:#fff4e1
    style C fill:#f0f0f0
    style H fill:#ffe1e1
特性DataSyncS3 批处理AWS CLI
适用数据量TB - PBTB - PB< 10TB
传输速度非常快(10 Gbps+)中等
数据验证自动(端到端校验)手动
带宽控制支持不支持不支持
调度功能内置(每小时/每天)手动需 cron
增量传输自动检测需清单sync 支持
成本按传输量计费按对象数+传输按传输量
详细报告CloudWatch 日志CSV 报告
设置复杂度中高
适用场景大规模生产迁移一次性批量复制快速临时迁移
  • 源账户(账户 A)和目标账户(账户 B)的管理权限
  • 源和目标 S3 存储桶已创建
  • 了解 IAM 角色和策略配置
  • AWS 控制台或 AWS CLI 访问权限

步骤 1:在账户 B 创建目标 IAM 角色

Section titled “步骤 1:在账户 B 创建目标 IAM 角色”

DataSync 需要在目标账户创建 IAM 角色,用于访问目标 S3 存储桶。

权限策略(Permissions Policy):

  • 策略名称:DataSync-Policy
  • 替换两个destination-bucket-name
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DataSyncS3Access",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::destination-bucket-name"
},
{
"Sid": "DataSyncS3ObjectAccess",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": "arn:aws:s3:::destination-bucket-name/*"
}
]
}
  1. 登录账户 B 的 AWS 控制台
  2. 导航至 IAM角色创建角色
  3. 选择 AWS 账户另一个AWS账户
  4. 输入账户 A 的账户 ID:111111111111
  5. 勾选(可选但推荐) 需要外部ID,输入:datasync-cross-account-transfer或者生成的UUID
    1. Linux:uuidgen
    2. Windows:[guid]::NewGuid()
  6. 点击 下一步
  7. 选择或创建权限策略(使用上面的 JSON)
  8. 角色名称:DataSyncDestinationRole
  9. 点击 创建角色;点击查看角色
  10. 记录角色 ARN:arn:aws:iam::222222222222:role/DataSyncDestinationRole

步骤 2:在账户 A 创建源 IAM 角色

Section titled “步骤 2:在账户 A 创建源 IAM 角色”

DataSync 任务在账户 A 运行,需要创建 IAM 角色访问源存储桶和代入目标角色。

信任策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

权限策略:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DataSyncSourceS3Access",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::source-bucket-name"
},
{
"Sid": "DataSyncSourceS3ObjectAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectTagging",
"s3:ListMultipartUploadParts"
],
"Resource": "arn:aws:s3:::source-bucket-name/*"
},
{
"Sid": "DataSyncAssumeDestinationRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/DataSyncDestinationRole"
}
]
}
  1. 登录账户 A 的 AWS 控制台
  2. 导航至 IAM角色创建角色
  3. 选择 AWS 服务DataSync
  4. 点击 下一步
  5. 创建或选择权限策略(使用上面的 JSON)(创建账户后再次附加DataSync-Policy
  6. 角色名称:DataSyncSourceRole
  7. 点击 创建角色
  8. 记录角色 ARN:arn:aws:iam::111111111111:role/DataSyncSourceRole

在账户 A 创建 DataSync 源位置,指向源 S3 存储桶。

  1. 登录账户 A 的 AWS 控制台
  2. 导航至 DataSync位置创建位置
  3. 选择 位置类型: Amazon S3
  4. 配置参数:
    • S3 URI: 选择或输入 s3://source-bucket-name
    • S3 存储类: 保持默认
    • Folder: 可选,指定子文件夹(如 /data/
    • IAM 角色: 选择 DataSyncSourceRole
  5. 点击 创建位置
  6. 记录源位置 ARN:arn:aws:datasync:us-east-1:111111111111:location/loc-xxxxx

在账户 A 创建目标位置,指向账户 B 的存储桶。

# 创建目标位置(跨账户)
aws datasync create-location-s3 \
--s3-bucket-arn arn:aws:s3:::destination-bucket-name \
--s3-config '{
"BucketAccessRoleArn": "arn:aws:iam::222222222222:role/DataSyncDestinationRole"
}' \
--agent-arns [] \
--profile account-a \
--region us-west-2
# 输出示例
# {
# "LocationArn": "arn:aws:datasync:us-west-2:111111111111:location/loc-yyyyy"
# }

创建 DataSync 任务,连接源位置和目标位置。

  1. 在账户 A 的 DataSync 控制台
  2. 导航至 TasksCreate task
  3. 配置源和目标:
    • Source location: 选择步骤 3 创建的源位置
    • Destination location: 选择步骤 4 创建的目标位置
  4. 配置设置:
    • Task name: CrossAccountS3Transfer
    • Verify data: 选择 Verify only the data transferred(推荐)
    • Copy ownership: 根据需要选择
    • Copy permissions: 根据需要选择
  5. 配置调度(可选):
    • 选择 Schedule: Run on a schedule
    • Frequency: 每小时、每天、每周等
  6. 配置过滤器(可选):
    • Include patterns: 例如 *.jpg
    • Exclude patterns: 例如 *.tmp
  7. 配置带宽限制(可选):
    • 设置最大传输速率(MB/s)
  8. 点击 Create task
  9. 记录任务 ARN

基本任务创建:

# 创建 DataSync 任务
aws datasync create-task \
--source-location-arn arn:aws:datasync:us-east-1:111111111111:location/loc-xxxxx \
--destination-location-arn arn:aws:datasync:us-west-2:111111111111:location/loc-yyyyy \
--cloud-watch-log-group-arn arn:aws:logs:us-east-1:111111111111:log-group:/aws/datasync \
--name CrossAccountS3Transfer \
--profile account-a \
--region us-east-1
# 输出示例
# {
# "TaskArn": "arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz"
# }

完整配置的任务创建:

# 创建带完整配置的任务
aws datasync create-task \
--source-location-arn arn:aws:datasync:us-east-1:111111111111:location/loc-xxxxx \
--destination-location-arn arn:aws:datasync:us-west-2:111111111111:location/loc-yyyyy \
--cloud-watch-log-group-arn arn:aws:logs:us-east-1:111111111111:log-group:/aws/datasync \
--name CrossAccountS3Transfer \
--options '{
"VerifyMode": "ONLY_FILES_TRANSFERRED",
"OverwriteMode": "ALWAYS",
"Atime": "BEST_EFFORT",
"Mtime": "PRESERVE",
"Uid": "NONE",
"Gid": "NONE",
"PreserveDeletedFiles": "PRESERVE",
"PreserveDevices": "NONE",
"PosixPermissions": "NONE",
"BytesPerSecond": -1,
"TaskQueueing": "ENABLED",
"LogLevel": "TRANSFER",
"TransferMode": "CHANGED",
"SecurityDescriptorCopyFlags": "NONE"
}' \
--excludes '[
{"FilterType": "SIMPLE_PATTERN", "Value": "*.tmp"},
{"FilterType": "SIMPLE_PATTERN", "Value": ".DS_Store"}
]' \
--schedule '{
"ScheduleExpression": "cron(0 2 * * ? *)"
}' \
--profile account-a \
--region us-east-1

任务配置参数说明:

参数说明推荐值
VerifyMode数据验证模式ONLY_FILES_TRANSFERRED(仅验证传输文件)
OverwriteMode覆盖模式ALWAYS(总是覆盖)或 NEVER(从不覆盖)
TransferMode传输模式CHANGED(仅传输更改)或 ALL(传输所有)
LogLevel日志级别TRANSFER(记录传输)或 BASIC(基本信息)
BytesPerSecond带宽限制-1(无限制)或具体值(如 10485760 = 10MB/s)
PreserveDeletedFiles保留已删除文件PRESERVE(保留)或 REMOVE(删除)
  1. 在 DataSync 控制台选择创建的任务
  2. 点击 StartStart with defaultsStart with overriding options
  3. 等待任务执行完成
  4. 查看执行历史和详细日志
# 启动任务执行
aws datasync start-task-execution \
--task-arn arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz \
--profile account-a \
--region us-east-1
# 输出示例
# {
# "TaskExecutionArn": "arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz/execution/exec-xxxxx"
# }

覆盖配置执行:

# 启动任务并覆盖部分配置
aws datasync start-task-execution \
--task-arn arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz \
--override-options '{
"VerifyMode": "ONLY_FILES_TRANSFERRED",
"LogLevel": "TRANSFER",
"BytesPerSecond": 52428800
}' \
--includes '[
{"FilterType": "SIMPLE_PATTERN", "Value": "*.pdf"}
]' \
--profile account-a \
--region us-east-1
# 描述任务执行
aws datasync describe-task-execution \
--task-execution-arn arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz/execution/exec-xxxxx \
--profile account-a \
--region us-east-1
# 输出示例
# {
# "TaskExecutionArn": "...",
# "Status": "SUCCESS",
# "Options": {...},
# "StartTime": 1701234567.0,
# "EstimatedFilesToTransfer": 10000,
# "EstimatedBytesToTransfer": 107374182400,
# "FilesTransferred": 10000,
# "BytesWritten": 107374182400,
# "Result": {
# "PrepareDuration": 120000,
# "PrepareStatus": "SUCCESS",
# "TotalDuration": 3600000,
# "TransferDuration": 3480000,
# "TransferStatus": "SUCCESS",
# "VerifyDuration": 0,
# "VerifyStatus": "SUCCESS"
# }
# }

任务状态说明:

  • QUEUED - 排队等待执行
  • LAUNCHING - 正在启动
  • PREPARING - 准备传输(扫描源文件)
  • TRANSFERRING - 正在传输数据
  • VERIFYING - 验证数据完整性
  • SUCCESS - 成功完成
  • ERROR - 执行失败
# 列出任务的所有执行
aws datasync list-task-executions \
--task-arn arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz \
--profile account-a \
--region us-east-1
# 仅列出成功的执行
aws datasync list-task-executions \
--task-arn arn:aws:datasync:us-east-1:111111111111:task/task-zzzzz \
--filters '[
{"Name": "Status", "Values": ["SUCCESS"], "Operator": "Equals"}
]' \
--profile account-a \
--region us-east-1

创建 CloudWatch 日志组:

# 创建日志组
aws logs create-log-group \
--log-group-name /aws/datasync \
--profile account-a \
--region us-east-1
# 设置日志保留期(可选)
aws logs put-retention-policy \
--log-group-name /aws/datasync \
--retention-in-days 7 \
--profile account-a \
--region us-east-1

查看日志:

# 列出日志流
aws logs describe-log-streams \
--log-group-name /aws/datasync \
--order-by LastEventTime \
--descending \
--profile account-a \
--region us-east-1
# 获取日志事件
aws logs get-log-events \
--log-group-name /aws/datasync \
--log-stream-name "exec-xxxxx" \
--profile account-a \
--region us-east-1
./datasync-cross-account-setup.sh
#!/bin/bash
# AWS DataSync 跨账户自动化部署和执行脚本
set -e # 遇到错误立即退出
# ==================== 配置区域 ====================
# 账户信息
SOURCE_ACCOUNT_ID="111111111111"
DEST_ACCOUNT_ID="222222222222"
SOURCE_PROFILE="account-a"
DEST_PROFILE="account-b"
# S3 存储桶
SOURCE_BUCKET="source-bucket-name"
DEST_BUCKET="destination-bucket-name"
SOURCE_REGION="us-east-1"
DEST_REGION="us-west-2"
# DataSync 配置
EXTERNAL_ID="datasync-cross-account-transfer"
TASK_NAME="CrossAccountS3Transfer"
LOG_GROUP="/aws/datasync"
# 角色名称
SOURCE_ROLE_NAME="DataSyncSourceRole"
DEST_ROLE_NAME="DataSyncDestinationRole"
# ==================== 颜色输出 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# ==================== 日志函数 ====================
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
warn() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
# ==================== 步骤 1:创建目标 IAM 角色(账户 B)====================
log "步骤 1: 在账户 B 创建目标 IAM 角色"
# 创建信任策略
cat > trust-policy-dest.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${SOURCE_ACCOUNT_ID}:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "${EXTERNAL_ID}"
}
}
}
]
}
EOF
# 创建权限策略
cat > permissions-policy-dest.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DataSyncS3Access",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::${DEST_BUCKET}"
},
{
"Sid": "DataSyncS3ObjectAccess",
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": "arn:aws:s3:::${DEST_BUCKET}/*"
}
]
}
EOF
# 检查角色是否已存在
if aws iam get-role --role-name "$DEST_ROLE_NAME" --profile "$DEST_PROFILE" &>/dev/null; then
warn "目标角色 $DEST_ROLE_NAME 已存在,跳过创建"
else
# 创建角色
aws iam create-role \
--role-name "$DEST_ROLE_NAME" \
--assume-role-policy-document file://trust-policy-dest.json \
--profile "$DEST_PROFILE"
log "目标角色创建成功"
fi
# 附加权限策略
aws iam put-role-policy \
--role-name "$DEST_ROLE_NAME" \
--policy-name DataSyncDestinationPermissions \
--policy-document file://permissions-policy-dest.json \
--profile "$DEST_PROFILE"
# 获取角色 ARN
DEST_ROLE_ARN=$(aws iam get-role \
--role-name "$DEST_ROLE_NAME" \
--query 'Role.Arn' \
--output text \
--profile "$DEST_PROFILE")
info "目标角色 ARN: $DEST_ROLE_ARN"
# ==================== 步骤 2:创建源 IAM 角色(账户 A)====================
log "步骤 2: 在账户 A 创建源 IAM 角色"
# 创建信任策略
cat > trust-policy-source.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
# 创建权限策略
cat > permissions-policy-source.json <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DataSyncSourceS3Access",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::${SOURCE_BUCKET}"
},
{
"Sid": "DataSyncSourceS3ObjectAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:GetObjectTagging"
],
"Resource": "arn:aws:s3:::${SOURCE_BUCKET}/*"
},
{
"Sid": "DataSyncAssumeDestinationRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "${DEST_ROLE_ARN}"
}
]
}
EOF
# 检查角色是否已存在
if aws iam get-role --role-name "$SOURCE_ROLE_NAME" --profile "$SOURCE_PROFILE" &>/dev/null; then
warn "源角色 $SOURCE_ROLE_NAME 已存在,跳过创建"
else
# 创建角色
aws iam create-role \
--role-name "$SOURCE_ROLE_NAME" \
--assume-role-policy-document file://trust-policy-source.json \
--profile "$SOURCE_PROFILE"
log "源角色创建成功"
fi
# 附加权限策略
aws iam put-role-policy \
--role-name "$SOURCE_ROLE_NAME" \
--policy-name DataSyncSourcePermissions \
--policy-document file://permissions-policy-source.json \
--profile "$SOURCE_PROFILE"
# 获取角色 ARN
SOURCE_ROLE_ARN=$(aws iam get-role \
--role-name "$SOURCE_ROLE_NAME" \
--query 'Role.Arn' \
--output text \
--profile "$SOURCE_PROFILE")
info "源角色 ARN: $SOURCE_ROLE_ARN"
# 等待角色传播
log "等待 IAM 角色传播..."
sleep 10
# ==================== 步骤 3:创建 CloudWatch 日志组 ====================
log "步骤 3: 创建 CloudWatch 日志组"
if aws logs describe-log-groups \
--log-group-name-prefix "$LOG_GROUP" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" 2>/dev/null | grep -q "$LOG_GROUP"; then
warn "日志组已存在"
else
aws logs create-log-group \
--log-group-name "$LOG_GROUP" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION"
aws logs put-retention-policy \
--log-group-name "$LOG_GROUP" \
--retention-in-days 7 \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION"
log "日志组创建成功"
fi
LOG_GROUP_ARN="arn:aws:logs:${SOURCE_REGION}:${SOURCE_ACCOUNT_ID}:log-group:${LOG_GROUP}"
# ==================== 步骤 4:创建源位置 ====================
log "步骤 4: 创建 DataSync 源位置"
SOURCE_LOCATION_ARN=$(aws datasync create-location-s3 \
--s3-bucket-arn "arn:aws:s3:::${SOURCE_BUCKET}" \
--s3-config "{\"BucketAccessRoleArn\": \"${SOURCE_ROLE_ARN}\"}" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" \
--query 'LocationArn' \
--output text)
info "源位置 ARN: $SOURCE_LOCATION_ARN"
# ==================== 步骤 5:创建目标位置 ====================
log "步骤 5: 创建 DataSync 目标位置"
DEST_LOCATION_ARN=$(aws datasync create-location-s3 \
--s3-bucket-arn "arn:aws:s3:::${DEST_BUCKET}" \
--s3-config "{\"BucketAccessRoleArn\": \"${DEST_ROLE_ARN}\"}" \
--profile "$SOURCE_PROFILE" \
--region "$DEST_REGION" \
--query 'LocationArn' \
--output text)
info "目标位置 ARN: $DEST_LOCATION_ARN"
# ==================== 步骤 6:创建 DataSync 任务 ====================
log "步骤 6: 创建 DataSync 任务"
TASK_ARN=$(aws datasync create-task \
--source-location-arn "$SOURCE_LOCATION_ARN" \
--destination-location-arn "$DEST_LOCATION_ARN" \
--cloud-watch-log-group-arn "$LOG_GROUP_ARN" \
--name "$TASK_NAME" \
--options '{
"VerifyMode": "ONLY_FILES_TRANSFERRED",
"OverwriteMode": "ALWAYS",
"TransferMode": "CHANGED",
"LogLevel": "TRANSFER",
"PreserveDeletedFiles": "PRESERVE"
}' \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" \
--query 'TaskArn' \
--output text)
info "任务 ARN: $TASK_ARN"
# ==================== 步骤 7:执行任务 ====================
log "步骤 7: 启动 DataSync 任务执行"
EXECUTION_ARN=$(aws datasync start-task-execution \
--task-arn "$TASK_ARN" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" \
--query 'TaskExecutionArn' \
--output text)
info "任务执行 ARN: $EXECUTION_ARN"
# ==================== 监控执行 ====================
log "监控任务执行状态..."
while true; do
STATUS=$(aws datasync describe-task-execution \
--task-execution-arn "$EXECUTION_ARN" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" \
--query 'Status' \
--output text)
if [ "$STATUS" = "SUCCESS" ]; then
log "任务执行成功!"
break
elif [ "$STATUS" = "ERROR" ]; then
error "任务执行失败"
else
info "当前状态: $STATUS"
sleep 30
fi
done
# ==================== 获取执行统计 ====================
log "获取执行统计信息..."
aws datasync describe-task-execution \
--task-execution-arn "$EXECUTION_ARN" \
--profile "$SOURCE_PROFILE" \
--region "$SOURCE_REGION" \
--query '{
Status: Status,
FilesTransferred: FilesTransferred,
BytesWritten: BytesWritten,
TotalDuration: Result.TotalDuration,
TransferDuration: Result.TransferDuration
}' \
--output table
# ==================== 清理临时文件 ====================
log "清理临时文件..."
rm -f trust-policy-*.json permissions-policy-*.json
log "DataSync 跨账户传输部署完成!"
log "任务 ARN: $TASK_ARN"
log "执行 ARN: $EXECUTION_ARN"
info "后续可以通过以下命令重新执行任务:"
echo "aws datasync start-task-execution --task-arn $TASK_ARN --profile $SOURCE_PROFILE --region $SOURCE_REGION"

保存并运行脚本:

# 保存为 datasync-cross-account-setup.sh
chmod +x datasync-cross-account-setup.sh
# 修改脚本中的配置参数后运行
./datasync-cross-account-setup.sh
# 创建带调度的任务(每天凌晨 2 点执行)
aws datasync create-task \
--source-location-arn "$SOURCE_LOCATION_ARN" \
--destination-location-arn "$DEST_LOCATION_ARN" \
--cloud-watch-log-group-arn "$LOG_GROUP_ARN" \
--name "$TASK_NAME" \
--schedule '{
"ScheduleExpression": "cron(0 2 * * ? *)"
}' \
--profile account-a \
--region us-east-1

调度表达式示例:

表达式说明
cron(0 2 * * ? *)每天凌晨 2:00
cron(0 */4 * * ? *)每 4 小时一次
cron(0 0 ? * MON *)每周一午夜
rate(1 hour)每小时一次
rate(7 days)每 7 天一次
# 仅传输特定类型文件
aws datasync start-task-execution \
--task-arn "$TASK_ARN" \
--includes '[
{"FilterType": "SIMPLE_PATTERN", "Value": "*.pdf"},
{"FilterType": "SIMPLE_PATTERN", "Value": "*.docx"}
]' \
--profile account-a \
--region us-east-1
# 排除特定文件
aws datasync start-task-execution \
--task-arn "$TASK_ARN" \
--excludes '[
{"FilterType": "SIMPLE_PATTERN", "Value": "*.tmp"},
{"FilterType": "SIMPLE_PATTERN", "Value": ".DS_Store"},
{"FilterType": "SIMPLE_PATTERN", "Value": "*/cache/*"}
]' \
--profile account-a \
--region us-east-1
# 创建限制带宽的任务(10 MB/s)
aws datasync create-task \
--source-location-arn "$SOURCE_LOCATION_ARN" \
--destination-location-arn "$DEST_LOCATION_ARN" \
--options '{
"BytesPerSecond": 10485760
}' \
--profile account-a \
--region us-east-1

带宽限制参考:

速率BytesPerSecond 值
1 MB/s1048576
10 MB/s10485760
50 MB/s52428800
100 MB/s104857600
无限制-1
# 创建 SNS 主题
aws sns create-topic \
--name DataSyncNotifications \
--profile account-a \
--region us-east-1
# 订阅邮件通知
aws sns subscribe \
--topic-arn arn:aws:sns:us-east-1:111111111111:DataSyncNotifications \
--protocol email \
--notification-endpoint [email protected] \
--profile account-a \
--region us-east-1
# 创建 CloudWatch Event Rule
aws events put-rule \
--name DataSyncTaskCompletion \
--event-pattern '{
"source": ["aws.datasync"],
"detail-type": ["DataSync Task Execution State Change"],
"detail": {
"State": ["SUCCESS", "ERROR"]
}
}' \
--profile account-a \
--region us-east-1
# 添加 SNS 目标
aws events put-targets \
--rule DataSyncTaskCompletion \
--targets "Id"="1","Arn"="arn:aws:sns:us-east-1:111111111111:DataSyncNotifications" \
--profile account-a \
--region us-east-1
  • 在源数据所在区域创建 DataSync 任务
  • 减少跨区域延迟
  • 降低数据传输成本
# 创建 S3 VPC 端点(降低延迟和成本)
aws ec2 create-vpc-endpoint \
--vpc-id vpc-xxxxx \
--service-name com.amazonaws.us-east-1.s3 \
--route-table-ids rtb-xxxxx \
--profile account-a \
--region us-east-1

对于大规模数据,可以创建多个任务并行传输不同的前缀:

# 任务 1: 传输 /2023/ 前缀
aws datasync create-location-s3 \
--s3-bucket-arn "arn:aws:s3:::source-bucket-name" \
--subdirectory /2023/ \
--s3-config "{...}" \
--profile account-a
# 任务 2: 传输 /2024/ 前缀
aws datasync create-location-s3 \
--s3-bucket-arn "arn:aws:s3:::source-bucket-name" \
--subdirectory /2024/ \
--s3-config "{...}" \
--profile account-a
# 分别创建任务并同时执行

问题 1:无法创建位置 - 权限被拒绝

错误:

An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation:
DataSync is unable to access your Amazon S3 bucket

解决方案:

# 1. 验证 IAM 角色权限
aws iam get-role-policy \
--role-name DataSyncSourceRole \
--policy-name DataSyncSourcePermissions \
--profile account-a
# 2. 测试角色代入
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/DataSyncDestinationRole \
--role-session-name test \
--external-id datasync-cross-account-transfer \
--profile account-a
# 3. 验证存储桶访问
aws s3 ls s3://destination-bucket-name/ --profile account-a

问题 2:任务执行失败 - 验证错误

错误:任务状态显示 ERROR,验证阶段失败

解决方案:

# 禁用验证或使用较宽松的验证模式
aws datasync update-task \
--task-arn "$TASK_ARN" \
--options '{
"VerifyMode": "NONE"
}' \
--profile account-a \
--region us-east-1

问题 3:传输速度慢

优化方案:

# 1. 移除带宽限制
aws datasync update-task \
--task-arn "$TASK_ARN" \
--options '{
"BytesPerSecond": -1
}' \
--profile account-a \
--region us-east-1
# 2. 使用 VPC 端点
# 3. 确保任务在源数据区域运行
# 4. 检查网络连接质量

问题 4:跨账户角色代入失败

错误:

User: arn:aws:sts::111111111111:assumed-role/... is not authorized to perform:
sts:AssumeRole on resource: arn:aws:iam::222222222222:role/DataSyncDestinationRole

解决方案:

# 1. 检查目标角色的信任策略
aws iam get-role \
--role-name DataSyncDestinationRole \
--profile account-b
# 2. 确认外部 ID 匹配
# 3. 验证源角色有 sts:AssumeRole 权限
aws iam get-role-policy \
--role-name DataSyncSourceRole \
--policy-name DataSyncSourcePermissions \
--profile account-a

问题 5:CloudWatch 日志无法写入

解决方案:

# 确保日志组存在
aws logs describe-log-groups \
--log-group-name-prefix /aws/datasync \
--profile account-a \
--region us-east-1
# 如果不存在,创建日志组
aws logs create-log-group \
--log-group-name /aws/datasync \
--profile account-a \
--region us-east-1

传输定价(美国东部):

传输方向定价
S3 到 S3(同区域)$0.0125/GB
S3 到 S3(跨区域)$0.0200/GB + 数据传输费用

其他费用:

  • S3 GET 请求:$0.0004/1000
  • S3 PUT 请求:$0.005/1000
  • 跨区域数据传输(出站):$0.02/GB(前 10TB)
  • CloudWatch 日志存储:$0.50/GB

传输 10TB 数据从美国东部(账户 A)到美国西部(账户 B):

DataSync 费用: 10,000 GB × $0.02/GB = $200.00
跨区域传输: 10,000 GB × $0.02/GB = $200.00
S3 请求费用: 约 $50.00
总成本: 约 $450.00
  1. 同区域传输:尽可能在同一区域进行传输
  2. 批量传输:合并多次小规模传输为一次大规模传输
  3. 使用 VPC 端点:避免 NAT 网关费用
  4. 调度在低峰时段:某些组织有差异化定价
  5. 选择合适的存储类:直接传输到 S3 Intelligent-Tiering 或 Glacier
  • 使用外部 ID 增强跨账户安全性
  • 最小权限原则配置 IAM 角色
  • 启用 CloudTrail 审计 DataSync 操作
  • 使用 KMS 加密传输中和静态数据
  • 启用数据验证确保完整性
  • 配置 CloudWatch 告警监控任务状态
  • 定期测试跨账户权限配置
  • 保留详细的执行日志
  • 在源数据区域创建任务
  • 使用 VPC 端点减少延迟
  • 合理配置带宽限制
  • 对大规模数据使用并行任务
  • 使用调度在低成本时段执行
  • 选择合适的目标存储类
  • 监控传输量避免意外费用
  • 使用过滤器减少不必要的传输
  • 使用标签管理 DataSync 资源
  • 配置自动化通知
  • 定期审查和优化任务配置
  • 记录配置变更和执行历史

AWS DataSync 提供了企业级的跨账户数据传输解决方案,特别适合:

  • 大规模数据迁移(TB 到 PB 级别)
  • 需要自动数据验证和完整性检查
  • 持续的数据同步需求
  • 需要详细监控和日志记录
  • 生产环境的关键数据传输

通过正确配置 IAM 角色、位置和任务参数,结合自动化脚本和监控告警,可以实现安全、高效、可靠的跨账户数据传输。