

# 在 Amazon S3 中检查静态数据的对象完整性
<a name="checking-object-integrity-at-rest"></a>

如果您需要验证存储在 Amazon S3 中的数据集的内容，S3 批量操作[计算校验和](https://docs.amazonaws.cn//AmazonS3/latest/userguide/batch-ops-compute-checksums.html)操作会计算静态对象的完整对象或复合校验和。**计算校验和**操作使用批量操作来异步计算一组对象的校验和值，并自动生成合并的完整性报告，而无需创建数据的新副本，也无需还原或下载任何数据。

使用**计算校验和**操作，可以通过单个任务请求高效地验证数十亿个对象。对于每个**计算校验和**任务请求，S3 都会计算校验和值，并将其包含在自动生成的完整性报告（也称为完成报告）中。然后，可以使用此完成报告来验证数据集的完整性。

**计算校验和**操作适用于存储在 S3 中的任何对象，无论存储类别或对象大小如何。无论您是需要验证对象以作为数据保留最佳实践，还是需要满足合规性要求，**计算校验和**操作都可以通过执行静态校验和计算，来降低数据验证所需的成本、时间和精力。有关**计算校验和**定价的信息，请参阅 [Amazon S3 定价](https://www.amazonaws.cn/s3/pricing/)上的**管理与见解**选项卡。

然后，可以使用所生成的完成报告的输出来与存储在数据库中的校验和值进行比较，以验证数据集在一段时间内是否保持完好无损。这种方法有助于您保持端到端的数据完整性，以满足业务和合规性需要。例如，可以使用**计算校验和**操作来提交 S3 Glacier 存储类别中存储的一组对象，以便进行年度安全审计。此外，一系列支持的校验和算法使您能够与应用程序中使用的算法保持连续性。

## 使用支持的校验和算法
<a name="using-additional-checksums-rest"></a>

对于静态数据，可以使用任何支持的校验和算法来计算校验和：
+ CRC-64/NVME (`CRC64NVME`)：仅支持完整对象校验和类型。
+ CRC-32 (`CRC32`)：同时支持完整对象和复合校验和类型。
+ CRC-32C (`CRC32C`)：同时支持完整对象和复合校验和类型。
+ SHA-1 (`SHA1`)：同时支持完整对象和复合校验和类型。
+ SHA-256 (`SHA256`)：同时支持完整对象和复合校验和类型。
+ MD5 (`MD5`)：同时支持完整对象和复合校验和类型。

## 使用**计算校验和**
<a name="Compute-checksums"></a>

对于存储在 Amazon S3 中的对象，可以将**计算校验和**操作与 S3 批量操作结合使用，以检查存储的静态数据的内容。可以使用 Amazon S3 控制台、Amazon Command Line Interface（Amazon CLI）、REST API 或 Amazon SDK [创建 Compute checksum 批量操作任务](https://docs.amazonaws.cn/AmazonS3/latest/userguide/batch-ops-create-job.html)。**计算校验和**任务完成后，您将收到完成报告。有关如何使用完成报告的更多信息，请参阅[跟踪任务状态和完成报告](https://docs.amazonaws.cn/AmazonS3/latest/userguide/batch-ops-job-status.html)。

在创建**计算校验和**任务之前，必须创建 S3 批量操作 Amazon Identity and Access Management（IAM）角色来向 Amazon S3 授予代表您执行操作的权限。您需要授予读取清单文件和向 S3 存储桶写入完成报告的权限。有关更多信息，请参阅 [计算校验和](batch-ops-compute-checksums.md)。

### 使用 S3 控制台
<a name="Compute-checksum-console"></a>

**使用**计算校验和**操作**

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

1. 在页面顶部的导航栏中，选择当前所显示 Amazon Web Services 区域的名称。接下来，选择要在其中创建任务的区域。
**注意**  
对于复制操作，必须在目标存储桶所在的同一区域中创建任务。对于所有其它操作，必须在与清单中的对象相同的区域中创建任务。

1. 在 Amazon S3 控制台的左侧导航窗格中选择**批量操作**。

1. 请选择**创建任务**。

1. 查看要在其中创建作业的 Amazon Web Services 区域。
**注意**  
对于复制操作，必须在目标存储桶所在的同一区域中创建任务。对于所有其它操作，必须在与清单中的对象相同的区域中创建任务。

1. 在 **Manifest format (清单格式)** 下，请选择要使用的清单对象的类型。
   + 如果您选择 **S3 清单报告（manifest.json）**，请输入指向 `manifest.json` 对象的路径；（可选）如果您要使用特定的对象版本，则输入**清单对象版本 ID**。或者，可以选择**浏览 S3** 并选择清单 JSON 文件，该文件会自动填充所有清单对象字段条目。
   + 如果您选择 **CSV**，请选择清单位置类型，然后输入指向 CSV 格式的清单对象的路径，或选择**浏览 S3** 来选择清单对象。清单对象必须遵循控制台中描述的格式。如果要使用特定版本的清单对象，也可以指定对象版本 ID。
   + 如果您选择**使用 S3 复制配置创建清单**，则将使用复制配置生成对象列表，并保存到您选择的目标（可选）。使用复制配置生成清单时，唯一可用的操作是**复制**。

1. 选择**下一步**。

1. 在**操作**下，选择**计算校验和**操作，以便对清单中列出的所有对象计算校验和。为您的任务选择**校验和类型**和**校验和函数**。然后选择**下一步**。

1. 填写**配置其它选项**的信息，然后选择**下一步**。

1. 在**配置其它选项**页面上，填写**计算校验和**任务的信息。
**注意**  
在**完成报告**下，请务必确认此确认声明。此确认声明确认您了解完成报告包含校验和值，这些值用于验证存储在 Amazon S3 中的数据的完整性。因此，分享完成报告时应务必谨慎。另外，请注意，如果您正在创建计算校验和请求并指定外部账户拥有者的存储桶位置来存储完成报告，请务必指定外部存储桶拥有者的 Amazon Web Services 账户 ID。

1. 选择**下一步**。

1. 在**审核**页面上，审核并确认设置。

1. （可选）如果需要进行更改，请选择**上一步**以返回上一页，或者选择**编辑**以更新特定的步骤。

1. 确认更改后，选择**创建任务**。

**列出并监控所有**计算校验和**请求的进度**

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

1. 在左侧导航窗格中，选择**批量操作**。

1. 在**批量操作**页面上，可以查看任务详细信息，例如任务优先级、任务完成率和对象总数。

1. 如果要管理或克隆特定的**计算校验和**任务，请单击**任务 ID** 以查看其它任务信息。

1. 在特定的**计算校验和**任务页面上，查看任务详细信息。

每个批量操作任务都会逐步经历不同的[任务状态](https://docs.amazonaws.cn/AmazonS3/latest/userguide/batch-ops-job-status.html#batch-ops-job-status-table)。还可以在 S3 控制台中[启用 Amazon CloudTrail 事件](https://docs.amazonaws.cn/AmazonS3/latest/userguide/enable-cloudtrail-logging-for-s3.html)，以接收有关任何任务状态变化的提醒。对于处于活动状态的任务，可以在**任务详细信息**页面上查看正在运行的任务和完成率。

### 使用 Amazon SDK
<a name="Compute-checksum-sdk"></a>

------
#### [ Java ]

**Example 示例：创建**计算校验和**任务**  
以下示例向您展示了如何创建**计算校验和**任务（作为**创建任务**请求的一部分），以及如何指定清单：  

```
// Required parameters
String accountId = "111122223333";
String roleArn = "arn:aws:iam::111122223333:role/BatchOperations";
String manifestArn = "arn:aws:s3:::my_manifests/manifest.csv";
String manifestEtag = "60e460c9d1046e73f7dde5043ac3ae85";
String reportBucketArn = "arn:aws:s3:::amzn-s3-demo-completion-report-bucket";
String reportExpectedBucketOwner = "111122223333";
String reportPrefix = "demo-report";

// Job Operation
S3ComputeObjectChecksumOperation s3ComputeObjectChecksum = S3ComputeObjectChecksumOperation.builder()
    .checksumAlgorithm(ComputeObjectChecksumAlgorithm.CRC64)
    .checksumType(ComputeObjectChecksumType.COMPOSITE)
    .build();

JobOperation operation = JobOperation.builder()
    .s3ComputeObjectChecksum(s3ComputeObjectChecksum)
    .build();

// Job Manifest
JobManifestLocation location = JobManifestLocation.builder()
    .eTag(manifestEtag)
    .objectArn(manifestArn)
    .build();

JobManifestSpec spec = JobManifestSpec.builder()
    .format(JobManifestFormat.S3_BATCH_OPERATIONS_CSV_20180820)
    .fields(Arrays.asList(JobManifestFieldName.BUCKET, JobManifestFieldName.KEY))
    .build();

JobManifest manifest = JobManifest.builder()
    .location(location)
    .spec(spec)
    .build();

// Completion Report
JobReport report = JobReport.builder()
    .bucket(reportBucketArn)
    .enabled(true) // Must be true
    .expectedBucketOwner(reportExpectedBucketOwner)
    .format(JobReportFormat.REPORT_CSV_20180820)
    .prefix(reportPrefix)
    .reportScope(JobReportScope.ALL_TASKS)
    .build();

// Create Job Request
CreateJobRequest request = CreateJobRequest.builder()
    .accountId(accountId)
    .confirmationRequired(false)
    .manifest(manifest)
    .operation(operation)
    .priority(10)
    .report(report)
    .roleArn(roleArn);

// Create the client
S3ControlClient client = S3ControlClient.builder()
    .credentialsProvider(new ProfileCredentialsProvider())
    .region(Region.US_EAST_1)
    .build();

// Send the request
try {
    CreateJobResponse response = client.createJob(request);
    System.out.println(response);    
} catch (AwsServiceException e) {
    System.out.println("AwsServiceException: " + e.getMessage());
    throw new RuntimeException(e);
} catch (SdkClientException e) {
    System.out.println("SdkClientException: " + e.getMessage());
    throw new RuntimeException(e);
}
```

**Example 示例：查看**计算校验和**任务详细信息**  
以下示例说明如何指定任务 ID 以查看**计算校验和**任务请求的任务详细信息（例如任务完成率）：  

```
DescribeJobRequest request = DescribeJobRequest.builder()
        .accountId("1234567890")
        .jobId("a16217a1-e082-48e5-b04f-31fac3a66b13")
        .build();
```

------

### 使用 Amazon CLI
<a name="Compute-checksum-cli"></a>

可以使用 [https://docs.amazonaws.cn/cli/latest/reference/s3control/create-job.html](https://docs.amazonaws.cn/cli/latest/reference/s3control/create-job.html) 命令来创建新的批量操作任务并提供对象的列表。然后，指定校验和算法和校验和类型，以及要在其中保存**计算校验和**报告的目标存储桶。以下示例通过使用 S3 为 Amazon Web Services 账户 *111122223333* 生成的清单来创建 S3 批量操作**计算校验和**任务。

要使用此命令，请将*用户输入占位符*替换为您自己的信息：

```
aws s3control create-job \
    --account-id 111122223333 \
    --manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::my-manifest-bucket/manifest.csv","ETag":"e0e8bfc50e0f0c5d5a1a5f0e0e8bfc50"}}' \
    --manifest-generator '{
        "S3JobManifestGenerator": {
          "ExpectedBucketOwner": "111122223333",
          "SourceBucket": "arn:aws:s3:::amzn-s3-demo-source-bucket",
          "EnableManifestOutput": true,
          "ManifestOutputLocation": {
            "ExpectedManifestBucketOwner": "111122223333",
            "Bucket": "arn:aws:s3:::amzn-s3-demo-manifest-bucket",
            "ManifestPrefix": "prefix",
            "ManifestFormat": "S3InventoryReport_CSV_20211130"
          },
          "Filter": {
            "CreatedAfter": "2023-09-01",
            "CreatedBefore": "2023-10-01",
            "KeyNameConstraint": {
              "MatchAnyPrefix": [
                "prefix"
              ],
              "MatchAnySuffix": [
                "suffix"
              ]
            },
            "ObjectSizeGreaterThanBytes": 100,
            "ObjectSizeLessThanBytes": 200,
            "MatchAnyStorageClass": [
              "STANDARD",
              "STANDARD_IA"
            ]
          }
        }
      }' \
    --operation '{"S3ComputeObjectChecksum":{"ChecksumAlgorithm":"CRC64NVME","ChecksumType":"FULL_OBJECT"}}' \
    --report '{"Bucket":"arn:aws:s3:::my-report-bucket","Format":"Report_CSV_20180820","Enabled":true,"Prefix":"batch-op-reports/","ReportScope":"AllTasks","ExpectedBucketOwner":"111122223333"}' \
    --priority 10 \
    --role-arn arn:aws:iam::123456789012:role/S3BatchJobRole \
    --client-request-token 6e023a7e-4820-4654-8c81-7247361aeb73 \
    --description "Compute object checksums" \
    --region us-west-2
```

提交**计算校验和**任务后，您将收到作为响应的任务 ID，它会显示在 S3 批量操作列表页面上。Amazon S3 处理对象列表并计算每个对象的校验和。任务完成后，S3 在指定的目标处提供合并的**计算校验和**报告。

要监控**计算校验和**任务的进度，请使用 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/describe-job.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/describe-job.html) 命令。此命令检查指定的批量操作任务的状态。要使用此命令，请将*用户输入占位符*替换为您自己的信息。

例如：

```
aws s3control describe-job --account-id 111122223333 --job-id 1234567890abcdef0
```

要[列出](https://docs.amazonaws.cn/AmazonS3/latest/userguide/batch-ops-list-jobs.html)所有**活动**和**完成**的批量操作任务，请参阅[列出任务](https://docs.amazonaws.cn/AmazonS3/latest/userguide/batch-ops-list-jobs.html)或《Amazon CLI Command Reference》**中的 [list-jobs](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3control/list-jobs.html)。

### 使用 REST API
<a name="Compute-checksum-api"></a>

可以发送 REST 请求，以使用 [CreateJob](https://docs.amazonaws.cn/AmazonS3/latest/API/API_control_CreateJob.html) 通过**计算校验和**来验证对象完整性。可以通过向 [DescribeJob](https://docs.amazonaws.cn/AmazonS3/latest/API/API_control_DescribeJob.html) API 操作发送 REST 请求来监控**计算校验和**请求的进度。每个批量操作任务都将逐步经历以下状态：
+ **新**
+ **正在准备**
+ **就绪**
+ **ACTIVE**
+ **正在暂停**
+ **已暂停**
+ **完成**
+ **正在取消**
+ **已失败**

API 响应会通知您当前的任务状态。