

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

# 使用 EBS Direct 写入亚马逊 EBS 快照 APIs
<a name="writesnapshots"></a>

以下步骤介绍如何使用 EBS Direct 写入 APIs 增量快照：

1. 使用 StartSnapshot 操作并指定父快照 ID 将快照作为现有快照的增量快照启动，或者省略父快照 ID 以启动新快照。此操作返回处于“待处理”状态的新快照 ID。

1. 使用 PutSnapshotBlock 操作并指定待处理快照的 ID，以单个块的形式向其中添加数据。必须为传输的数据块指定 Base64 编码的 SHA256校验和。服务将计算接收到的数据的校验和，并使用您指定的校验和对其进行验证。如果校验和不匹配，则操作失败。

1. 向待处理快照添加数据后，使用 CompleteSnapshot操作启动异步工作流程，该工作流程将快照封存起来并将其移至已完成状态。

重复这些步骤，使用之前创建的快照作为父级创建新的增量快照。

例如，在下图中，快照 A 是启动的第一个新快照。快照 A 用作父快照来启动快照 B。快照 B 用作父快照来启动和创建快照 C。快照 A、B 和 C 均为增量快照。快照 A 用于创建 EBS 卷 1。快照 D 创建自 EBS 卷 1。快照 D 是 A 的增量快照；它不是 B 或 C 的增量快照。

![\[EBS Direc APIs t 用于创建增量快照。\]](http://docs.amazonaws.cn/ebs/latest/userguide/images/ebs-apis-write.png)


以下示例说明如何使用 EBS Dire APIs ct 写入快照。

**Topics**
+ [

## 启动快照
](#start-snapshot)
+ [

## 将数据放入快照
](#put-data)
+ [

## 完成快照
](#complete-snapshot)

## 启动快照
<a name="start-snapshot"></a>

------
#### [ Amazon CLI ]

以下 [start-snapshot](https://docs.amazonaws.cn/cli/latest/reference/ebs/start-snapshot.html) 示例命令启动 `8` GiB 快照，使用快照 `snap-123EXAMPLE1234567` 作为父快照。新快照将是父快照的增量快照。如果在指定的 `60` 分钟超时期限内，没有针对快照发出放置或完成请求，则快照将转为错误状态。`550e8400-e29b-41d4-a716-446655440000` 客户端令牌确保请求的幂等性。如果省略了客户端令牌， Amazon SDK 会自动为您生成一个。有关幂等性的更多信息，请参阅 [确保 API 请求中的等性 StartSnapshot](ebs-direct-api-idempotency.md)。

```
aws ebs start-snapshot --volume-size 8 --parent-snapshot snap-123EXAMPLE1234567 --timeout 60 --client-token 550e8400-e29b-41d4-a716-446655440000
```

以下为上一个命令的示例响应，其中显示了快照 ID、 Amazon 账户 ID、状态、卷大小（以 GiB 为单位）以及快照中数据块的大小。快照以 `pending` 状态启动。在后续 `put-snapshot-block` 命令中指定快照 ID 以将数据写入快照，然后使用 `complete-snapshot` 命令完成快照并将其状态更改为 `completed`。

```
{
    "SnapshotId": "snap-0aaEXAMPLEe306d62",
    "OwnerId": "111122223333",
    "Status": "pending",
    "VolumeSize": 8,
    "BlockSize": 524288
}
```

------
#### [ Amazon API ]

以下[StartSnapshot](https://docs.amazonaws.cn/ebs/latest/APIReference/API_StartSnapshot.html)示例请求使用快照`snap-123EXAMPLE1234567`作为父快照启动 `8` GiB 快照。新快照将是父快照的增量快照。如果在指定的 `60` 分钟超时期限内，没有针对快照发出放置或完成请求，则快照将转为错误状态。`550e8400-e29b-41d4-a716-446655440000` 客户端令牌确保请求的幂等性。如果省略了客户端令牌， Amazon SDK 会自动为您生成一个。有关幂等性的更多信息，请参阅 [确保 API 请求中的等性 StartSnapshot](ebs-direct-api-idempotency.md)。

```
POST /snapshots HTTP/1.1
Host: ebs.us-east-2.amazonaws.com
Accept-Encoding: identity
User-Agent: <User agent parameter>
X-Amz-Date: 20200618T040724Z
Authorization: <Authentication parameter>

{
    "VolumeSize": 8,
    "ParentSnapshot": snap-123EXAMPLE1234567,
    "ClientToken": "550e8400-e29b-41d4-a716-446655440000",
    "Timeout": 60
}
```

以下为上一个请求的示例响应，其中显示了快照 ID、 Amazon 账户 ID、状态、卷大小（以 GiB 为单位）以及快照中数据块的大小。快照以“待处理”状态开始。在后续 `PutSnapshotBlocks` 请求中指定快照 ID，以将数据写入快照。

```
HTTP/1.1 201 Created
x-amzn-RequestId: 929e6eb9-7183-405a-9502-5b7da37c1b18
Content-Type: application/json
Content-Length: 181
Date: Thu, 18 Jun 2020 04:07:29 GMT
Connection: keep-alive

{
    "BlockSize": 524288,
    "Description": null,
    "OwnerId": "138695307491",
    "Progress": null,
    "SnapshotId": "snap-052EXAMPLEc85d8dd",
    "StartTime": null,
    "Status": "pending",
    "Tags": null,
    "VolumeSize": 8
}
```

------

## 将数据放入快照
<a name="put-data"></a>

------
#### [ Amazon CLI ]

以下[put-snapshot-block](https://docs.amazonaws.cn/cli/latest/reference/ebs/put-snapshot-block.html)示例命令将`524288`字节的数据写入快照`1000`上的块索引`snap-0aaEXAMPLEe306d62`。Base64 编码的 `QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM=` 校验和使用 `SHA256` 算法生成。传输的数据位于 `/tmp/data` 文件中。

```
aws ebs put-snapshot-block --snapshot-id snap-0aaEXAMPLEe306d62 --block-index 1000 --data-length 524288 --block-data /tmp/data --checksum QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM= --checksum-algorithm SHA256
```

以下为上一个命令的示例响应，其中确认服务接收的数据的数据长度、校验和以及校验和算法。

```
{
    "DataLength": "524288",
    "Checksum": "QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM=",
    "ChecksumAlgorithm": "SHA256"
}
```

------
#### [ Amazon API ]

以下[PutSnapshot](https://docs.amazonaws.cn/ebs/latest/APIReference/API_PutSnapshotBlock.html)示例请求将`524288`字节的数据写入快照`1000`上的块索引`snap-052EXAMPLEc85d8dd`。Base64 编码的 `QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM=` 校验和使用 `SHA256` 算法生成。数据在请求正文中传输，如下*BlockData*例所示。

```
PUT /snapshots/snap-052EXAMPLEc85d8dd/blocks/1000 HTTP/1.1
Host: ebs.us-east-2.amazonaws.com
Accept-Encoding: identity
x-amz-Data-Length: 524288
x-amz-Checksum: QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM=
x-amz-Checksum-Algorithm: SHA256
User-Agent: <User agent parameter>
X-Amz-Date: 20200618T042215Z
X-Amz-Content-SHA256: UNSIGNED-PAYLOAD
Authorization: <Authentication parameter>
          
          BlockData
```

以下为上一个请求的示例响应，其中确认服务接收的数据的数据长度、校验和以及校验和算法。

```
HTTP/1.1 201 Created
x-amzn-RequestId: 643ac797-7e0c-4ad0-8417-97b77b43c57b
x-amz-Checksum: QOD3gmEQOXATfJx2Aa34W4FU2nZGyXfqtsUuktOw8DM=
x-amz-Checksum-Algorithm: SHA256
Content-Type: application/json
Content-Length: 2
Date: Thu, 18 Jun 2020 04:22:12 GMT
Connection: keep-alive

{}
```

------

## 完成快照
<a name="complete-snapshot"></a>

------
#### [ Amazon CLI ]

以下 [complete-snapshot](https://docs.amazonaws.cn/cli/latest/reference/ebs/complete-snapshot.html) 示例命令完成快照 `snap-0aaEXAMPLEe306d62`。该命令指定将 `5` 数据块写入快照。`6D3nmwi5f2F0wlh7xX8QprrJBFzDX8aacdOcA3KCM3c=` 校验和表示写入快照的完整数据集的校验和。有关校验和的更多信息，请参阅本指南前文中的[使用 EBS 直接 APIs 校验和来验证快照数据](ebsapis-using-checksums.md)。

```
aws ebs complete-snapshot --snapshot-id snap-0aaEXAMPLEe306d62 --changed-blocks-count 5 --checksum 6D3nmwi5f2F0wlh7xX8QprrJBFzDX8aacdOcA3KCM3c= --checksum-algorithm SHA256 --checksum-aggregation-method LINEAR
```

以下为上一个命令的示例响应。

```
{
    "Status": "pending"
}
```

------
#### [ Amazon API ]

以下[CompleteSnapshot](https://docs.amazonaws.cn/ebs/latest/APIReference/API_CompleteSnapshot.html)示例请求完成快照`snap-052EXAMPLEc85d8dd`。该命令指定将 `5` 数据块写入快照。`6D3nmwi5f2F0wlh7xX8QprrJBFzDX8aacdOcA3KCM3c=` 校验和表示写入快照的完整数据集的校验和。

```
POST /snapshots/completion/snap-052EXAMPLEc85d8dd HTTP/1.1
Host: ebs.us-east-2.amazonaws.com
Accept-Encoding: identity
x-amz-ChangedBlocksCount: 5
x-amz-Checksum: 6D3nmwi5f2F0wlh7xX8QprrJBFzDX8aacdOcA3KCM3c=
x-amz-Checksum-Algorithm: SHA256
x-amz-Checksum-Aggregation-Method: LINEAR
User-Agent: <User agent parameter>
X-Amz-Date: 20200618T043158Z
Authorization: <Authentication parameter>
```

以下为上一个请求的示例响应。

```
HTTP/1.1 202 Accepted
x-amzn-RequestId: 06cba5b5-b731-49de-af40-80333ac3a117
Content-Type: application/json
Content-Length: 20
Date: Thu, 18 Jun 2020 04:31:50 GMT
Connection: keep-alive

{"Status":"pending"}
```

------