如何使用 AWS DataSync 将数据传输到跨账户 Amazon Simple Storage Service (Amazon S3) 位置或从中传出数据?

3 分钟阅读
0

我想使用 AWS DataSync 将数据传输到跨账户 Amazon Simple Storage Service (Amazon S3) 存储桶或从中传出数据。

简短描述

要使用 DataSync 进行跨账户数据传输,请执行以下操作:

  1. 使用 AWS Command Line Interface (AWS CLI) 或 AWS 软件开发工具包在 DataSync 中创建跨账户 Simple Storage Service (Amazon S3) 位置。
  2. 创建将数据从源存储桶传输到目标存储桶的 DataSync 任务。

使用 DataSync 在不同 S3 账户拥有的存储桶之间传输数据时,请记住以下限制:

  • 当向跨账户目标存储桶传输数据时,DataSync 不会应用 bucket-owner-full-control 访问控制列表(ACL)。这会导致目标存储桶中的对象所有权问题。
  • 对于跨账户 S3 位置,仅支持同一区域中的跨账户存储桶。如果您尝试使用跨账户和跨区域 S3 位置,则会收到 GetBucketLocationUnable to connect to S3 endpoint(无法连接到 S3 端点)错误。因此,如果任务是在源账户中创建的,则任务必须在与目标存储桶相同的区域中创建。如果任务是在目标账户中创建的,则任务必须在与源存储桶相同的区域中创建。
  • 您无法使用跨账户通行证角色访问跨账户 S3 位置。

您可以绕过上述限制,在目标账户中配置 DataSync 任务以从源中提取数据。

解决方法

执行必需的检查

假设源账户具有跨账户源 S3 存储桶,目标账户具有目标 S3 存储桶和 DataSync 任务。执行以下检查:

**AWS 身份和管理 (IAM) 用户/角色:**检查以下 IAM 用户或角色是否具有所需的权限

  • 您用于创建跨账户 S3 位置的用户或角色
  • 您分配给 S3 位置的角色

**源存储桶策略:**确保源存储桶策略允许目标账户中的两个 IAM 用户/角色访问存储桶。以下示例策略向两个 IAM 用户/角色授予对源存储桶的访问权限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:role/datasync-config-role",
          "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
        ]
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": [
        "arn:aws:s3:::example-source-bucket"
      ]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:role/datasync-config-role",
          "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
        ]
      },
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::example-source-bucket/*"
      ]
    }
  ]
}

请务必在之前的策略中替换以下值:

  • example-source-bucket 替换为源存储桶名称
  • 1111222233334444 替换为目标账户的账户 ID
  • datasync-config-role 替换为用于 DataSync 配置(例如,在 DataSync 中创建源 S3 位置以及任务)的 IAM 角色
    **注意:**您也可以使用 IAM 用户。本文将考虑使用 IAM 角色的情况。
  • dataysnc-transfer-role,其中包含在创建源 S3 位置时分配的 IAM 角色
    **注意:**DataSync 使用此角色访问跨账户数据。

目标 S3 位置:

使用 AWS CLI 或软件开发工具包在 DataSync 中创建跨账户源 S3 位置

**注意:**AWS 管理控制台不支持创建跨账户 S3 位置。

您可以使用以下任一方法创建跨账户 S3 位置:

  • 使用配置 JSON 文件。
  • 使用 AWS CLI 命令中的选项。

使用配置 JSON 文件

1.    请使用以下参数为跨账户 S3 位置创建配置 JSON 文件 input.template

{
  "Subdirectory": "",
  "S3BucketArn": "arn:aws:s3:::[Source bucket]",
  "S3StorageClass": "STANDARD",
  "S3Config": {
    "BucketAccessRoleArn": "arn:aws:iam::1111222233334444:role/datasync-transfer-role"
  }
}

2.    通过运行以下 AWS CLI 命令创建 S3 位置:

aws datasync create-location-s3 --cli-input-json file://input.template --region example-DataSync-Region

**注意:**如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

有关更多信息,请参阅 create-location-s3

创建 S3 位置后,您会看到以下输出:

{
"LocationArn": "arn:aws:datasync:example-Region:123456789012:location/loc-0f8xxxxxxxxe4821"
}

请注意,123456789012 是源账户的账户 ID。

使用 AWS CLI 命令中的选项

请使用适当的选项运行以下 AWS CLI 命令:

aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::example-source-bucket --s3-storage-class STANDARD --s3-config BucketAccessRoleArn="arn:aws:iam::1111222233334444:role/datasync-transfer-role" --region example-DataSync-Region

请务必在命令中替换以下值:

  • example-source-bucket 替换为源存储桶名称
  • example-DataSync-Region 替换为您将在其中创建 DataSync 任务的区域。

创建 DataSync 任务

配置 DataSync 任务,然后从 DataSync 控制台开启任务。有关更多信息,请参阅启动 AWS DataSync 任务

已知错误和解决方法

Error: error creating DataSync Location S3: InvalidRequestException: Please provide a bucket in the xxx region where DataSync is currently used(错误:创建 DataSync 位置 S3 时出错:InvalidRequestException:请在当前使用 DataSync 的 xxx 区域提供存储桶)

如果您收到此错误,请确认存储桶和 IAM 策略包含以下必需权限:

"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
]

如果您在使用跨账户存储桶时遇到此错误,请确保这些存储桶与您的 DataSync 任务位于同一区域

S3 对象所有权问题

DataSync 不支持使用跨账户存储桶作为目标位置。因此,您无法使用 ACL bucket-owner-full-control。如果 DataSync 任务从源存储桶账户运行,则上传到目标存储桶账户的对象可能存在对象所有权问题。要解决此问题,如果目标存储桶中没有正在使用 ACL 的对象,请考虑禁用目标存储桶上的 ACL。如需了解详情,请参阅控制对象的所有权并禁用存储桶的 ACL。否则,最佳实践是在目标账户中配置 DataSync 任务以从源中提取数据。


相关信息

如何使用 AWS DataSync 在 Amazon Simple Storage Service (Amazon S3) 存储桶之间迁移数据

AWS 官方
AWS 官方已更新 2 年前