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
DataSync vs 其他迁移方案
Section titled “DataSync vs 其他迁移方案”| 特性 | DataSync | S3 批处理 | AWS CLI |
|---|---|---|---|
| 适用数据量 | TB - PB | TB - 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 存储桶。
1.2 创建权限策略
Section titled “1.2 创建权限策略”权限策略(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.1 通过控制台创建角色
Section titled “1.1 通过控制台创建角色”- 登录账户 B 的 AWS 控制台
- 导航至 IAM → 角色 → 创建角色
- 选择 AWS 账户 → 另一个AWS账户
- 输入账户 A 的账户 ID:
111111111111 - 勾选(可选但推荐) 需要外部ID,输入:
datasync-cross-account-transfer或者生成的UUID- Linux:
uuidgen - Windows:
[guid]::NewGuid()
- Linux:
- 点击 下一步
- 选择或创建权限策略(使用上面的 JSON)
- 角色名称:
DataSyncDestinationRole - 点击 创建角色;点击查看角色
- 记录角色 ARN:
arn:aws:iam::222222222222:role/DataSyncDestinationRole
步骤 2:在账户 A 创建源 IAM 角色
Section titled “步骤 2:在账户 A 创建源 IAM 角色”DataSync 任务在账户 A 运行,需要创建 IAM 角色访问源存储桶和代入目标角色。
2.1 创建信任策略
Section titled “2.1 创建信任策略”信任策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "datasync.amazonaws.com" }, "Action": "sts:AssumeRole" } ]}2.2 创建权限策略
Section titled “2.2 创建权限策略”权限策略:
{ "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" } ]}2.3 通过控制台创建角色
Section titled “2.3 通过控制台创建角色”- 登录账户 A 的 AWS 控制台
- 导航至 IAM → 角色 → 创建角色
- 选择 AWS 服务 → DataSync
- 点击 下一步
- 创建或选择权限策略(使用上面的 JSON)(创建账户后再次附加
DataSync-Policy) - 角色名称:
DataSyncSourceRole - 点击 创建角色
- 记录角色 ARN:
arn:aws:iam::111111111111:role/DataSyncSourceRole
步骤 3:创建 DataSync 源位置
Section titled “步骤 3:创建 DataSync 源位置”在账户 A 创建 DataSync 源位置,指向源 S3 存储桶。
3.1 通过控制台创建
Section titled “3.1 通过控制台创建”- 登录账户 A 的 AWS 控制台
- 导航至 DataSync → 位置 → 创建位置
- 选择 位置类型: Amazon S3
- 配置参数:
- S3 URI: 选择或输入
s3://source-bucket-name - S3 存储类: 保持默认
- Folder: 可选,指定子文件夹(如
/data/) - IAM 角色: 选择
DataSyncSourceRole
- S3 URI: 选择或输入
- 点击 创建位置
- 记录源位置 ARN:
arn:aws:datasync:us-east-1:111111111111:location/loc-xxxxx
步骤 4:创建 DataSync 目标位置
Section titled “步骤 4:创建 DataSync 目标位置”在账户 A 创建目标位置,指向账户 B 的存储桶。
4.2 通过 AWS CLI 创建
Section titled “4.2 通过 AWS CLI 创建”# 创建目标位置(跨账户)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"# }步骤 5:创建 DataSync 任务
Section titled “步骤 5:创建 DataSync 任务”创建 DataSync 任务,连接源位置和目标位置。
5.1 通过控制台创建
Section titled “5.1 通过控制台创建”- 在账户 A 的 DataSync 控制台
- 导航至 Tasks → Create task
- 配置源和目标:
- Source location: 选择步骤 3 创建的源位置
- Destination location: 选择步骤 4 创建的目标位置
- 配置设置:
- Task name:
CrossAccountS3Transfer - Verify data: 选择 Verify only the data transferred(推荐)
- Copy ownership: 根据需要选择
- Copy permissions: 根据需要选择
- Task name:
- 配置调度(可选):
- 选择 Schedule: Run on a schedule
- Frequency: 每小时、每天、每周等
- 配置过滤器(可选):
- Include patterns: 例如
*.jpg - Exclude patterns: 例如
*.tmp
- Include patterns: 例如
- 配置带宽限制(可选):
- 设置最大传输速率(MB/s)
- 点击 Create task
- 记录任务 ARN
5.2 通过 AWS CLI 创建
Section titled “5.2 通过 AWS CLI 创建”基本任务创建:
# 创建 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(删除) |
步骤 6:执行 DataSync 任务
Section titled “步骤 6:执行 DataSync 任务”6.1 通过控制台执行
Section titled “6.1 通过控制台执行”- 在 DataSync 控制台选择创建的任务
- 点击 Start → Start with defaults 或 Start with overriding options
- 等待任务执行完成
- 查看执行历史和详细日志
6.2 通过 AWS CLI 执行
Section titled “6.2 通过 AWS CLI 执行”# 启动任务执行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步骤 7:监控任务执行
Section titled “步骤 7:监控任务执行”7.1 查看任务执行状态
Section titled “7.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- 执行失败
7.2 列出所有执行历史
Section titled “7.2 列出所有执行历史”# 列出任务的所有执行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-17.3 使用 CloudWatch 监控
Section titled “7.3 使用 CloudWatch 监控”创建 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完整自动化脚本
Section titled “完整自动化脚本”DataSync 跨账户传输自动化脚本
Section titled “DataSync 跨账户传输自动化脚本”#!/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"
# 获取角色 ARNDEST_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"
# 获取角色 ARNSOURCE_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 fidone
# ==================== 获取执行统计 ====================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.shchmod +x datasync-cross-account-setup.sh
# 修改脚本中的配置参数后运行./datasync-cross-account-setup.sh1. 配置任务调度
Section titled “1. 配置任务调度”# 创建带调度的任务(每天凌晨 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 天一次 |
2. 配置文件过滤
Section titled “2. 配置文件过滤”# 仅传输特定类型文件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-13. 带宽限制
Section titled “3. 带宽限制”# 创建限制带宽的任务(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/s | 1048576 |
| 10 MB/s | 10485760 |
| 50 MB/s | 52428800 |
| 100 MB/s | 104857600 |
| 无限制 | -1 |
4. 配置 SNS 通知
Section titled “4. 配置 SNS 通知”# 创建 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 your-email@example.com \ --profile account-a \ --region us-east-1
# 创建 CloudWatch Event Ruleaws 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-11. 选择合适的区域
Section titled “1. 选择合适的区域”- 在源数据所在区域创建 DataSync 任务
- 减少跨区域延迟
- 降低数据传输成本
2. 使用 VPC 端点
Section titled “2. 使用 VPC 端点”# 创建 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-13. 并行任务
Section titled “3. 并行任务”对于大规模数据,可以创建多个任务并行传输不同的前缀:
# 任务 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-1DataSync 定价
Section titled “DataSync 定价”传输定价(美国东部):
| 传输方向 | 定价 |
|---|---|
| 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.00S3 请求费用: 约 $50.00总成本: 约 $450.00成本优化建议
Section titled “成本优化建议”- 同区域传输:尽可能在同一区域进行传输
- 批量传输:合并多次小规模传输为一次大规模传输
- 使用 VPC 端点:避免 NAT 网关费用
- 调度在低峰时段:某些组织有差异化定价
- 选择合适的存储类:直接传输到 S3 Intelligent-Tiering 或 Glacier
1. 安全性
Section titled “1. 安全性”- 使用外部 ID 增强跨账户安全性
- 最小权限原则配置 IAM 角色
- 启用 CloudTrail 审计 DataSync 操作
- 使用 KMS 加密传输中和静态数据
2. 可靠性
Section titled “2. 可靠性”- 启用数据验证确保完整性
- 配置 CloudWatch 告警监控任务状态
- 定期测试跨账户权限配置
- 保留详细的执行日志
- 在源数据区域创建任务
- 使用 VPC 端点减少延迟
- 合理配置带宽限制
- 对大规模数据使用并行任务
- 使用调度在低成本时段执行
- 选择合适的目标存储类
- 监控传输量避免意外费用
- 使用过滤器减少不必要的传输
- 使用标签管理 DataSync 资源
- 配置自动化通知
- 定期审查和优化任务配置
- 记录配置变更和执行历史
AWS DataSync 提供了企业级的跨账户数据传输解决方案,特别适合:
- 大规模数据迁移(TB 到 PB 级别)
- 需要自动数据验证和完整性检查
- 持续的数据同步需求
- 需要详细监控和日志记录
- 生产环境的关键数据传输
通过正确配置 IAM 角色、位置和任务参数,结合自动化脚本和监控告警,可以实现安全、高效、可靠的跨账户数据传输。