设置 S3 表类数据存储服务复制 - Amazon Simple Storage Service

设置 S3 表类数据存储服务复制

您可以设置复制,以便自动从源表创建表副本并将其复制到最多五个目标表存储桶。可以在存储桶级别(应用于存储桶中的所有表)或表级别(针对特定表)配置复制。本主题介绍如何使用 Amazon S3 控制台或 AWS 命令行界面(AWS CLI)配置复制。

有关设置复制的更多信息,请参阅以下主题。

设置复制的先决条件

在配置复制之前,请确保您拥有:

所需的资源

  • 源表存储桶:包含要复制的表的表存储桶

  • 目标表存储桶:要将您的表复制到的一个或多个表存储桶(最多 5 个目标表存储桶)

  • 源表:源表存储桶中要复制的现有表

  • IAM 角色:一个 IAM 角色,用于授予 Amazon S3 权限以代表您复制表

所需的权限

您用于设置复制的 IAM 身份必须具有以下权限:

对于存储桶级别的复制:
  • 源表存储桶上的 s3tables:PutTableBucketReplication

  • 源表存储桶上的 s3tables:GetTableBucketReplication

  • 针对复制 IAM 角色的 iam:PassRole

对于表级别的复制:
  • 源表上的 s3tables:PutTableReplication

  • 源表上的 s3tables:GetTableReplication

  • 针对复制 IAM 角色的 iam:PassRole

对于跨账户复制:
  • 来自目标账户的存储桶策略的权限

对跨账户复制的额外要求

如果您的源表存储桶和目标表存储桶位于不同的 AWS 账户中,您还需要:

  • 目标表存储桶上的存储桶策略,该策略用于为源账户授予复制表的权限

  • 目标账户 ID 和表存储桶 Amazon 资源名称(ARN)

对加密表的额外要求

如果您要使用 AWS KMS 加密副本表,则需要:

  • 目标区域中的 KMS 密钥

  • 在您的 IAM 复制角色中使用该 KMS 密钥的权限

  • 允许复制角色加密数据的 KMS 密钥策略

了解复制配置

复制配置定义了 Amazon S3 如何从您的源表存储桶复制表。可以在两个级别配置复制:

存储桶级别的复制

存储桶级别的复制配置将应用于源表存储桶中的所有表。当您配置存储桶级别的复制时,Amazon S3 会自动复制存储桶中创建的所有现有表和新表。

在以下情况下使用存储桶级别的复制:

  • 您希望复制存储桶中的所有表

  • 您希望所有表的复制行为保持一致

  • 您希望通过单一配置来简化管理

表级别的复制

表级别的复制配置将应用于特定表。表级别配置会覆盖该特定表的存储桶级别配置。

在以下情况下使用表级别的复制:

  • 您只希望复制特定表

  • 您需要为不同的表设置不同的复制目标

  • 您希望覆盖某些表的存储桶级别配置

复制配置元素

每个复制配置都包含:

  • IAM 角色:Amazon S3 代入的用于执行复制操作的角色

  • 规则:一条或多条复制规则(启动时限制为 1 条规则)。每条规则都包含:

    • 目标:目标表存储桶 ARN 的列表(最多 5 个目标)

    • 状态:规则是已启用还是已禁用

  • 版本令牌:用于在更新配置时防止写入冲突的令牌

在存储桶级别的复制与表级别的复制之间做出选择

配置优先级

当存储桶级别的配置和表级别的配置同时存在时:

  • 对于该特定表,表级别的配置优先。

  • 其他表遵循存储桶级别的配置。

使用 Amazon S3 控制台设置复制

此过程说明如何使用 Amazon S3 控制台配置复制。

此过程说明如何使用 Amazon S3 控制台创建表存储桶复制配置。表存储桶复制配置将应用于源表存储桶中的所有表。

  1. 登录到 AWS 管理控制台,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择表存储桶

  3. 表存储桶列表中,选择要为其配置复制的表存储桶的名称。

  4. 选择管理选项卡。

  5. 表存储桶复制配置部分,选择创建表存储桶复制配置

  6. 目标部分,配置您的复制目标:

    1. 表存储桶 ARN 字段中,输入目标表存储桶的 ARN。格式为:arn:aws:s3tables:region:account-id:bucket/table-bucket-name

      或者,也可以选择浏览 S3 以从您的账户中选择表存储桶。

    2. (可选)要添加其他目标,请选择添加目标。您可以再添加最多 4 个表存储桶,对应总共 5 个目标。

  7. IAM 角色部分中,配置复制角色:

    1. 对于 IAM 角色选择方法,选择以下选项之一:

      • 创建新的 IAM 角色:Amazon S3 将创建一个具有所需复制权限的新角色。

      • 从现有 IAM 角色中选择:选择具有所需复制权限的现有角色。

      • 输入 IAM 角色 ARN:手动输入现有 IAM 角色的 ARN。

    2. 如果您选择了从现有 IAM 角色中选择,请从 IAM 角色下拉列表中选择一个角色。

    3. (可选)选择查看以在 IAM 控制台中查看所选角色的权限。

  8. 选择创建复制配置

    创建复制配置后,Amazon S3 会开始初始回填过程。您可以在表复制状态部分中监控复制状态,该部分显示了有关每个目标的信息,包括复制状态、目标表 ARN 和上次复制的元数据。

此过程说明如何使用 Amazon S3 控制台创建表级别的复制配置。表复制配置将应用于特定表,并覆盖该表的任何存储桶级别的复制配置。

  1. 登录到 AWS 管理控制台,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 在导航窗格中,选择表存储桶

  3. 表存储桶列表中,选择包含要复制的表的表存储桶的名称。

  4. 选择 Tables (表) 选项卡。

  5. 列表中,选择要复制的表的名称。

  6. 选择管理选项卡。

  7. 表复制配置部分,选择创建表复制配置

  8. 目标部分,配置您的复制目标:

    1. 表存储桶 ARN 字段中,输入目标表存储桶的 ARN。格式为:arn:aws:s3tables:region:account-id:bucket/table-bucket-name

      或者,也可以选择浏览 S3 以从您的账户中选择表存储桶。

    2. (可选)要添加其他目标,请选择添加目标。您可以再添加最多 4 个表存储桶,对应总共 5 个目标。

  9. IAM 角色部分中,配置复制角色:

    1. 对于 IAM 角色选择方法,选择以下选项之一:

      • 创建新的 IAM 角色:Amazon S3 将创建一个具有所需复制权限的新角色。

      • 从现有 IAM 角色中选择:选择具有所需复制权限的现有角色。

      • 输入 IAM 角色 ARN:手动输入现有 IAM 角色的 ARN。

    2. 如果您选择了从现有 IAM 角色中选择,请从 IAM 角色列表中选择一个角色。

    3. (可选)选择查看以在 IAM 控制台中查看所选角色的权限。

  10. 选择创建复制配置

接下来会发生什么?

在您创建复制配置后:

  • Amazon S3 开始初始回填过程,在每个目标存储桶中创建副本表

  • 回填开始后,复制状态将更改为正在复制

  • 您可以在管理选项卡上监控复制进度

  • 初始复制时间取决于源表的大小

使用 AWS CLI 设置复制

此过程介绍如何使用 AWS CLI 配置复制。将账户 ID、区域和存储桶名称替换为实际值,并将所有目标存储桶添加到权限。

步骤 1:创建用于复制的 IAM 角色

首先,创建一个 Amazon S3 可以代入的 IAM 角色,用于复制您的表。

  1. 创建一个信任策略文档,该文档允许 S3 表类数据存储服务代入该角色。将其另存为 trust-policy.json

    { "Version": "2012-10-17" "Statement": [ { "Effect": "Allow", "Principal": { "Service": "replication.s3tables.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 创建 IAM 角色:

    aws iam create-role \ --role-name S3TablesReplicationRole \ --assume-role-policy-document file://trust-policy.json \ --description "Role for S3 Tables replication"
  3. 创建授予复制权限的权限策略。将其另存为 replication-permissions.json

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3tables:GetTable", "s3tables:GetTableMetadataLocation", "s3tables:GetTableMaintenanceConfiguration", "s3tables:GetTableData" ], "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-source/table/*" }, { "Effect": "Allow", "Action": [ "s3tables:ListTables" ], "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-source" }, { "Effect": "Allow", "Action": [ "s3tables:CreateTable", "s3tables:CreateNamespace" ], "Resource": "arn:aws:s3tables:us-east-2:444455556666:bucket/amzn-s3-demo-table-bucket-destination" }, { "Effect": "Allow", "Action": [ "s3tables:PutTableData", "s3tables:GetTableData", "s3tables:UpdateTableMetadataLocation", "s3tables:PutTableMaintenanceConfiguration" ], "Resource": "arn:aws:s3tables:us-east-2:444455556666:bucket/amzn-s3-demo-table-bucket-destination/table/*" } ] }
  4. 将权限策略附加到角色:

    aws iam put-role-policy \ --role-name S3TablesReplicationRole \ --policy-name S3TablesReplicationPermissions \ --policy-document file://replication-permissions.json
  5. (可选)如果使用了 KMS 加密,请将 KMS 权限添加到您的策略:

    { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey", "kms:Encrypt" ], "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID" }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1" ] }

(仅限跨账户)步骤 2:配置目标存储桶策略

如果要复制到其他 AWS 账户,则目标账户必须向源账户授予权限。

  1. 在目标账户中,为目标表存储桶创建一个存储桶策略。将其另存为 destination-bucket-policy.json

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/cross-account-test" }, "Action": [ "s3tables:PutTableData", "s3tables:GetTableData", "s3tables:UpdateTableMetadataLocation", "s3tables:PutTableMaintenanceConfiguration" ], "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-cross-account-destination/table/*" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:role/cross-account-test" }, "Action": [ "s3tables:CreateTable", "s3tables:CreateNamespace" ], "Resource": "arn:aws:s3tables:us-east-2:111122223333:bucket/amzn-s3-demo-table-bucket-cross-account-destination" } ] }
  2. 使用 S3 表类数据存储服务 API 应用策略:

    aws s3tables put-table-bucket-policy \ --table-bucket-arn arn:aws:s3tables:us-west-2:444455556666:bucket/amzn-s3-demo-table-bucket-cross-account-destination \ --policy file://destination-bucket-policy.json \ --profile destination-account
  3. 修改您的源 KMS 密钥以允许 S3 表类数据存储服务复制和维护:

    { "Version": "2012-10-17", "Id": "key-consolepolicy-3", "Statement": [ { "Sid": "allow replication to decrypt", "Effect": "Allow", "Principal": { "AWS": "replication_role_arn" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID" }, { "Sid": "allow maintenance", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-1:111122223333:key/SOURCE-KEY-ID" } ] }
  4. 同样,在目标 KMS 密钥策略中添加权限

    { "Version": "2012-10-17", "Id": "key-policy-3", "Statement": [ { "Sid": "allow maintenance", "Effect": "Allow", "Principal": { "Service": "maintenance.s3tables.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1" }, { "Sid": "allow replication to encrypt/decrypt", "Effect": "Allow", "Principal": { "AWS": "replication_role_arn" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-west-2:444455556666:key/DESTINATION-KEY-ID-1" } ]

步骤 3:创建复制配置

您可以使用 AWS CLI 在表存储桶级别或表级别创建复制配置。有关更多信息,请参阅以下流程。

使用此方法可复制存储桶中的所有表。

  1. 创建复制配置文件。将其另存为 bucket-replication-config.json

    例:同一个账户中的单个目标
    { "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole", "rules": [ { "destinations": [ { "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr" } ] } ] }
    例:跨区域的多个目标
    { "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole", "rules": [ { "destinations": [ { "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr" }, { "destinationTableBucketARN": "arn:aws:s3tables:eu-west-1:111122223333:bucket/amzn-s3-demo-table-bucket-eu" }, { "destinationTableBucketARN": "arn:aws:s3tables:ap-south-1:111122223333:bucket/amzn-s3-demo-table-bucket-apac" } ] } ] }
    例:跨账户复制
    { "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole", "rules": [ { "destinations": [ { "destinationTableBucketARN": "arn:aws:s3tables:us-east-1:444455556666:bucket/amzn-s3-demo-table-bucket-partner" } ] } ] }
  2. 应用存储桶级别的复制配置:

    aws s3tables put-table-bucket-replication \ --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket \ --configuration file://bucket-replication-config.json

    预期输出:

    { "versionToken": "3HL4kqtJl40Nr8X8gdRQBpUMLUo", "status": "Success" }

使用此方法可复制特定表或覆盖存储桶级别的复制。

  1. 创建复制配置文件。将其另存为 table-replication-config.json

    例:单个表复制
    { "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole", "rules": [ { "destinations": [ { "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-analytics-bucket" } ] } ] }
    例:包含多个目标的表
    { "role": "arn:aws:iam::111122223333:role/S3TablesReplicationRole", "rules": [ { "destinations": [ { "destinationTableBucketARN": "arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-table-bucket-dr" }, { "destinationTableBucketARN": "arn:aws:s3tables:eu-west-1:111122223333:bucket/amzn-s3-demo-table-bucket-eu" } ] } ] }
  2. 应用表级别的复制配置:

    aws s3tables put-table-replication \ --table-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket/table/amzn-s3-demo-table-bucket-sales-data \ --configuration file://table-replication-config.json

    预期输出:

    { "versionToken": "xT2LZkFZ0UuTC2h8XqtGLx2Ak6M", "status": "Success" }