

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：在 Amazon S3 存储桶之间传输数据 AWS 账户
<a name="tutorial_s3-s3-cross-account-transfer"></a>

使用 AWS DataSync，您可以在属于不同 AWS 账户的 Amazon S3 存储桶之间传输数据。

**重要**  
 AWS 账户 使用本教程中的方法进行数据传输仅适用于 Amazon S3。此外，本教程还可以帮助您在不同 AWS 区域的 S3 存储桶之间传输数据。

## 概述
<a name="s3-s3-cross-account-overview"></a>

在两者之间传输数据的情况并不少见 AWS 账户，尤其是在您有单独的团队管理组织资源的情况下。以下是使用跨账户转账的 DataSync 样子：
+ **源账户**： AWS 账户 用于管理您需要从中传输数据的 S3 存储桶。
+ **目标账户**： AWS 账户 用于管理需要向其传输数据的 S3 存储桶。

------
#### [ Transfers across accounts ]

下图说明了您将数据从一个 S3 存储桶传输到位于另一个不同的 AWS 账户中的 S3 存储桶中的场景。

![一个示例 DataSync 场景，即数据从一个 S3 存储桶 AWS 账户 （您的源账户）移动到另一个 AWS 账户 （您的目标账户）中的 S3 存储桶。](http://docs.aws.amazon.com/zh_cn/datasync/latest/userguide/images/s3-s3-cross-account-same-region-diagram.png)


------
#### [ Transfers across accounts and Regions ]

下图说明了您将数据从 S3 存储桶传输到位于不同 AWS 账户 和区域的另一个 S3 存储桶的场景。

![示例 DataSync 场景是，数据从一个 S3 存储桶移动到一个 AWS 账户 （您的源账户）和区域中，然后将其移动到另一个 AWS 账户 （您的目标账户）和区域中的 S3 存储桶。](http://docs.aws.amazon.com/zh_cn/datasync/latest/userguide/images/s3-s3-cross-account-diff-region-diagram.png)


------

## 先决条件：所需的源账户权限
<a name="s3-s3-cross-account-required-permissions-source-account"></a>

对于您的来源 AWS 账户，这种跨账户转账需要考虑两组权限：
+ 允许@@ *用户使用的用户权限* DataSync（可能是您或您的存储管理员）。这些权限允许您创建 DataSync 位置和任务。
+ DataSync 允许将数据传输 DataSync 到目标账户存储桶的@@ *服务权限*。

### 源账户的用户权限
<a name="s3-s3-cross-account-required-permissions-source-account-user"></a>

在您的源账户中，至少向用于创建 DataSync 营业地点和任务的 IAM 角色添加以下权限。有关如何为角色添加权限的信息，请参阅[创建](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)或[修改](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_modify.html) IAM 角色。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SourceUserRolePermissions",
            "Effect": "Allow",
            "Action": [
                "datasync:CreateLocationS3",
                "datasync:CreateTask",
                "datasync:DescribeLocation*",
                "datasync:DescribeTaskExecution",
                "datasync:ListLocations",
                "datasync:ListTaskExecutions",
                "datasync:DescribeTask",
                "datasync:CancelTaskExecution",
                "datasync:ListTasks",
                "datasync:StartTaskExecution",
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        },
        {
            "Sid": "IAMPermissions",
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:ListRoles",
                "iam:CreatePolicy"
            ],
            "Resource": "arn:aws:iam::111122223333:role/DataSync-*"
        },
        {
            "Sid": "IAMAttachRolePermissions",
            "Effect": "Allow",
            "Action": [
               "iam:AttachRolePolicy"
            ],
            "Resource": "arn:aws:iam::111122223333:role/DataSync-*",
            "Condition": {
               "ArnLike": {
                 "iam:PolicyARN": [
                    "arn:aws:iam::111122223333:policy/DataSync-*",
                    "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess",
                    "arn:aws:iam::aws:policy/service-role/AWSDataSyncFullAccess"
                 ]
               }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "datasync.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

------

**提示**  
要设置您的*用户权限*，请考虑使用[AWSDataSyncFullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-awsdatasyncfullaccess)。这是一个 AWS 托管策略，为用户提供对其依赖项的完全访问权限 DataSync 和最少访问权限。

### DataSync 您的源账户的服务权限
<a name="s3-s3-cross-account-required-permissions-source-account-service"></a>

该 DataSync 服务需要您的源账户中的以下权限才能将数据传输到目标账户存储桶。

在本教程的后面部分，您将在为[创建 IAM 角色](#s3-s3-cross-account-create-iam-role-source-account)时添加这些权限 DataSync。您还可以在[目标存储桶策略和创建 DataSync目标](#s3-s3-cross-account-update-s3-policy-destination-account)[位置](#s3-s3-cross-account-create-locations)时指定此角色 (`{{source-datasync-role}}`)。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}"
    },
    {
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObject",
        "s3:GetObjectTagging",
        "s3:PutObjectTagging"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}/*"
    }
  ]
}
```

------

## 先决条件：所需的目标账户权限
<a name="s3-s3-cross-account-required-permissions-dest-account"></a>

在您的目标账户中，您的*用户权限*必须允许您更新目标存储桶的策略并禁用其访问控制列表（ACLs）。有关这些特定权限的更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)[https://docs.aws.amazon.com/AmazonS3/latest/userguide/](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)。

## 步骤 1：在您的源账户中，创建用于访问目标存储桶 DataSync 的 IAM 角色
<a name="s3-s3-cross-account-create-iam-role-source-account"></a>

在您的源中 AWS 账户，您需要一个 IAM 角色来授予向目标账户存储桶传输数据的权限。 DataSync 

由于您要跨账户转账，因此必须手动创建角色。 （使用同一个账户进行转账时，DataSync可以在控制台中为你创建此角色。）

### 创建 I DataSync AM 角色
<a name="s3-s3-cross-account-create-iam-role"></a>

创建以 DataSync 作为可信实体的 IAM 角色。

1. 使用您的源账户登录。 AWS 管理控制台 

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在左侧导航窗格的**访问管理**下，选择**角色**，然后选择**创建角色**。

1. 在**选择可信实体**页面中，为**可信实体类型**选择 **AWS 服务**。

1. 对于 “**用例**”，**DataSync**在下拉列表中进行选择，然后选择**DataSync**。选择**下一步**。

1. 在**添加权限**页面上，选择**下一步**。

1. 输入角色名称，然后选择**创建角色**。

有关更多信息，请参阅 *IAM 用户指南*中的[为 AWS 服务 （控制台）创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)。

### 向 DataSync IAM 角色添加权限
<a name="s3-s3-cross-account-attach-custom-policy"></a>

您刚刚创建的 IAM 角色需要允许将数据传输 DataSync 到目标账户中的 S3 存储桶的权限。

1. 在 IAM 控制台的**角色**页面上，搜索您刚刚创建的角色并选择其名称。

1. 在角色的详情页面上，选择**权限**选项卡。选择**添加权限**，然后选择**创建内联策略**。

1. 选择 **JSON** 选项卡并执行以下操作：

   1. 将以下 JSON 粘贴到策略编辑器中：
**注意**  
`aws:ResourceAccount` 的值应为拥有策略中指定 Amazon S3 存储桶的账户 ID。

------
#### [ JSON ]

****  

      ```
      {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "s3:GetBucketLocation",
                   "s3:ListBucket",
                   "s3:ListBucketMultipartUploads"
               ],
               "Effect": "Allow",
               "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
               "Condition": {
                   "StringEquals": {
                    "aws:ResourceAccount": "123456789012"
                   }
               }
           },
           {
               "Action": [
                   "s3:AbortMultipartUpload",
                   "s3:DeleteObject",
                   "s3:GetObject",
                   "s3:GetObjectTagging",
                   "s3:GetObjectVersion",
                   "s3:GetObjectVersionTagging",
                   "s3:ListMultipartUploadParts",
                   "s3:PutObject",
                   "s3:PutObjectTagging"
                 ],
               "Effect": "Allow",
               "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "123456789012"
                   }
               }
           }
       ]
      }
      ```

------

   1. 将 `{{amzn-s3-demo-destination-bucket}}` 的每个实例替换为目标账户中 S3 存储桶的名称。

1. 选择**下一步**。为您的策略输入名称，然后选择**创建策略**。

## 第 2 步：在您的目标账户中，更新 S3 存储桶策略
<a name="s3-s3-cross-account-update-s3-policy-destination-account"></a>

在您的目标账户中，修改目标 S3 存储桶策略以包含您在源账户中创建的 [DataSync IAM 角色](#s3-s3-cross-account-create-iam-role-source-account)。

**开始之前**：请确保您拥有[目标账户所需的权限](#s3-s3-cross-account-required-permissions-dest-account)。

### 更新目标 S3 存储桶策略
<a name="s3-s3-cross-account-update-s3-policy-destination-account-how-to"></a>

1. 在中 AWS 管理控制台，切换到您的目标账户。

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 在 **存储桶**列表中，选择要向其传输数据的 S3 存储桶。

1. 在存储桶的详情页面上，选择**权限**选项卡。

1. 在 **存储桶策略**下，选择 **编辑**并执行以下操作来修改您的 S3 存储桶策略：

   1. 更新编辑器中的内容，以包含以下策略声明：

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "DataSyncCreateS3LocationAndTaskAccess",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::{{111122223333}}:role/{{source-datasync-role}}"
            },
            "Action": [
              "s3:GetBucketLocation",
              "s3:ListBucket",
              "s3:ListBucketMultipartUploads",
              "s3:AbortMultipartUpload",
              "s3:DeleteObject",
              "s3:GetObject",
              "s3:ListMultipartUploadParts",
              "s3:PutObject",
              "s3:GetObjectTagging",
              "s3:PutObjectTagging"
            ],
            "Resource": [
              "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}",
              "arn:aws:s3:::{{amzn-s3-demo-destination-bucket}}/*"
            ]
          }
        ]
      }
      ```

------

   1. 将的`{{source-account}}`每个实例替换为您的源账户的 AWS 账户 ID。

   1. `{{source-datasync-role}}`替换为[您在源账户 DataSync 中为其创建的 IAM 角色](#s3-s3-cross-account-create-iam-role-source-account)。

   1. 将 `{{amzn-s3-demo-destination-bucket}}` 的每个实例替换为目标账户中 S3 存储桶的名称。

1. 选择**保存更改**。

## 步骤 3：在您的目标账户中， ACLs 对您的 S3 存储桶禁用
<a name="s3-s3-cross-account-disable-acls-destination-account"></a>

您传输到 S3 存储桶的所有数据都属于您的目标账户，这一点至关重要。为确保该账户拥有数据，请禁用存储桶的访问控制列表 (ACLs)。有关更多信息，请参阅 *Amazon S3 用户指南*中的[控制对象所有权和禁用 ACLs 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)。

**开始之前**：请确保您拥有[目标账户所需的权限](#s3-s3-cross-account-required-permissions-dest-account)。

### 禁用您的目标 S3 存储桶 ACLs
<a name="s3-s3-cross-account-disable-acls-destination-account-how-to"></a>

1. 仍使用目标账户登录 S3 控制台时，请选择要向其传输数据的 S3 存储桶。

1. 在存储桶的详情页面上，选择**权限**选项卡。

1. 在**对象所有权**下方，请选择**编辑**。

1. 如果尚未选中，请选择**ACLs 禁用（推荐）**选项。

1. 选择**保存更改**。

## 第 4 步：在您的来源账户中，创建您的 DataSync 营业地点
<a name="s3-s3-cross-account-create-locations"></a>

在您的源账户中，为您的源和目标 S3 存储桶创建 DataSync 位置。

**开始之前**：请确保您拥有[源账户所需的权限](#s3-s3-cross-account-required-permissions-source-account)。

### 创建您的 DataSync 来源位置
<a name="s3-s3-cross-account-create-source-location"></a>
+ 在您的源账户中，为您要从中传输数据的 S3 存储桶创建[位置](create-s3-location.md#create-s3-location-how-to)。

### 创建您的 DataSync 目的地位置
<a name="s3-s3-cross-account-create-datasync-destination"></a>

仍然是在源账户中，为要向其传输数据的 S3 存储桶创建位置。

由于您无法使用 DataSync 控制台界面创建跨账户营业地点，因此这些说明要求您运行`create-location-s3`命令来创建目标营业地点。我们建议使用直接从控制台启动的基于浏览器 AWS CloudShell、经过预先验证的 shell 来运行该命令。 CloudShell允许你在`create-location-s3`不下载或安装 AWS CLI 命令行工具的情况下运行命令。

**注意**  
要使用除之外的命令行工具完成以下步骤 CloudShell，请确保您的[AWS CLI 个人资料](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)使用相同的 IAM 角色，其中包含在源账户 DataSync 中使用的[所需用户权限](#s3-s3-cross-account-required-permissions-source-account)。

**使用创建 DataSync 目标位置 CloudShell**

1. 在您的源账户中，执行以下任一操作以 CloudShell 从控制台启动：
   + 选择控制台导航栏上的 CloudShell 图标。它位于搜索框的右侧。
   + 使用控制台导航栏上的搜索框进行搜索，**CloudShell**然后选择**CloudShell**选项。

1. 复制以下 `create-location-s3` 命令：

   ```
   aws datasync create-location-s3 \
     --s3-bucket-arn arn:aws:s3:::{{amzn-s3-demo-destination-bucket}} \
     --region {{amzn-s3-demo-destination-bucket-region}} \
     --s3-config '{
       "BucketAccessRoleArn":"arn:aws:iam::{{source-account-id}}:role/{{source-datasync-role}}"
     }'
   ```

1. 将 `{{amzn-s3-demo-destination-bucket}}` 替换为目标账户中 S3 存储桶的名称。

1. 如果您的目标存储桶所在区域与源存储桶不同，请将 `{{amzn-s3-demo-destination-bucket-region}}` 替换为目标存储桶所在区域（例如 `{{us-east-2}}`）。如果您的存储桶位于同一区域，请移除此选项。

1. `{{source-account-id}}`替换为来源 AWS 账户 ID。

1. `{{source-datasync-role}}`替换为您在源账户中创建的 [DataSyncIAM 角色](#s3-s3-cross-account-create-iam-role-source-account)。

1. 在中运行命令 CloudShell。

   如果命令返回类似于以下 DataSync 位置的地点 ARN，则表示您成功创建了该地点：

   ```
   {
     "LocationArn": "arn:aws:datasync:us-east-2:123456789012:location/loc-abcdef01234567890"
   }
   ```

1. 在左侧导航窗格中，展开**数据传输**，然后选择**位置**。

1. 如果您在将该位置创建在了其他区域，请在导航窗格中选择对应的区域。

在您的源账户中，您可以看到刚刚为目标账户存储桶创建的 S3 位置。

## 第 5 步：在您的源账户中，创建并启动 DataSync 任务
<a name="s3-s3-cross-account-create-start-datasync-task"></a>

在开始传输数据的 DataSync 任务之前，让我们回顾一下你到目前为止所做的事情：
+ 在您的源账户中，您创建了一个 IAM 角色，允许将数据传输 DataSync 到目标账户中的 S3 存储桶。
+ 在您的目标账户中，您配置了 S3 存储桶，以便 DataSync 可以向其传输数据。
+ 在您的来源账户中，您创建了转账的 DataSync 来源和目标地点。

### 创建并开始您的 DataSync 任务
<a name="s3-s3-cross-account-create-start-datasync-task-how-to"></a>

1. 在源账户中仍在使用 DataSync 控制台的同时，展开左侧导航窗格中的**数据传输**，然后选择**任务和**创建任务****。

1. 如果目标账户中的存储桶与源账户中的存储桶位于不同的区域，请在顶部导航窗格中选择目标存储桶所在的区域。
**重要**  
为避免网络连接错误，您必须在与目标位置相同的区域创建 DataSync任务。

1. 在**配置源位置**页面上，执行以下操作：

   1. 选择**选择现有地点**。

   1. （对于跨区域传输）在**区域**下拉列表中，选择源存储桶所在的区域。

   1. 对于**现有位置**，选择要从中传输数据的 S3 存储桶的源位置，然后选择**下一步**。

1. 在**配置目标位置**页面上，执行以下操作：

   1. 选择**选择现有地点**。

   1. 对于**现有位置**，选择要将数据传输到的 S3 存储桶的目标位置，然后选择**下一步**。

1. 在**配置设置**页面上，选择**任务模式**。
**提示**  
建议使用**增强**模式。有关更多信息，请参阅 [为数据传输选择任务模式](choosing-task-mode.md)。

1. 为任务命名并配置其他设置，例如指定 Amazon CloudWatch 日志组。选择**下一步**。

1. 在**审核**页面上，检查您的设置，然后选择**创建任务**。

1. 在任务的详细信息页面上，选择**开始**，然后选择以下选项之一：
   + 如需运行任务而不进行修改，请选择**从默认值开始**。
   + 如需修改任务再运行，请选择**使用覆盖选项开始**。

任务完成后，请检查目标账户中的 S3 存储桶。您应该会看到从源账户存储桶中移出的数据。

## 问题排查
<a name="s3-s3-cross-account-troubleshooting"></a>

如果在尝试完成跨账户传输时遇到问题，请参考以下信息。

**连接错误**  
在具有基本模式任务的不同 AWS 账户 区域的 S3 存储桶之间传输时，启动任务时可能会出现网络连接错误。 DataSync 要解决此问题，请使用增强模式任务。或者，请在与目标位置相同的区域创建基本模式任务，然后尝试运行该任务。

## 相关信息：使用服务器端加密的 S3 存储桶进行跨账户传输
<a name="s3-s3-cross-account-create-start-datasync-task"></a>

如果您正在尝试使用服务器端加密的 S3 存储桶进行此类传输，请参阅 [AWS 存储博客](https://aws.amazon.com/blogs/storage/transfer-customer-managed-sse-kms-encrypted-objects-across-aws-accounts-and-regions-using-aws-datasync/)了解相关说明。