

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

# 教程：将数据从本地存储传输到 Amazon S3 AWS 账户
<a name="s3-cross-account-transfer"></a>

 AWS DataSync 与本地存储一起使用时，您通常会将数据传输到与您的 DataSync 代理同属 AWS 账户 的 AWS 存储服务。但是，在某些情况下，您可能需要将数据传输到与其他账户关联的 Amazon S3 存储桶。

**重要**  
只有当 Amazon S3 是传输位置之一时，才可以使用本教程中的方法进行数据 DataSync 传输。 AWS 账户 

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

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

下图阐明了此类方案。

![\[数据通过互联网 Direct Connect 连接从本地存储系统移动到的示例 DataSync 场景 AWS。数据首先被传输到一个账户 AWS 账户 （您的源账户），然后最后将其存入另一个 AWS 账户 （您的目标账户）中的 Amazon S3 存储桶。\]](http://docs.aws.amazon.com/zh_cn/datasync/latest/userguide/images/s3-cross-account-diagram.png)


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

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

------
#### [ User permissions ]

在您的源账户中，至少向用于创建 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 角色。

****  

```
{
    "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 service permissions ]

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

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

****  

```
{
  "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="onprem-s3-cross-account-required-permissions-destination"></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 代理
<a name="s3-cross-account-deploy-agent"></a>

首先，您必须创建一个可以从本地存储系统读取数据并与 DataSync 服务通信的 DataSync 代理。此过程包括在您的本地存储环境中部署代理以及在源 AWS 账户中激活代理。

**注意**  
本教程中的步骤适用于您使用的任何类型的代理和服务端点。

**创建代 DataSync 理**

1. [在本地存储环境中部署 DataSync 代理](deploy-agents.md)。

1. [选择代理将用来与之通信的服务端点](choose-service-endpoint.md) AWS。

1. 在您的源账户中[激活代理](activate-agent.md)。

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

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

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

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

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

**创建 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-cross-account-attach-custom-policy"></a>

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

**为您的 IAM 角色添加权限**

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. 选择**下一步**。为您的策略输入名称，然后选择**创建策略**。

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

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

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

**更新目标 S3 存储桶策略**

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-cross-account-create-iam-role-source-account)。

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

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

## 步骤 4：在您的目标账户中， ACLs 对您的 S3 存储桶禁用
<a name="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)。

**为目标存储桶禁用 ACLs**

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

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

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

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

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

## 第 5 步：在您的源账户中，为您的本地存储创建 DataSync 源位置
<a name="s3-on-prem-cross-account-create-source-location"></a>

在您的源帐户中，为要从中传输数据的本地存储系统创建[DataSync 源位置](working-with-locations.md)。此位置使用您在源账户中[激活的代理](#s3-cross-account-deploy-agent)。

## 步骤 6：在您的源账户中，为您的 S3 存储桶创建 DataSync 目标位置
<a name="s3-cross-account-create-datasync-destination"></a>

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

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

由于您无法使用 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 中使用的[所需用户权限](#onprem-s3-cross-account-required-permissions-source)。

**要创建 DataSync 目标位置，请使用以下方法： CloudShell**

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

1. 复制以下命令：

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

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

1. 将 `source-user-account` 替换为您源账户的 AWS 账户 ID。

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

1. 在中运行命令 CloudShell。

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

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

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

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

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

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

**创建并启动 DataSync 任务**

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

1. 在**配置源位置**页面上，选择**选择现有位置**。选择要从中复制数据的源位置（您的本地存储），然后选择**下一步**。

1. 在**配置目标位置**页面上，选择**选择现有位置**。选择要向其复制数据的目标位置（目标账户中的 S3 存储桶），然后选择**下一步**。

1. 在**配置设置**页面上，为任务命名。根据需要配置其他设置，例如指定 Amazon CloudWatch 日志组。选择**下一步**。

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

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

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

## 相关资源
<a name="s3-cross-account-create-start-datasync-task"></a>

有关本教程中操作的更多信息，请参阅以下主题：
+ [为 AWS 服务 （控制台）创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)
+ [修改角色信任策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)
+ [使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)
+ [使用创建 S3 位置 AWS CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/datasync/create-location-s3.html)