

# 复制对象
<a name="batch-ops-copy-object"></a>

可以使用 Amazon S3 批量操作对 Amazon S3 对象执行大规模批量操作。批量操作**复制**操作会复制清单中指定的每个对象。可以将对象复制到相同 AWS 区域中的存储桶或不同区域中的存储桶。S3 分批操作支持 Amazon S3 所提供用于复制对象的大部分选项。这些选项包括设置对象元数据、设置权限以及更改对象的存储类。

可以使用**复制**操作来复制现有的未加密对象，并将其作为加密的对象写入到同一存储桶。有关更多信息，请参阅[使用 Amazon S3 分批操作加密对象](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)。

复制对象时，可以更改用于计算对象校验和的校验和算法。如果对象没有额外的已计算校验和，您还可以通过指定 Amazon S3 要使用的校验和算法来添加一个校验和。有关更多信息，请参阅 [在 Amazon S3 中检查对象完整性](checking-object-integrity.md)。

有关复制 Amazon S3 中的对象以及必需参数和可选参数的更多信息，请参阅本指南中的[复制、移动和重命名对象](copy-object.md)和《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)。

## 限制和局限性
<a name="batch-ops-copy-object-restrictions"></a>

当您使用批量操作**复制**操作时，以下限制和局限性适用：
+ 所有源对象必须位于一个存储桶中。
+ 所有目标对象必须位于一个存储桶中。
+ 您必须具有源存储桶的读取权限和目标存储桶的写入权限。
+ 复制的对象大小最多为 5 GB。
+ 如果您尝试将对象从 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 类复制到 S3 Standard 存储类，则必须先还原这些对象。有关更多信息，请参阅 [恢复已归档的对象](restoring-objects.md)。
+ 必须在目标区域（即您打算将对象复制到的区域）中创建批量操作**复制**任务。
+ 除了针对实体标签（ETag）的条件检查和具有客户提供的加密密钥的服务器端加密（SSE-C）之外，所有 `CopyObject` 选项都受支持。
+ 如果目标存储桶不受版本控制，您将覆盖任何具有相同键名称的对象。
+ 不必以对象在清单中出现的相同顺序复制这些对象。对于受版本控制的存储桶，如果保留当前或非当前版本顺序很重要，则首先复制所有非当前版本。然后，在第一个任务完成后，在后续任务中复制当前版本。
+ 不支持将对象复制到低冗余存储（RRS）类。
+ 单个批量操作复制作业可以支持包含多达 200 亿个对象的清单。

# 使用 S3 分批操作复制对象
<a name="batch-ops-examples-copy"></a>

可以使用 Amazon S3 批量操作对 Amazon S3 对象执行大规模批量操作。可以使用 S3 批量操作创建**复制** (`CopyObject`) 任务，以便在同一账户内复制对象或将对象复制到不同的目标账户。

以下示例说明了如何存储和使用位于不同账户中的清单。第一个示例说明了如何使用 Amazon S3 清单将清单报告发送到目标账户，以便在创建任务期间使用。第二个示例说明了如何在源账户或目标账户中使用逗号分隔值（CSV）清单。第三个示例说明了如何使用**复制**操作为现有对象启用 S3 存储桶密钥，而这些对象已使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密。

**Topics**
+ [使用清单报告跨 AWS 账户 复制对象](specify-batchjob-manifest-xaccount-inventory.md)
+ [使用 CSV 清单跨 AWS 账户 复制对象](specify-batchjob-manifest-xaccount-csv.md)
+ [使用批量操作为 SSE-KMS 启用 S3 存储桶密钥](batch-ops-copy-example-bucket-key.md)

# 使用清单报告跨 AWS 账户 复制对象
<a name="specify-batchjob-manifest-xaccount-inventory"></a>

可以使用 Amazon S3 批量操作对 Amazon S3 对象执行大规模批量操作。可以使用 S3 批量操作创建**复制** (`CopyObject`) 任务，以便在同一账户内复制对象或将对象复制到不同的目标账户。

可以使用 Amazon S3 清单创建清单报告，然后使用该报告创建要使用 S3 批量操作复制的对象列表（清单）。有关在源账户或目标账户中使用 CSV 清单的信息，请参阅 [使用 CSV 清单跨 AWS 账户 复制对象](specify-batchjob-manifest-xaccount-csv.md)。

Amazon S3 清单生成桶中的对象的清单。生成的列表将发布到输出文件。进行清点的桶称为源桶，其中存储清单报告文件的桶称为目标桶。

Amazon S3 清单报告可配置为传输到另一个 AWS 账户。如果这样做，则在目标账户中创建任务时，将支持 S3 批量操作读取清单报告。

有关 Amazon S3 清单源桶和目标桶的更多信息，请参阅 [源存储桶和目标存储桶](storage-inventory.md#storage-inventory-buckets)。

设置清单的最简单方法是使用 Amazon S3 控制台，不过您也可以使用 Amazon S3 REST API、AWS Command Line Interface (AWS CLI) 或 AWS SDK。

以下控制台过程包含用于设置 S3 分批操作任务的权限的概要步骤。在此过程中，您将对象从源账户复制到目标账户，并将清单报告存储在目标账户中。

**为由不同账户拥有的源桶和目标桶设置 Amazon S3 清单**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

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

1. 确定（或创建）用于存储清单报告的目标清单存储桶。在此过程中，*目标账户* 是同时拥有目标清单桶和对象要复制到的桶的账户。

1. 为源存储桶配置清单报告。有关如何使用控制台配置清单或如何加密清单列表文件的信息，请参阅[配置 Amazon S3 清单](configure-inventory.md)。

   配置清单报告时，请指定要将该列表存储在其中的目标存储桶。源桶的清单报告将发布到目标桶。在此过程中，*源账户* 是拥有源桶的账户。

   为输出格式选择 **CSV**。

   输入目标桶的信息时，请选择 **Buckets in another account（另一个账户中的桶）**。然后，输入目标清单桶的名称。或者，可以输入目标账户的账户 ID。

   在保存清单配置后，控制台会显示类似于以下内容的一条消息：

   Amazon S3 无法在目标桶上创建桶策略。要求目标桶拥有者添加以下桶策略，以允许 Amazon S3 在该桶中放置数据。

   然后，控制台会显示可用于目标桶的桶策略。

1. 复制显示在控制台上的目标桶策略。

1. 在目标账户中，将复制的桶策略添加到存储清单报告所在的目标清单桶。

1. 在目标账户中创建一个基于 S3 分批操作信任策略的角色。有关该信任策略的更多信息，请参阅[信任策略](batch-ops-iam-role-policies.md#batch-ops-iam-role-policies-trust)。

   有关创建角色的更多信息，请参阅《IAM 用户指南》**中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   输入角色的名称（以下示例角色使用名称 *`BatchOperationsDestinationRoleCOPY`*）。选择 **S3** 服务，然后选择 **S3 批量操作**使用案例，这会将信任策略应用于该角色。

   然后选择 **Create policy (创建策略)** 以将以下策略附加到该角色。要使用此策略，请将 *`user input placeholders`* 替换为您自己的信息。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsDestinationObjectCOPY",
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:PutObjectVersionAcl",
           "s3:PutObjectAcl",
           "s3:PutObjectVersionTagging",
           "s3:PutObjectTagging",
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
       }
     ]
   }
   ```

------

   该角色使用策略授予 `batchoperations.s3.amazonaws.com` 权限来读取目标桶中的清单。该角色还授予 `GET` 源对象存储桶中对象、访问控制列表（ACL）、标签和版本的权限。并且，该角色还授予将对象、ACL、标签和版本 `PUT` 到目标对象存储桶中的权限。

1. 在源账户中，为源存储桶创建存储桶策略，该策略向您在上一步中创建的角色授予 `GET` 源存储桶中对象、ACL、标签和版本的权限。此步骤允许 S3 分批操作通过可信角色获取源桶中的对象。

   以下是源账户的桶策略的示例。要使用此策略，请将 *`user input placeholders`* 替换为您自己的信息。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowBatchOperationsSourceObjectCOPY",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
               },
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:GetObjectAcl",
                   "s3:GetObjectTagging",
                   "s3:GetObjectVersionAcl",
                   "s3:GetObjectVersionTagging"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
           }
       ]
   }
   ```

------

1. 在清单报告可用后，在目标账户中创建一个 S3 批量操作**复制** (`CopyObject`) 任务，并从目标清单存储桶中选择清单报告。您需要您在目标账户中创建的 IAM 角色的 ARN。

   有关创建任务的一般信息，请参阅 [创建 S3 批量操作任务](batch-ops-create-job.md)。

   有关使用控制台创建任务的信息，请参阅[创建 S3 批量操作任务](batch-ops-create-job.md)。

# 使用 CSV 清单跨 AWS 账户 复制对象
<a name="specify-batchjob-manifest-xaccount-csv"></a>

可以使用 Amazon S3 批量操作对 Amazon S3 对象执行大规模批量操作。可以使用 S3 批量操作创建**复制** (`CopyObject`) 任务，以便在同一账户内复制对象或将对象复制到不同的目标账户。

可以使用存储在源账户中的 CSV 清单，通过 S3 批量操作跨 AWS 账户复制对象。要使用 S3 清单报告作为清单，请参阅[使用清单报告跨 AWS 账户 复制对象](specify-batchjob-manifest-xaccount-inventory.md)。

有关清单文件的 CSV 格式的示例，请参阅[创建清单文件](batch-ops-create-job.md#create-manifest-file)。

以下过程显示了当使用 S3 批量操作任务通过存储在源账户中的 CSV 清单文件将对象从源账户复制到目标账户时，如何设置权限。

**使用 CSV 清单跨 AWS 账户复制对象**

1. 在目标账户中创建一个基于 S3 批量操作信任策略的 AWS Identity and Access Management（IAM）角色。在此过程中，*目标账户*是对象要复制到的账户。

   有关信任策略的更多信息，请参阅[信任策略](batch-ops-iam-role-policies.md#batch-ops-iam-role-policies-trust)。

   有关创建角色的更多信息，请参阅《IAM 用户指南》**中的[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

   如果您使用控制台来创建角色，请输入角色的名称（以下示例角色使用名称 `BatchOperationsDestinationRoleCOPY`）。选择 **S3** 服务，然后选择 **S3 批量操作**使用案例，这会将信任策略应用于该角色。

   然后选择 **Create policy (创建策略)** 以将以下策略附加到该角色。要使用此策略，请将 *`user input placeholders`* 替换为您自己的信息。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsDestinationObjectCOPY",
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:PutObjectVersionAcl",
           "s3:PutObjectAcl",
           "s3:PutObjectVersionTagging",
           "s3:PutObjectTagging",
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": [
           "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
           "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
         ]
       }
     ]
   }
   ```

------

   使用策略，该角色将授予 `batchoperations.s3.amazonaws.com` 权限以读取源清单存储桶中的清单。该角色授予对源对象存储桶中的 `GET` 对象、访问控制列表（ACL）、标签和版本的权限。它还授予对目标对象存储桶中的 `PUT` 对象、ACL、标签和版本的权限。

1. 在源账户中，为包含清单的存储桶创建存储桶策略，来向您在上一步中创建的角色授予对源清单存储桶中 `GET` 对象和版本的权限。

   此步骤可让 S3 批量操作通过使用可信角色来读取清单。将存储桶策略应用于包含清单的存储桶。

   以下是要应用于源清单存储桶的存储桶策略的示例。要使用此策略，请将 *`user input placeholders`* 替换为您自己的信息。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsSourceManifestRead",
         "Effect": "Allow",
         "Principal": {
           "AWS": [
             "arn:aws:iam::111122223333:user/ConsoleUserCreatingJob",
             "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
           ]
         },
         "Action": [
           "s3:GetObject",
           "s3:GetObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/*"
       }
     ]
   }
   ```

------

   此策略还授予权限来允许要在目标账户中创建任务的控制台用户通过相同的存储桶策略具有源清单存储桶中的相同权限。

1. 在源账户中，为源存储桶创建存储桶策略，该策略向您创建的角色授予对源对象存储桶中 `GET` 对象、ACL、标签和版本的权限。然后，S3 分批操作可以通过可信角色获取源存储桶中的对象。

   以下是包含源对象的存储桶的存储桶策略示例。要使用此策略，请将 *`user input placeholders`* 替换为您自己的信息。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowBatchOperationsSourceObjectCOPY",
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:role/BatchOperationsDestinationRoleCOPY"
         },
         "Action": [
           "s3:GetObject",
           "s3:GetObjectVersion",
           "s3:GetObjectAcl",
           "s3:GetObjectTagging",
           "s3:GetObjectVersionAcl",
           "s3:GetObjectVersionTagging"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
       }
     ]
   }
   ```

------

1. 在目标账户中创建 S3 分批操作任务。您需要您在目标账户中创建的角色的 Amazon Resource Name (ARN)。有关创建作业的更多信息，请参阅[创建 S3 批量操作任务](batch-ops-create-job.md)。

# 使用批量操作为 SSE-KMS 启用 S3 存储桶密钥
<a name="batch-ops-copy-example-bucket-key"></a>

S3 存储桶密钥通过减少从 Amazon S3 到 AWS KMS 的请求流量，降低了具有 AWS Key Management Service（AWS KMS）的服务器端加密（SSE-KMS）的成本。有关更多信息，请参阅[使用 Amazon S3 存储桶密钥降低 SSE-KMS 的成本](bucket-key.md)和[将存储桶配置为将 S3 存储桶密钥与 SSE-KMS 结合使用于新对象](configuring-bucket-key.md)。当您使用 REST API、AWS SDK 或 AWS CLI 执行 `CopyObject` 操作时，可以通过添加带有 `true` 或 `false` 值的 `x-amz-server-side-encryption-bucket-key-enabled` 请求标头，在对象级别启用或禁用 S3 存储桶密钥。

当您使用 `CopyObject` 操作为对象配置 S3 存储桶密钥时，Amazon S3 仅更新该对象的设置。目标存储桶的 S3 存储桶密钥设置不会发生变化。如果您向启用了 S3 存储桶密钥的存储桶提交对于 AWS KMS 加密对象的 `CopyObject` 请求，对象级操作将自动使用 S3 存储桶密钥，则除非您在请求标头中禁用这些密钥。如果您未为对象指定 S3 存储桶密钥，则 Amazon S3 会将目标存储桶的 S3 存储桶密钥设置应用于该对象。

要加密现有 Amazon S3 对象，可以使用 S3 批量操作。您可以使用**批量操作复制操作**复制现有的未加密对象，并将其作为加密对象写回同一存储桶。有关更多信息，请参阅 AWS 存储博客上的 [Encrypting objects with Amazon S3 Batch Operations](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)。

在以下示例中，使用批量操作**复制**操作在现有对象上启用 S3 存储桶密钥。有关更多信息，请参阅 [在对象级别配置 S3 存储桶密钥](configuring-bucket-key-object.md)。

**Topics**
+ [使用 S3 批量操作通过已启用的 S3 存储桶密钥加密对象的注意事项](#bucket-key-ex-things-to-note)
+ [先决条件](#bucket-key-ex-prerequisites)
+ [第 1 步：使用 Amazon S3 清单获取对象列表](#bucket-key-ex-get-list-of-objects)
+ [第 2 步：使用 S3 Select 筛选对象列表](#bucket-key-ex-filter-object-list-with-s3-select)
+ [第 3 步：设置并运行 S3 分批操作任务](#bucket-key-ex-setup-and-run-job)

## 使用 S3 批量操作通过已启用的 S3 存储桶密钥加密对象的注意事项
<a name="bucket-key-ex-things-to-note"></a>

使用 S3 批量操作通过已启用的 S3 存储桶密钥加密对象时，请考虑以下问题：
+ 除了与 S3 批量操作代表您执行的操作关联的任何费用之外（包括数据传输、请求等费用），您还需要为 S3 批量操作任务、对象和请求付费。有关更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing)。
+ 如果您使用受版本控制的桶，则执行的每个 S3 分批操作任务都会创建对象的新加密版本。另外，无需配置 S3 桶密钥即可维护以前的版本。要删除旧版本，请为非当前版本设置 S3 生命周期过期策略，如 [生命周期配置元素](intro-lifecycle-rules.md)。
+ 复制操作会创建具有新创建日期的新对象，这会影响生命周期操作（如归档）。如果您复制桶中的所有对象，所有新副本均具有相同或相似的创建日期。要进一步识别这些对象并为各种数据子集创建不同的生命周期规则，请考虑使用对象标签。

## 先决条件
<a name="bucket-key-ex-prerequisites"></a>

在将对象配置为使用 S3 存储桶密钥之前，请查看[启用 S3 存储桶密钥之前需要注意的更改](bucket-key.md#bucket-key-changes)。

要使用此示例，您必须具有 AWS 账户和至少一个 S3 存储桶来存放工作文件和加密的结果。您可能还会发现许多有用的现有 S3 分批操作文档，包括以下主题：
+ [S3 批量操作基础知识](batch-ops.md#batch-ops-basics)
+ [创建 S3 批量操作任务](batch-ops-create-job.md)
+ [S3 分批操作支持的操作](batch-ops-operations.md)
+ [管理 S3 分批操作任务](batch-ops-managing-jobs.md)

## 第 1 步：使用 Amazon S3 清单获取对象列表
<a name="bucket-key-ex-get-list-of-objects"></a>

要开始操作，请确定包含要加密对象的 S3 Bucket，并获取其内容列表。Amazon S3 清单报告是完成此操作的最方便且最经济的方式。报告提供存储桶中对象的列表及其关联的元数据。在此步骤中，源存储桶是进行清点的存储桶，目标存储桶是您存储清单报告文件的存储桶。有关 Amazon S3 清单源桶和目标桶的更多信息，请参阅 [使用 S3 清单对数据进行编目和分析](storage-inventory.md)。

设置清单最简单的方法是使用 AWS 管理控制台。但您也可以使用 REST API、AWS Command Line Interface (AWS CLI) 或 AWS 开发工具包。执行以下步骤之前，请务必登录控制台，并通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。如果遇到权限拒绝错误，请在目标桶中添加桶策略。有关更多信息，请参阅 [向 S3 清单和 S3 分析功能授予权限](example-bucket-policies.md#example-bucket-policies-s3-inventory-1)。

**使用 S3 清单获取对象列表**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**，然后选择包含要加密的对象的存储桶。

1. 在 **Management (管理)** 选项卡导航至 **Inventory configurations (清单配置)** 部分，然后选择 **Create inventory configuration (创建清单配置)**。

1. 为您的新清单命名，输入目标 S3 Bucket 的名称，并可选择为 Amazon S3 创建目标前缀，以便在该桶中分配对象。

1. 为 **Output format (输出格式)** 选择 **CSV**。

1. （可选）在**其他字段 – *可选***部分中，选择**加密**以及您感兴趣的任何其他报告字段。将报告发送频率设置为 **Daily（每天）**，以便更快将第一个报告发送到您的桶。

1. 选择 **Create (创建)** 以保存您的配置。

Amazon S3 可能需要长达 48 小时才能交付第一个报告，所以当第一个报告到达时请予以查看。收到第一个报告后，请转入下一步来筛选 S3 清单报告的内容。如果您不再希望接收此桶的清单报告，请删除您的 S3 清单配置。否则，Amazon S3 会继续按每日或每周计划提供报告。

清单列表并非所有对象的单个时间点视图。清单列表是桶项的滚动快照，最终是一致的（例如，列表可能不包含最近添加或删除的对象）。当您使用静态对象或两天乃至更多天之前创建的对象集时，将 S3 清单和 S3 分批操作结合使用效果最佳。要处理最新数据，请使用 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)（`GET` 存储桶）API 操作来手动构建对象列表。如有需要，请在接下来的几天内重复该过程，或直到清单报告显示所有对象的理想状态。

## 第 2 步：使用 S3 Select 筛选对象列表
<a name="bucket-key-ex-filter-object-list-with-s3-select"></a>

收到 S3 清单报告后，可以筛选报告的内容，以仅列出未使用已启用的 S3 存储桶密钥进行加密的对象。如果您希望使用已启用的 S3 存储桶密钥来加密存储桶的所有对象，则可以忽略此步骤。但是，在此阶段筛选 S3 清单报告，则对于先前使用已启用的 S3 存储桶密钥加密的对象，可以节省对其重新加密的时间和费用。

尽管以下步骤介绍的是如何使用 [Amazon S3 Select](https://aws.amazon.com/blogs/aws/s3-glacier-select/) 进行筛选，但也可以使用 [Amazon Athena](https://aws.amazon.com/athena)。要决定使用哪个工具，请查看 S3 清单报告的 `manifest.json` 文件。此文件列出了与该报告关联的数据文件的数量。如果数量较大，请使用 Amazon Athena，因为其运行在多个 S3 对象之间，而 S3 Select 一次仅适用一个对象。有关将 Amazon S3 和 Athena 结合使用的更多信息，请参阅[使用 Amazon Athena 查询 Amazon S3 清单](storage-inventory-athena-query.md)以及 AWS 存储博客文章 [Encrypting objects with Amazon S3 Batch Operations](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations) 中的“Using Athena”。

**使用 S3 Select 筛选 S3 清单报告**

1. 打开清单报告中的 `manifest.json` 文件，然后查看 JSON 中的 `fileSchema` 部分。这将通知您的数据运行查询。

   以下 JSON 是一个示例 `manifest.json` 文件，用于查看已启用版本控制的桶上的 CSV 格式清单。根据您配置库存报告的方式，您的清单可能会有所不同。

   ```
     {
       "sourceBucket": "batchoperationsdemo",
       "destinationBucket": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
       "version": "2021-05-22",
       "creationTimestamp": "1558656000000",
       "fileFormat": "CSV",
       "fileSchema": "Bucket, Key, VersionId, IsLatest, IsDeleteMarker, BucketKeyStatus",
       "files": [
         {
           "key": "demoinv/batchoperationsdemo/DemoInventory/data/009a40e4-f053-4c16-8c75-6100f8892202.csv.gz",
           "size": 72691,
           "MD5checksum": "c24c831717a099f0ebe4a9d1c5d3935c"
         }
       ]
     }
   ```

   如果桶未激活版本控制，或者您选择运行最新版本报告，则 `fileSchema` 是 `Bucket`、`Key` 和 `BucketKeyStatus`。

   如果*激活了*版本控制，根据您设置清单报告的方式，`fileSchema` 可能包括：`Bucket`、`Key`、`VersionId`、`IsLatest`、`IsDeleteMarker`、`BucketKeyStatus`。因此，当您运行查询时，请注意第 1、2、3 和 6 栏。

   除了搜索依据字段（即 `BucketKeyStatus`）外，S3 批量操作还需要输入桶、密钥和版本 ID 以执行任务。您不需要 `VersionID` 字段，但在对受版本控制的存储桶进行操作时，指定 `VersionID` 字段很有用。有关更多信息，请参阅 [使用启用版本控制的存储桶中的对象](manage-objects-versioned-bucket.md)。

1. 找到清单报告的数据文件。`manifest.json` 对象列出了**文件夹**下的数据文件。

1. 在 S3 控制台中找到并选择数据文件后，选择 **Actions (操作)**，然后选择 **Query with S3 Select (使用 S3 Select 进行查询)**。

1. 保留预设 **CSV**、**逗号** 和 **GZIP** 字段，然后选择 **Next (下一步)**。

1. 如需在继续操作之前检查清单报告格式，请选择 **Show file preview (显示文件预览)**。

1. 在 SQL 表达式字段中输入要引用的列，然后选择 **Run SQL**（运行 SQL）。以下表达式为未配置 S3 桶密钥的所有对象返回列 1-3。

   `select s._1, s._2, s._3 from s3object s where s._6 = 'DISABLED'`

   以下是示例结果。

   ```
         batchoperationsdemo,0100059%7Ethumb.jpg,lsrtIxksLu0R0ZkYPL.LhgD5caTYn6vu
         batchoperationsdemo,0100074%7Ethumb.jpg,sd2M60g6Fdazoi6D5kNARIE7KzUibmHR
         batchoperationsdemo,0100075%7Ethumb.jpg,TLYESLnl1mXD5c4BwiOIinqFrktddkoL
         batchoperationsdemo,0200147%7Ethumb.jpg,amufzfMi_fEw0Rs99rxR_HrDFlE.l3Y0
         batchoperationsdemo,0301420%7Ethumb.jpg,9qGU2SEscL.C.c_sK89trmXYIwooABSh
         batchoperationsdemo,0401524%7Ethumb.jpg,ORnEWNuB1QhHrrYAGFsZhbyvEYJ3DUor
         batchoperationsdemo,200907200065HQ%7Ethumb.jpg,d8LgvIVjbDR5mUVwW6pu9ahTfReyn5V4
         batchoperationsdemo,200907200076HQ%7Ethumb.jpg,XUT25d7.gK40u_GmnupdaZg3BVx2jN40
         batchoperationsdemo,201103190002HQ%7Ethumb.jpg,z.2sVRh0myqVi0BuIrngWlsRPQdb7qOS
   ```

1. 下载结果，将其保存为 CSV 格式，然后将其作为 S3 分批操作任务的对象列表上传至 Amazon S3。

1. 如果您有多个清单文件，也请对它们运行 **Query with S3 Select (使用 S3 Select 进行查询)**。根据结果的大小，您可以合并列表并运行单个 S3 分批操作任务，或将每个列表作为单独任务运行。要决定要运行的任务数量，请考虑运行每个 S3 批量操作任务的[价格](https://aws.amazon.com/s3/pricing/)。

## 第 3 步：设置并运行 S3 分批操作任务
<a name="bucket-key-ex-setup-and-run-job"></a>

现在，您有了 S3 对象的筛选 CSV 列表，可以开始 S3 批量操作任务，以使用已启用的 S3 存储桶密钥来加密对象。

*任务*指提供的对象列表（清单）、执行的操作以及指定的参数的统称。使用已启用的 S3 存储桶密钥加密此对象集的最简单方法是使用**复制**操作，并指定与清单中列出的对象相同的目标前缀。在不受版本控制的存储桶中，此操作会覆盖现有对象。在开启了版本控制的存储桶中，此操作将创建对象的较新的加密版本。

作为复制对象的一部分，指定 Amazon S3 应使用 SSE-KMS 加密来为对象进行加密。此任务会复制这些对象，因此，所有对象在完成时都显示更新后的创建日期，无论最初是何时将其添加到 Amazon S3 的。另外，在 S3 分批操作任务中指定对象集的其他属性，包括对象标记和存储类。

**Topics**
+ [设置 IAM 策略](#bucket-key-ex-set-up-iam-policy)
+ [设置分批操作 IAM 角色](#bucket-key-ex-set-up-iam-role)
+ [为现有存储桶启用 S3 存储桶密钥](#bucket-key-ex-enable-s3-bucket-key-on-a-bucket)
+ [创建分批操作任务](#bucket-key-ex-create-job)
+ [运行您的分批操作任务](#bucket-key-ex-run-job)

### 设置 IAM 策略
<a name="bucket-key-ex-set-up-iam-policy"></a>

1. 通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在左侧导航窗格中，选择**策略**，然后选择**创建策略**。

1. 选择 **JSON** 选项卡。选择 **Edit Policy (编辑策略)**，然后添加出现在以下代码块中的示例 IAM 策略。

   将策略示例复制到 [IAM 控制台](https://console.aws.amazon.com/iam/)后，请替换以下内容：

   1. 将 `amzn-s3-demo-source-bucket` 替换为要从中复制对象的源存储桶的名称。

   1. 将 `amzn-s3-demo-destination-bucket` 替换为要向其中复制对象的目标存储桶的名称。

   1. 将 `amzn-s3-demo-manifest-bucket/manifest-key` 替换为清单对象的名称。

   1. 将 `amzn-s3-demo-completion-report-bucket` 替换为要用于保存完成报告的存储桶的名称。

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

****  

   ```
     {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Sid": "CopyObjectsToEncrypt",
           "Effect": "Allow",
           "Action": [
             "s3:PutObject",
             "s3:PutObjectTagging",
             "s3:PutObjectAcl",
             "s3:PutObjectVersionTagging",
             "s3:PutObjectVersionAcl",
             "s3:GetObject",
             "s3:GetObjectAcl",
             "s3:GetObjectTagging",
             "s3:GetObjectVersion",
             "s3:GetObjectVersionAcl",
             "s3:GetObjectVersionTagging"
           ],
           "Resource": [
             "arn:aws:s3:::amzn-s3-demo-source-bucket/*",
             "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
           ]
         },
         {
           "Sid": "ReadManifest",
           "Effect": "Allow",
           "Action": [
             "s3:GetObject",
             "s3:GetObjectVersion"
           ],
           "Resource": "arn:aws:s3:::amzn-s3-demo-manifest-bucket/manifest-key"
         },
         {
           "Sid": "WriteReport",
           "Effect": "Allow",
           "Action": [
             "s3:PutObject"
           ],
           "Resource": "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/*"
         }
       ]
     }
   ```

------

1. 选择 **Next: Tags (下一步：标签)**。

1. 添加您想要的所有标签（可选），然后选择 **Next: Review (下一步：审核)**。

1. 添加策略名称，可添加描述，然后选择 **Create Policy (创建策略)**。

1. 选择 **Review policy (查看策略)** 和 **Save changes (保存更改)**。

1. 您的 S3 分批操作策略现已完成，控制台会将您返回到 IAM **Policies (策略)** 页面。筛选策略名称，选择策略名称左侧的按钮，选择 **Policy actions (策略操作)**，然后选择 **Attach (附加)**。

   如需将新创建的策略附加到 IAM 角色，请在账户中选择相应的用户、组或角色，然后选择 **Attach policy (附加策略)**。系统会带您返回 IAM 控制台。

### 设置分批操作 IAM 角色
<a name="bucket-key-ex-set-up-iam-role"></a>

1. 在 [IAM 控制台](https://console.aws.amazon.com/iam/)的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 选择 **AWS 服务**、**S3** 和 **S3 批量操作**。然后选择 **Next: Permissions (下一步：权限)**。

1. 输入您刚刚创建的 IAM **策略**的名称。根据出现的策略名称选中相应名称，然后选择 **Next: Tags (下一步：标签)**。

1. （可选）为本次练习添加标签或将密钥和值字段保留为空。选择 **Next: Review (下一步：审核)**。

1. 输入角色名称，然后接受默认说明或添加您自己的说明。选择 **Create role (创建角色)**。

1. 确保创建任务的用户具有以下示例中的权限。

   将 `account-id` 替换为您的 AWS 账户 ID，并将 `IAM-role-name` 替换为您计划应用于稍后将在批量操作任务创建步骤中创建的 IAM 角色的名称。有关更多信息，请参阅 [授予批处理操作的权限](batch-ops-iam-role-policies.md)。

   ```
               {
               "Sid": "AddIamPermissions",
               "Effect": "Allow",
               "Action": [
               "iam:GetRole",
               "iam:PassRole"
               ],
               "Resource": "arn:aws:iam::account-id:role/IAM-role-name"
               }
   ```

### 为现有存储桶启用 S3 存储桶密钥
<a name="bucket-key-ex-enable-s3-bucket-key-on-a-bucket"></a>

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在**桶**列表中，选择要为其启用 S3 桶密钥的桶。

1. 选择 **Properties (属性)**。

1. 在 **Default encryption (默认加密)** 下，请选择 **Edit (编辑)**。

1. 在**加密类型**下，您可以在 **Amazon S3 托管式密钥（SSE-S3）**和 **AWS Key Management Service 密钥（SSE-KMS）**之间进行选择。

1. 如果您选择了 **AWS Key Management Service 密钥（SSE-KMS）**，则在 **AWS KMS key**下，您可以通过以下选项之一指定 AWS KMS 密钥。
   + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 AWS KMS 密钥中进行选择**。从可用密钥的列表中，选择与桶位于同一区域的对称加密 KMS 密钥。AWS 托管式密钥（`aws/s3`）和您的客户自主管理型密钥都显示在列表中。
   + 要输入 KMS 密钥 ARN，请选择**输入 AWS KMS 密钥 ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
   + 要在 AWS KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

1. 在 **Bucket Key（桶密钥）**中，选择 **Enable（启用）**，然后选择 **Save changes（保存更改）**。

现在，S3 存储桶密钥已在存储桶级别启用，默认情况下，上传、修改或复制到此存储桶中的对象将继承此加密配置。这包括使用 Amazon S3 批量操作复制的对象。

### 创建分批操作任务
<a name="bucket-key-ex-create-job"></a>

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在导航窗格中，选择 **Batch Operations (分批操作)**，然后选择 **Create Job (创建任务)**。

1. 选择您存储对象的 **Region (区域)**，然后选择 **CSV** 作为清单类型。

1. 输入路径或导航至您之前从 S3 Select（或 Athena）结果创建的 CSV 清单文件。如果您的清单包含版本 ID，请选中该框。选择 **Next (下一步)**。

1. 选择 **Copy** 操作，然后选择复制目标桶。您可以保持禁用服务器端加密。只要桶目标启用了 S3 桶密钥，复制操作将在目标桶上应用 S3 桶密钥。

1. （可选）根据需要选择存储类和其他参数。您在此步骤中指定的参数将应用于清单中列出的对象执行的所有操作。选择**下一步**。

1. 要配置服务器端加密，请执行以下步骤：

   1. 在**服务器端加密**下，选择以下选项之一：
      + 要在将对象存储在 Amazon S3 中时保留适用于对象原定设置服务器端加密的桶设置，请选择**不要指定加密密钥**。只要桶目标启用了 S3 桶密钥，复制操作就将在目标桶上应用 S3 桶密钥。
**注意**  
如果指定的目标的桶策略要求在将对象存储到 Amazon S3 之前对其进行加密，则必须指定加密密钥。否则，将对象复制到目标将失败。
      + 要在将对象存储到 Amazon S3 之前对其进行加密，请选择**指定加密密钥**。

   1. 在**加密设置**下，如果您选择**指定加密密钥**，则必须选择**使用用于原定设置加密的目标桶设置**或**覆盖用于原定设置加密的目标桶设置**。

   1. 如果您选择**覆盖用于原定设置加密的目标桶设置**，则必须配置以下加密设置。

      1. 在**加密类型**下，您必须选择 **Amazon S3 托管式密钥（SSE-S3）**或 **AWS Key Management Service 密钥（SSE-KMS）**。SSE-S3 使用最强的数据块密码之一 [即 256 位高级加密标准（AES-256）] 来加密每个对象。SSE-KMS 为您提供了对密钥的更多控制。有关更多信息，请参阅[使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）](UsingServerSideEncryption.md)和[使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

      1. 如果您选择 **AWS Key Management Service 密钥（SSE-KMS）**，则在 **AWS KMS key**下，您可以通过以下选项之一指定 AWS KMS key。
         + 要从可用 KMS 密钥列表中进行选择，请选择**从您的 AWS KMS keys 中进行选择**，然后选择与桶位于同一区域的对称加密 KMS 密钥。AWS 托管式密钥（`aws/s3`）和您的客户自主管理型密钥都显示在列表中。
         + 要输入 KMS 密钥 ARN，请选择**输入 AWS KMS 密钥 ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
         + 要在 AWS KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

      1. 在 **Bucket Key（存储桶密钥）**下，请选择 **Enable（启用）**。复制操作将在目标桶应用 S3 桶密钥。

1. 提供任务说明（或保留默认值），设置其优先级，选择报告类型，然后指定 **Path to completion report destination (完成报告目标的路径)**。

1. 在 **Permissions (权限)** 部分，请确保选择您之前定义的分批操作 IAM 角色。选择 **Next (下一步)**。

1. 在 **Review (审核)** 中验证设置。如果需要进行更改，请选择 **Previous (上一步)**。确认分批操作设置后，选择 **Create job (创建任务)**。

   有关更多信息，请参阅 [创建 S3 批量操作任务](batch-ops-create-job.md)。

### 运行您的分批操作任务
<a name="bucket-key-ex-run-job"></a>

安装向导将自动将您返回 Amazon S3 控制台的 S3 分批操作部分。随着 S3 开始此过程，您的新任务将从 **New (新建)** 状态变为 **Preparing (准备中)** 状态。在 Preparing (准备中) 状态下，S3 会读取任务清单，检查是否存在错误，并计算对象数量。

1. 在 Amazon S3 控制台中选择刷新按钮以检查进度。根据清单的大小，读取可能需要几分钟或几小时。

1. S3 读取任务清单后，任务将转移至 **Awaiting your confirmation (待确认)** 状态。选择任务 ID 左侧的选项按钮，然后选择 **Run job (运行任务)**。

1. 检查任务设置，然后选择右下角的 **Run job (运行任务)**。

   任务开始运行后，您可以选择刷新按钮通过控制台控制面板视图或选择特定任务来检查进度。

1. 任务完成后，您可以查看 **Successful (成功)** 和 **Failed (失败)** 对象数量以确认所有任务均按预期执行。如果您启用了任务报告，请检查任务报告，了解失败操作的确切原因。

   还可以使用 AWS CLI、AWS SDK 或 Amazon S3 REST API 来执行这些步骤。有关追踪任务状态和完成报告的更多信息，请参阅 [跟踪任务状态和完成报告](batch-ops-job-status.md)。

有关说明使用 AWS CLI 和 适用于 Java 的 AWS SDK 对标签进行复制操作的示例，请参阅 [使用用于标记的任务标签创建分批操作任务](batch-ops-tags-create.md)。