

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

# 直接使用 EBS 读取 Amazon EBS 快照 APIs
<a name="readsnapshots"></a>

以下步骤介绍如何使用 EBS 直接读 APIs 取快照：

1. 使用 ListSnapshotBlocks 操作可查看快照中区块的所有区块索引和区块标记。或者使用该 ListChangedBlocks 操作仅查看同一卷的两个快照和快照谱系之间不同的区块索引和区块令牌。这些操作可帮助您标识可能希望获取其数据的数据块的数据块令牌和数据块索引。

1. 使用 GetSnapshotBlock 操作，并指定要获取其数据的区块的区块索引和区块标记。

**注意**  
您不能将 EBS 直接 APIs 用于存档快照。

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

**Topics**
+ [列出快照中的数据块](#list-blocks)
+ [列出两个快照之间存在不同的数据块](#list-different-blocks)
+ [从快照获取数据块数据](#get-block-data)

## 列出快照中的数据块
<a name="list-blocks"></a>

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

以下[list-snapshot-blocks](https://docs.amazonaws.cn/cli/latest/reference/ebs/list-snapshot-blocks.html)示例命令返回快照中区块的区块索引和区块标记`snap-0987654321`。`--starting-block-index` 参数将结果限制为索引大于 `1000` 的数据块，并且 `--max-results` 参数将结果限制为前 `100` 个数据块。

```
aws ebs list-snapshot-blocks --snapshot-id snap-0987654321 --starting-block-index 1000 --max-results 100
```

以下为上一个命令的示例响应，其中列出了快照中的数据块索引和数据块令牌。使用 `get-snapshot-block` 命令，请指定要获取其数据的数据块的数据块索引和数据块令牌。数据块令牌在列出的过期时间之前有效。

```
{
      "Blocks": [
          {
              "BlockIndex": 1001,
              "BlockToken": "AAABAV3/PNhXOynVdMYHUpPsetaSvjLB1dtIGfbJv5OJ0sX855EzGTWos4a4"
          },
          {
              "BlockIndex": 1002,
              "BlockToken": "AAABATGQIgwr0WwIuqIMjCA/Sy7e/YoQFZsHejzGNvjKauzNgzeI13YHBfQB"
          },
          {
              "BlockIndex": 1007,
              "BlockToken": "AAABAZ9CTuQtUvp/dXqRWw4d07eOgTZ3jvn6hiW30W9duM8MiMw6yQayzF2c"
          },
          {
              "BlockIndex": 1012,
              "BlockToken": "AAABAQdzxhw0rVV6PNmsfo/YRIxo9JPR85XxPf1BLjg0Hec6pygYr6laE1p0"
          },
          {
              "BlockIndex": 1030,
              "BlockToken": "AAABAaYvPax6mv+iGWLdTUjQtFWouQ7Dqz6nSD9L+CbXnvpkswA6iDID523d"
          },
          {
              "BlockIndex": 1031,
              "BlockToken": "AAABATgWZC0XcFwUKvTJbUXMiSPg59KVxJGL+BWBClkw6spzCxJVqDVaTskJ"
          },
          ...
      ],
      "ExpiryTime": 1576287332.806,
      "VolumeSize": 32212254720,
      "BlockSize": 524288
  }
```

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

以下[ListSnapshotBlocks](https://docs.amazonaws.cn/ebs/latest/APIReference/API_ListSnapshotBlocks.html)示例请求返回快照中区块的区块索引和区块标记`snap-0acEXAMPLEcf41648`。`startingBlockIndex` 参数将结果限制为索引大于 `1000` 的数据块，并且 `maxResults` 参数将结果限制为前 `100` 个数据块。

```
GET /snapshots/snap-0acEXAMPLEcf41648/blocks?maxResults=100&startingBlockIndex=1000 HTTP/1.1
  Host: ebs.us-east-2.amazonaws.com
  Accept-Encoding: identity
  User-Agent: <User agent parameter>
  X-Amz-Date: 20200617T231953Z
  Authorization: <Authentication parameter>
```

以下为上一个请求的示例响应，其中列出了快照中的数据块索引和数据块令牌。使用 GetSnapshotBlock 操作并指定要获取其数据的区块的区块索引和区块标记。数据块令牌在列出的过期时间之前有效。

```
HTTP/1.1 200 OK
  x-amzn-RequestId: d6e5017c-70a8-4539-8830-57f5557f3f27
  Content-Type: application/json
  Content-Length: 2472
  Date: Wed, 17 Jun 2020 23:19:56 GMT
  Connection: keep-alive
  
  {
      "BlockSize": 524288,
      "Blocks": [
          {
              "BlockIndex": 0,
              "BlockToken": "AAUBAcuWqOCnDNuKle11s7IIX6jp6FYcC/q8oT93913HhvLvA+3JRrSybp/0"
          },
          {
              "BlockIndex": 1536,
              "BlockToken": "AAUBAWudwfmofcrQhGVlLwuRKm2b8ZXPiyrgoykTRC6IU1NbxKWDY1pPjvnV"
          },
          {
              "BlockIndex": 3072,
              "BlockToken": "AAUBAV7p6pC5fKAC7TokoNCtAnZhqq27u6YEXZ3MwRevBkDjmMx6iuA6tsBt"
          },
          {
              "BlockIndex": 3073,
              "BlockToken": "AAUBAbqt9zpqBUEvtO2HINAfFaWToOwlPjbIsQOlx6JUN/0+iMQl0NtNbnX4"
          },
          ...
      ],
      "ExpiryTime": 1.59298379649E9,
      "VolumeSize": 3
  }
```

------

## 列出两个快照之间存在不同的数据块
<a name="list-different-blocks"></a>

在发出**分页请求**以列出两个快照之间发生更改的块时应注意以下几点：
+ 响应可能包含一个或多个空的 `ChangedBlocks` 数组。例如：
  + 快照 1 – 1000 个块的完整快照，带块索引 `0` – `999`。
  + 快照 2 – 仅包含一个发生更改的块，块索引为 `999` 的增量快照。

  使用 `StartingBlockIndex = 0` 和 `MaxResults = 100` 列出这些快照发生更改的块时，将返回一个空的 `ChangedBlocks` 数组。您必须使用 `nextToken` 请求剩余的结果，直到第十个结果集（其中包括块索引为 `900` - `999` 的块）返回发生更改的块为止。
+ 响应可能回跳过快照中未写入的块。例如：
  + 快照 1 – 1000 个块的完整快照，带块索引 `2000` – `2999`。
  + 快照 2 – 仅包含一个发生更改的块，块索引为 `2000` 的增量快照。

  使用 `StartingBlockIndex = 0` 和 `MaxResults = 100` 列出这些快照中发生更改的块时，响应将跳过块索引 `0` - `1999` 并将包含块索引 `2000`。响应不会包含空的 `ChangedBlocks` 数组。

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

以下[list-changed-blocks](https://docs.amazonaws.cn/cli/latest/reference/ebs/list-changed-blocks.html)示例命令返回快照和之间不同的区块的区块索引`snap-1234567890`和区块标记`snap-0987654321`。`--starting-block-index` 参数将结果限制为索引大于 `0` 的数据块，并且 `--max-results` 参数将结果限制为前 `500` 个数据块。

```
aws ebs list-changed-blocks --first-snapshot-id snap-1234567890 --second-snapshot-id snap-0987654321 --starting-block-index 0 --max-results 500
```

以下为上一个命令的示例响应，其中显示了两个快照的数据块索引 0、6000、6001、6002 和 6003 存在不同。此外，数据块索引 6001、6002 和 6003 仅存在于指定的第一个快照 ID 中，而不存在于第二个快照 ID 中，因为响应中没有列出第二个数据块令牌。

使用 `get-snapshot-block` 命令，请指定要获取其数据的数据块的数据块索引和数据块令牌。数据块令牌在列出的过期时间之前有效。

```
{
      "ChangedBlocks": [
          {
              "BlockIndex": 0,
              "FirstBlockToken": "AAABAVahm9SO60Dyi0ORySzn2ZjGjW/KN3uygGlS0QOYWesbzBbDnX2dGpmC",
              "SecondBlockToken": "AAABAf8o0o6UFi1rDbSZGIRaCEdDyBu9TlvtCQxxoKV8qrUPQP7vcM6iWGSr"
          },
          {
              "BlockIndex": 6000,
              "FirstBlockToken": "AAABAbYSiZvJ0/R9tz8suI8dSzecLjN4kkazK8inFXVintPkdaVFLfCMQsKe",
              "SecondBlockToken": "AAABAZnqTdzFmKRpsaMAsDxviVqEI/3jJzI2crq2eFDCgHmyNf777elD9oVR"
          },
          {
              "BlockIndex": 6001,
              "FirstBlockToken": "AAABASBpSJ2UAD3PLxJnCt6zun4/T4sU25Bnb8jB5Q6FRXHFqAIAqE04hJoR"
          },
          {
              "BlockIndex": 6002,
              "FirstBlockToken": "AAABASqX4/NWjvNceoyMUljcRd0DnwbSwNnes1UkoP62CrQXvn47BY5435aw"
          },
          {
              "BlockIndex": 6003,
              "FirstBlockToken": "AAABASmJ0O5JxAOce25rF4P1sdRtyIDsX12tFEDunnePYUKOf4PBROuICb2A"
          },
          ...
      ],
      "ExpiryTime": 1576308931.973,
      "VolumeSize": 32212254720,
      "BlockSize": 524288,
      "NextToken": "AAADARqElNng/sV98CYk/bJDCXeLJmLJHnNSkHvLzVaO0zsPH/QM3Bi3zF//O6Mdi/BbJarBnp8h"
  }
```

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

以下[ListChangedBlocks](https://docs.amazonaws.cn/ebs/latest/APIReference/API_ListChangedBlocks.html)示例请求返回快照和之间不同的区块的区块索引`snap-0acEXAMPLEcf41648`和区块标记`snap-0c9EXAMPLE1b30e2f`。`startingBlockIndex` 参数将结果限制为索引大于 `0` 的数据块，并且 `maxResults` 参数将结果限制为前 `500` 个数据块。

```
GET /snapshots/snap-0c9EXAMPLE1b30e2f/changedblocks?firstSnapshotId=snap-0acEXAMPLEcf41648&maxResults=500&startingBlockIndex=0 HTTP/1.1
  Host: ebs.us-east-2.amazonaws.com
  Accept-Encoding: identity
  User-Agent: <User agent parameter>
  X-Amz-Date: 20200617T232546Z
  Authorization: <Authentication parameter>
```

以下为上一个请求的示例响应，其中显示了两个快照的数据块索引 `0`、`3072`、`6002` 和 `6003` 存在不同。此外，数据块索引 `6002` 和 `6003` 仅存在于指定的第一个快照 ID 中，而不存在于第二个快照 ID 中，因为响应中没有列出第二个数据块令牌。

使用 `GetSnapshotBlock` 操作，请指定要获取其数据的数据块的数据块索引和数据块令牌。数据块令牌在列出的过期时间之前有效。

```
HTTP/1.1 200 OK
  x-amzn-RequestId: fb0f6743-6d81-4be8-afbe-db11a5bb8a1f
  Content-Type: application/json
  Content-Length: 1456
  Date: Wed, 17 Jun 2020 23:25:47 GMT
  Connection: keep-alive
  
  {
      "BlockSize": 524288,
      "ChangedBlocks": [
          {
              "BlockIndex": 0,
              "FirstBlockToken": "AAUBAVaWqOCnDNuKle11s7IIX6jp6FYcC/tJuVT1GgP23AuLntwiMdJ+OJkL",
              "SecondBlockToken": "AAUBASxzy0Y0b33JVRLoYm3NOresCxn5RO+HVFzXW3Y/RwfFaPX2Edx8QHCh"
          },
          {
              "BlockIndex": 3072,
              "FirstBlockToken": "AAUBAcHp6pC5fKAC7TokoNCtAnZhqq27u6fxRfZOLEmeXLmHBf2R/Yb24MaS",
              "SecondBlockToken": "AAUBARGCaufCqBRZC8tEkPYGGkSv3vqvOjJ2xKDi3ljDFiytUxBLXYgTmkid"
          },
          {
              "BlockIndex": 6002,
              "FirstBlockToken": "AAABASqX4/NWjvNceoyMUljcRd0DnwbSwNnes1UkoP62CrQXvn47BY5435aw"
          },
          {
              "BlockIndex": 6003,
              "FirstBlockToken": "AAABASmJ0O5JxAOce25rF4P1sdRtyIDsX12tFEDunnePYUKOf4PBROuICb2A"
          },
          ...
      ],
      "ExpiryTime": 1.592976647009E9,
      "VolumeSize": 3
  }
```

------

## 从快照获取数据块数据
<a name="get-block-data"></a>

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

以下[get-snapshot-block](https://docs.amazonaws.cn/cli/latest/reference/ebs/get-snapshot-block.html)示例命令以快照形式返回区块索引中`6001`带有区块令牌`AAABASBpSJ2UAD3PLxJnCt6zun4/T4sU25Bnb8jB5Q6FRXHFqAIAqE04hJoR`的数据`snap-1234567890`。在 Windows 计算机上，二进制数据将输出到 `data` 目录中的 `C:\Temp` 文件。如果您在 Linux 或 Unix 计算机上运行该命令，请将输出路径替换为 `/tmp/data` 以将数据输出到 `data` 目录中的 `/tmp` 文件。

```
aws ebs get-snapshot-block --snapshot-id snap-1234567890 --block-index 6001 --block-token AAABASBpSJ2UAD3PLxJnCt6zun4/T4sU25Bnb8jB5Q6FRXHFqAIAqE04hJoR C:/Temp/data
```

以下为上一个命令的示例响应，其中显示了返回的数据的大小、用于验证数据的校验和以及校验和的算法。二进制数据会自动保存到您在请求命令中指定的目录和文件中。

```
{
      "DataLength": "524288",
      "Checksum": "cf0Y6/Fn0oFa4VyjQPOa/iD0zhTflPTKzxGv2OKowXc=",
      "ChecksumAlgorithm": "SHA256"
  }
```

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

以下[GetSnapshotBlock](https://docs.amazonaws.cn/ebs/latest/APIReference/API_GetSnapshotBlock.html)示例请求以快照形式返回区块索引中`3072`带有区块令牌`AAUBARGCaufCqBRZC8tEkPYGGkSv3vqvOjJ2xKDi3ljDFiytUxBLXYgTmkid`的数据`snap-0c9EXAMPLE1b30e2f`。

```
GET /snapshots/snap-0c9EXAMPLE1b30e2f/blocks/3072?blockToken=AAUBARGCaufCqBRZC8tEkPYGGkSv3vqvOjJ2xKDi3ljDFiytUxBLXYgTmkid HTTP/1.1
  Host: ebs.us-east-2.amazonaws.com
  Accept-Encoding: identity
  User-Agent: <User agent parameter>
  X-Amz-Date: 20200617T232838Z
  Authorization: <Authentication parameter>
```

以下为上一个请求的示例响应，其中显示了返回的数据的大小、用于验证数据的校验和以及用于生成校验和的算法。二进制数据在响应正文中传输，如下例所*BlockData*示。

```
HTTP/1.1 200 OK
  x-amzn-RequestId: 2d0db2fb-bd88-474d-a137-81c4e57d7b9f
  x-amz-Data-Length: 524288
  x-amz-Checksum: Vc0yY2j3qg8bUL9I6GQuI2orTudrQRBDMIhcy7bdEsw=
  x-amz-Checksum-Algorithm: SHA256
  Content-Type: application/octet-stream
  Content-Length: 524288
  Date: Wed, 17 Jun 2020 23:28:38 GMT
  Connection: keep-alive
  
  BlockData
```

------