

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

下列步驟說明如何使用 EBS 直接 API 讀取快照：

1. 使用 ListSnapShotBlock 動作可檢視快照中區塊的所有區塊索引和區塊標記。或者，使用 ListChangedBlock 動作，只檢視相同磁碟區的兩個快照和快照歷程之間不同的區塊索引和區塊標記。這些動作可協助您識別您可能想要取得資料的區塊標記和區塊索引。

1. 使用 GetSnapshotBlock 動作，並指定要取得資料之區塊的區塊索引和區塊標記。

**注意**  
您無法將 EBS 直接 APIs與封存的快照搭配使用。

下列範例示範如何使用 EBS 直接 API 讀取快照。

**Topics**
+ [列出快照中的區塊](#list-blocks)
+ [列出兩個快照之間不同的區塊](#list-different-blocks)
+ [從快照取得區塊資料](#get-block-data)

## 列出快照中的區塊
<a name="list-blocks"></a>

------
#### [ AWS CLI ]

下列 [list-snapshot-blocks](https://docs.aws.amazon.com/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
  }
```

------
#### [ AWS API ]

下列 [ListSnapshotBlocks](https://docs.aws.amazon.com/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：區塊索引編號 `0` - `999` 的 1000 個區塊的完整快照。
  + 快照 2：僅包含一個變更區塊 (區塊索引編號 `999`) 的增量快照。

  列出這些具有 `StartingBlockIndex = 0` 和 `MaxResults = 100` 之快照的變更區塊會傳回 `ChangedBlocks` 的空陣列。您必須使用 `nextToken` 要求剩餘結果，直到在第十個結果集中傳回變更區塊，結果集會包括區塊索引編號 `900` - `999` 的區塊。
+ 回應可以略過快照中未寫入的區塊。例如：
  + 快照 1：區塊索引編號 `2000` - `2999` 的 1000 個區塊的完整快照。
  + 快照 2：僅包含一個變更區塊 (區塊索引編號 `2000`) 的增量快照。

  列出這些具有 `StartingBlockIndex = 0` 和 `MaxResults = 100` 之快照的變更區塊時，回應會略過索引編號 `0` - `1999` 的區塊，並且包括索引編號 `2000` 的區塊。回應將不會包含空 `ChangedBlocks` 陣列。

------
#### [ AWS CLI ]

下列 [list-changed-blocks](https://docs.aws.amazon.com/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"
  }
```

------
#### [ AWS API ]

下列 [ListChangedBlock](https://docs.aws.amazon.com/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>

------
#### [ AWS CLI ]

下面的 [get-snapshot-block](https://docs.aws.amazon.com/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"
  }
```

------
#### [ AWS API ]

下面的 [GetSnapshotBlock](https://docs.aws.amazon.com/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}}
```

------