

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

# 使用 EBS 直接 APIs 访问快照的内容
<a name="ebs-accessing-snapshot"></a>

您可以使用 Amazon Elastic Block Store（Amazon EBS）直接 API 创建 EBS 快照，将数据直接写入快照，读取快照上的数据，并标识两个快照之间的差异或发生的更改。如果您是为 Amazon EBS 提供备份服务的独立软件供应商（ISV），则利用 EBS direct API，可以更高效、更具成本效益地通过快照跟踪 EBS 卷上的增量更改。无需从快照创建新卷，然后使用 Amazon Elastic Compute Cloud（Amazon EC2）实例来比较差异，即可完成此操作。

您可以从本地数据直接创建增量快照到 EBS 卷和云中，以用于快速灾难恢复。通过写入和读取快照的功能，您可以在发生灾难时将本地数据写入 EBS 快照。然后，恢复后，您可以将其恢复到快照 AWS 或从快照恢复到本地。您不再需要构建和维护复杂的机制来将数据复制到 Amazon EBS 或从中复制数据。

本用户指南概述了构成 EBS direct 的元素 APIs，并提供了如何有效使用它们的示例。有关操作、数据类型、参数和错误的更多信息 APIs，请参阅 [EBS 直接 APIs 参考](https://docs.aws.amazon.com/ebs/latest/APIReference/)。有关 EBS direct 支持的 AWS 区域、终端节点和服务配额的更多信息 APIs，请参阅中的 [Amazon EBS 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html)。*AWS 一般参考*

**Topics**
+ [定价](ebsapi-pricing.md)
+ [概念](ebsapi-elements.md)
+ [控制 访问](ebsapi-permissions.md)
+ [读取快照](readsnapshots.md)
+ [写入快照](writesnapshots.md)
+ [加密结果](ebsapis-using-encryption.md)
+ [验证快照数据](ebsapis-using-checksums.md)
+ [确保幂等性](ebs-direct-api-idempotency.md)
+ [错误重试](error-retries.md)
+ [优化性能](ebsapi-performance.md)
+ [服务端点](using-endpoints.md)
+ [SDK 代码示例](sdk.md)
+ [接口 VPC 端点](ebs-apis-vpc-endpoints.md)
+ [CloudTrail 日志](logging-ebs-apis-using-cloudtrail.md)
+ [FAQs](ebsapi-faq.md)

# EBS direct 的定价 APIs
<a name="ebsapi-pricing"></a>

## 的定价 APIs
<a name="api-pricing"></a>

您直接使用EBS所支付的价格 APIs 取决于您提出的请求。有关更多信息，请参阅 [Amazon EBS 定价](https://aws.amazon.com/ebs/pricing/)。
+ **ListChangedBlocks**并 ListSnapshotBlocks APIs 按请求收费。例如，如果您在某个地区发出 100,000 ListSnapshotBlocks 个 API 请求，且该地区每 1,000 个请求收费 0.0006 美元，则将向您收取 0.06 美元的费用（每 1,000 个请求 0.0006 美元 x 100）。
+ **GetSnapshotBlock**按返回的区块收费。例如，如果您在某个地区发出 100,000 GetSnapshotBlock 个 API 请求，且每返回 1,000 个区块收费 0.003 美元，则将支付 0.30 美元（每返回 1,000 个区块 0.003 美元 x 100）。
+ **PutSnapshotBlock**按写入的区块收费。例如，如果您在某个区域发出 100,000 PutSnapshotBlock 个 API 请求，且每写入 1,000 个区块收费 0.006 美元，则将支付 0.60 美元的费用（每写入 1,000 个区块 0.006 美元 x 100）。

## 联网成本
<a name="networking-costs"></a>

**数据传输成本**  
使用[非 FIP](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#ebs_direct_apis) S 终端节点时，直接在 EBS 直接 API 和同一 AWS 区域的 Amazon EC2 实例之间传输的数据是免费的。有关更多信息，请参阅[AWS 服务端点](https://docs.aws.amazon.com/general/latest/gr/rande.html)。如果您的数据传输途中还有其他 AWS 服务，则将向您收取相关的数据处理费用。这些服务包括但不限于 PrivateLink 终端节点、NAT 网关和 Transit Gateway。

**VPC 接口终端节点**  
如果您使用来自 Amazon EC2 实例的 EBS 直接 API 或私有子网中的 AWS Lambda 函数，则可以使用 VPC 接口终端节点，而不使用 NAT 网关，以降低网络数据传输成本。有关更多信息，请参阅 [在 VPC 和 EBS Direct 之间创建私有连接 APIs](ebs-apis-vpc-endpoints.md)。

# EBS direct 的概念 APIs
<a name="ebsapi-elements"></a>

以下是在开始使用 EBS direc APIs t 之前应了解的关键概念。

## 快照
<a name="ebsapi-snapshots"></a>

快照是备份 EBS 卷中的数据的主要方式。借助 EBS Direct APIs，您还可以将本地磁盘中的数据备份到快照。为节省存储成本，连续快照为增量快照，只包含自上一个快照以来更改的卷数据。有关更多信息，请参阅 [Amazon EBS 快照](ebs-snapshots.md)。

**注意**  
EBS Direct APIs 不支持开启的公共快照和本地快照。 AWS Outposts

## 数据块
<a name="ebsapi-blocks"></a>

数据块是快照中的数据片段。每个快照可以包含数千个数据块。快照中的所有数据块都具有固定大小。

## 数据块索引
<a name="ebsapi-block-indexes"></a>

数据块索引是以 `512` KiB 数据块为单位的逻辑索引。若要确定数据块索引，请用逻辑卷中数据的逻辑偏移量除以数据块大小（数据的逻辑偏移量/`524288`）。数据的逻辑偏移量必须与 `512` KiB 一致。

## 数据块令牌
<a name="ebsapi-block-tokens"></a>

数据块令牌是快照中的数据块的标识哈希，它用于查找数据块数据。EBS Direct 返回的区块代币 APIs 是临时的。它们会在为其指定的到期时间戳时发生变化，或者如果您运行另一个快照 ListSnapshotBlocks 或 ListChangedBlocks 请求相同的快照。

## 校验和
<a name="ebsapi-checksum"></a>

校验和是从数据块中派生的大小很小的基准值，用于检测其传输或存储过程中引入的错误。EBS 直接 APIs 使用校验和来验证数据的完整性。当您从 EBS 快照中读取数据时，该服务会为传输的每个数据块提供 Base64 编码的 SHA256 校验和，您可以将其用于验证。向 EBS 快照写入数据时，必须为每个传输的数据块提供 Base64 编码的 SHA256 校验和。服务使用提供的校验和验证接收的数据。有关更多信息，请参阅本指南下文中的[使用 EBS 直接 APIs 校验和来验证快照数据](ebsapis-using-checksums.md)。

## 加密
<a name="ebsapi-encryption"></a>

通过加密，您的数据将转换为无法读取的代码，只能由有权访问加密数据所用 KMS 密钥 的人员破译这些代码，从而为数据提供保护。您可以使用 EBS Direc APIs t 来读取和写入加密快照，但有一些限制。有关更多信息，请参阅本指南下文中的[EBS Direct 的加密结果 APIs](ebsapis-using-encryption.md)。

## API 操作
<a name="ebsapi-actions"></a>

EBS direc APIs t 由六个操作组成。包含三个读取操作和三个写入操作。读取操作包括：
+ **ListSnapshotBlocks**— 返回指定快照中区块的区块索引和区块标记
+ **ListChangedBlocks**— 返回同一卷和快照谱系的两个指定快照之间存在差异的区块索引和区块令牌。
+ **GetSnapshotBlock**— 返回区块中指定快照 ID、区块索引和区块令牌的数据。

写入操作包括：
+ **StartSnapshot**— 启动快照，可以是现有快照的增量快照，也可以是新快照。在使用 CompleteSnapshot 操作完成之前，已启动的快照将保持待处理状态。
+ **PutSnapshotBlock**— 以单个块的形式向已启动的快照添加数据。必须为传输的数据块指定 Base64 编码的 SHA256 校验和。该服务会在传输完成以后验证校验和。若该服务计算的校验和与您指定值的不匹配，请求将会失败。
+ **CompleteSnapshot**— 完成处于待处理状态的已启动快照。然后，该快照的状态会更改为“已完成”。

## 签名版本 4 签名
<a name="ebsapis-using-sigv4"></a>

签名版本 4 是向 HTTP 发送的 AWS 请求添加身份验证信息的过程。为了安全起见，对的大多数请求都 AWS 必须使用访问密钥进行签名，访问密钥由访问密钥 ID 和私有访问密钥组成。这两个密钥通常称为您的安全凭证。有关如何获取账户凭证的信息，请参阅 [AWS 安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/security-creds.html)。

如果您打算手动创建 HTTP 请求，则必须了解如何对其签名。当您使用 AWS Command Line Interface (AWS CLI) 或其中一个 AWS SDKs 向发出请求时 AWS，这些工具会自动使用您在配置工具时指定的访问密钥为您签署请求。当您使用这些工具时，您不必了解如何亲自签署这些请求。

有关更多信息，请参阅 I *AM 用户指南*中的[签署 AWS API 请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。

# APIs 使用 IAM 直接控制对 EBS 的访问权限
<a name="ebsapi-permissions"></a>

用户必须遵循以下策略才能直接 APIs使用 EBS。有关更多信息，请参阅[更改用户权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

有关用于 IAM 权限策略的 EBS 直接 APIs 资源、操作和条件上下文密钥的更多信息，请参阅*服务授权参考*中的 A [mazon Elastic Block Store 的操作、资源和条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelasticblockstore.html)。

**重要**  
向 用户分配以下策略时请小心谨慎。通过分配这些策略，您可以向被拒绝通过 Amazon EC2 访问相同资源的用户授予访问权限 APIs，例如 CopySnapshot 或 CreateVolume 操作。

## 读取快照的权限
<a name="ebsapi-read-permissions"></a>

以下策略允许在特定 AWS 区域的所有快 APIs 照上使用直接*读取* EBS。在策略中，*<Region>*替换为快照的区域。

以下策略允许在带有特定键值标签 APIs 的快照上使用直接*读取* EBS。在策略中，*<Key>*替换为标签的键值和*<Value>*标签的值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ebs:ListSnapshotBlocks",
                "ebs:ListChangedBlocks",
                "ebs:GetSnapshotBlock"
            ],
            "Resource": "arn:aws:ec2:*::snapshot/*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "aws:ResourceTag/<Key>": "<Value>"
                }
            }
        }
    ]
}
```

------

以下策略仅允许在特定时间范围内对账户中的所有快照使用所有*读取* EBS direc APIs t。此策略授权 APIs 根据`aws:CurrentTime`全局条件密钥直接使用 EBS。在策略中，请务必将显示的日期和时间范围替换为适用于您的策略的日期和时间范围。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ebs:ListSnapshotBlocks",
                "ebs:ListChangedBlocks",
                "ebs:GetSnapshotBlock"
            ],
            "Resource": "arn:aws:ec2:*::snapshot/*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "2018-05-29T00:00:00Z"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "2020-05-29T23:59:59Z"
                }
            }
        }
    ]
}
```

------

有关更多信息，请参阅《IAM 用户指南》**中的[更改用户权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

## 写入快照的权限
<a name="ebsapi-write-permissions"></a>

以下策略允许在特定 AWS 区域的所有快照上使用*写入* EBS Direc APIs t。在策略中，*<Region>*替换为快照的区域。

以下策略允许在带有特定键值标签的快照上使用*写入* EBS direc APIs t。在策略中，*<Key>*替换为标签的键值和*<Value>*标签的值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ebs:StartSnapshot",
                "ebs:PutSnapshotBlock",
                "ebs:CompleteSnapshot"
            ],
            "Resource": "arn:aws:ec2:*::snapshot/*",
            "Condition": {
                "StringEqualsIgnoreCase": {
                    "aws:ResourceTag/<Key>": "<Value>"
                }
            }
        }
    ]
}
```

------

以下策略允许使用所有 EBS Dire APIs ct。只有在指定了父快照 ID 时，它才允许执行 `StartSnapshot` 操作。因此，此策略会阻止在不使用父快照的情况下开始新快照的功能。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ebs:*", 
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ebs:ParentSnapshot": "arn:aws:ec2:*::snapshot/*"
                }
            }
        }
    ]
}
```

------

以下策略允许使用所有 EBS Dire APIs ct。它还允许只为新快照创建 `user` 标签键。此策略还确保用户有权创建标签。`StartSnapshot` 操作是唯一可以指定标签的操作。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ebs:*", 
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": "user"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*"
        }
    ]
}
```

------

以下策略仅允许在特定时间范围内对账户中的所有快照使用所有*写入* EBS direc APIs t。此策略授权 APIs 根据`aws:CurrentTime`全局条件密钥直接使用 EBS。在策略中，请务必将显示的日期和时间范围替换为适用于您的策略的日期和时间范围。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ebs:StartSnapshot",
                "ebs:PutSnapshotBlock",
                "ebs:CompleteSnapshot"
            ],
            "Resource": "arn:aws:ec2:*::snapshot/*",
            "Condition": {
                "DateGreaterThan": {
                    "aws:CurrentTime": "2018-05-29T00:00:00Z"
                },
                "DateLessThan": {
                    "aws:CurrentTime": "2020-05-29T23:59:59Z"
                }
            }
        }
    ]
}
```

------

有关更多信息，请参阅《IAM 用户指南》**中的[更改用户权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

## 使用权限 AWS KMS keys
<a name="ebsapi-kms-permissions"></a>

以下策略授予使用特定 KMS 密钥解密已加密快照的权限。该策略还授予使用 EBS 加密的默认 KMS 密钥来加密新快照的权限。在策略中，*<Region>*替换为 KMS 密钥的区域、*<AccountId>* KMS 密钥的 AWS 账户 ID 和 *<KeyId>* KMS 密钥的 ID。

**注意**  
默认情况下，账户中的所有委托人都可以访问用于 Amazon EBS 加密的默认 AWS 托管 KMS 密钥，并且可以将其用于 EBS 加密和解密操作。如果您使用的是客户托管式密钥，则必须创建新的密钥策略或修改客户托管式密钥的现有密钥策略，以便授予主体对客户托管式密钥的访问权限。有关更多信息，请参阅《*AWS Key Management Service 开发人员指南*》中的[在 AWS KMS中使用密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。

**提示**  
为遵循最小特权原则，请不要允许对 `kms:CreateGrant` 拥有完全访问权限。相反，使用`kms:GrantIsForAWSResource`条件密钥允许用户仅在 AWS 服务代表用户创建授权时才允许用户在 KMS 密钥上创建授权，如以下示例所示。

有关更多信息，请参阅《IAM 用户指南》**中的[更改用户权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

# 直接使用 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>

------
#### [ 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 – 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` 数组。

------
#### [ 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 ]

以下[ListChangedBlocks](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
```

------

# 使用 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.aws.amazon.com/zh_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>

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

以下 [start-snapshot](https://docs.aws.amazon.com/cli/latest/reference/ebs/start-snapshot.html) 示例命令启动 `8` GiB 快照，使用快照 `snap-123EXAMPLE1234567` 作为父快照。新快照将是父快照的增量快照。如果在指定的 `60` 分钟超时期限内，没有针对快照发出放置或完成请求，则快照将转为错误状态。`550e8400-e29b-41d4-a716-446655440000` 客户端令牌确保请求的幂等性。如果省略了客户端令牌， AWS 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、 AWS 账户 ID、状态、卷大小（以 GiB 为单位）以及快照中数据块的大小。快照以 `pending` 状态启动。在后续 `put-snapshot-block` 命令中指定快照 ID 以将数据写入快照，然后使用 `complete-snapshot` 命令完成快照并将其状态更改为 `completed`。

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

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

以下[StartSnapshot](https://docs.aws.amazon.com/ebs/latest/APIReference/API_StartSnapshot.html)示例请求使用快照`snap-123EXAMPLE1234567`作为父快照启动 `8` GiB 快照。新快照将是父快照的增量快照。如果在指定的 `60` 分钟超时期限内，没有针对快照发出放置或完成请求，则快照将转为错误状态。`550e8400-e29b-41d4-a716-446655440000` 客户端令牌确保请求的幂等性。如果省略了客户端令牌， AWS 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、 AWS 账户 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>

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

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

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

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

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

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

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

以下[CompleteSnapshot](https://docs.aws.amazon.com/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"}
```

------

# EBS Direct 的加密结果 APIs
<a name="ebsapis-using-encryption"></a>

使用启动新快照时 [ StartSnapshot](https://docs.aws.amazon.com/ebs/latest/APIReference/API_StartSnapshot.html)，加密状态取决于您为**已加密**、和指定的值 **KmsKeyArn**ParentSnapshotId****，以及您的 AWS 账户是否在[默认情况下启用了加密](encryption-by-default.md)功能。

**注意**  
您可能需要额外的 IAM 权限才能直接使用 APIs 带加密功能的 EBS。有关更多信息，请参阅 [使用权限 AWS KMS keys](ebsapi-permissions.md#ebsapi-kms-permissions)。
如果您的 AWS 账户默认启用 Amazon EBS 加密，则无法创建未加密的快照。
如果您的 AWS 账户默认启用 Amazon EBS 加密，则无法使用未加密的父快照启动新快照。您必须首先通过复制父快照来对其进行加密。有关更多信息，请参阅 [复制 Amazon EBS 快照](ebs-copy-snapshot.md)。

**Topics**
+ [

## 加密结果：未加密父快照
](#ebs-direct-api-unencr-outcomes-parent)
+ [

## 加密结果：已加密父快照
](#ebs-direct-api-encr-outcomes-parent)
+ [

## 加密结果：无父快照
](#ebs-direct-api-encr-outcomes-noparent)

## 加密结果：未加密父快照
<a name="ebs-direct-api-unencr-outcomes-parent"></a>

下表描述了指定未加密父快照时每种可能的设置组合的加密结果。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebsapis-using-encryption.html)

## 加密结果：已加密父快照
<a name="ebs-direct-api-encr-outcomes-parent"></a>

下表描述了指定已加密父快照时每种可能的设置组合的加密结果。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebsapis-using-encryption.html)

## 加密结果：无父快照
<a name="ebs-direct-api-encr-outcomes-noparent"></a>

下表描述了未使用父快照时每种可能的设置组合的加密结果。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ebs/latest/userguide/ebsapis-using-encryption.html)

\$1 此默认 KMS 密钥可以是客户托管密钥，也可以是用于 Amazon EBS 加密的默认 AWS 托管 KMS 密钥。

# 使用 EBS 直接 APIs 校验和来验证快照数据
<a name="ebsapis-using-checksums"></a>

该 GetSnapshotBlock 操作返回快照块中的数据，该 PutSnapshotBlock 操作将数据添加到快照中的区块中。传输的数据块数据不在签名版本 4 签名流程中进行签名。因此，使用校验和来验证数据的完整性，如下所示：
+ **当您使用 GetSnapshotBlock 操作时，响应会使用 X-amz-checkSum 标头为区块数据提供 Base64 编码的 SHA256 校验和，并使用 **x-amz-checksum 算法标头为校验**和算法提供校验和算法。**使用返回的校验和验证数据的完整性。如果生成的校验和与 Amazon EBS 提供的校验和不匹配，您应将数据视为无效，然后重试请求。
+ **使用 PutSnapshotBlock 操作时，您的请求必须使用 X-amz-checkSum 标头为区块数据提供 Base64 编码的 SHA256 校验和，以及使用 **x-amz-checksum 算法标头的校验**和算法。**您提供的校验和将根据 Amazon EBS 生成的校验和进行验证，以验证数据的完整性。如果校验和不相符，请求将失败。
+ 使用 CompleteSnapshot 操作时，您的请求可以选择为添加到快照的完整数据集提供 Base64 编码的汇 SHA256 总校验和。使用 **x-amz-Checksum** 标头提供校验和，使用 **x-amz-Checksum-Algorithm** 标头提供校验和算法，并使用 **x-amz-Checksum-Aggregation-Method** 标头提供校验和聚合方法。要使用线性聚合方法生成聚合校验和，请按区块索引的升序排列每个写入区块的校验和，将它们连接成单个字符串，然后使用算法生成整个字符串的校验和。 SHA256 

这些操作中的校验和是签名版本 4 签名流程的一部分。

# 确保 API 请求中的等性 StartSnapshot
<a name="ebs-direct-api-idempotency"></a>

幂等性确保 API 请求仅完成一次。对于幂等请求，如果原始请求成功完成，则后续重试将返回原始成功请求的结果，它们不会有额外的影响。

[ StartSnapshot](https://docs.aws.amazon.com/ebs/latest/APIReference/API_StartSnapshot.html)*API 使用客户端令牌支持等性。*客户端令牌是您在发出 API 请求时指定的唯一字符串。如果在某个 API 请求成功完成后，您使用相同的客户端令牌和相同的请求参数重试该请求，则返回原始请求的结果。如果使用相同的客户端令牌重试请求，但更改了一个或多个请求参数，则返回 `ConflictException` 错误。

如果您未指定自己的客户端令牌，则会 AWS SDKs 自动为请求生成客户端令牌，以确保该令牌是等效的。

客户端令牌可以是包含最多 64 个 ASCII 字符的任意字符串。您不应为不同的请求重复使用相同的客户端令牌。

**使用 API 使用您自己的客户端令牌发出等效 StartSnapshot 请求**  
指定 `ClientToken` 请求参数。

```
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
}
```

**要使用您自己的客户端令牌发出等效 StartSnapshot 请求，请使用 AWS CLI**  
指定 `client-token` 请求参数。

```
$ C:\> aws ebs start-snapshot --region us-east-2 --volume-size 8 --parent-snapshot snap-123EXAMPLE1234567 --timeout 60 --client-token 550e8400-e29b-41d4-a716-446655440000
```

# EBS direct 的错误重试次数 APIs
<a name="error-retries"></a>

为返回错误响应的请求**AWS SDKs**实现自动重试逻辑。您可以为配置重试设置。 AWS SDKs有关更多信息，请参阅 SDK 文档。

**AWS CLI** 可以配置为自动重试部分失败的请求。有关为配置重试次数的更多信息 AWS CLI，请参阅《*AWS Command Line Interface 用户*指南》中的[AWS CLI 重试次数](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-retries.html)。

**AWS 查询 API** 不支持失败的请求的重试逻辑。如果您使用的是 HTTP 或 HTTPS 请求，则必须在客户端应用程序中实现重试逻辑。

下表显示了可能的 API 错误响应。部分 API 错误是可重试的。客户端应用程序始终可以重试收到可重试错误的失败请求。


| 错误 | 响应代码 | 说明 | 由以下对象引发 | 可重试？ | 
| --- | --- | --- | --- | --- | 
| InternalServerException | 500 | 由于网络或 AWS 服务器端问题，请求失败。 | 全部 APIs | 是 | 
| ThrottlingException | 400 | API 请求的数量已超过账户允许的最大 API 请求节流限制。 | 全部 APIs | 是 | 
| RequestThrottleException | 400 | API 请求的数量已超过快照允许的最大 API 请求节流限制。 | GetSnapshotBlock \$1 PutSnapshotBlock | 是 | 
| 显示消息“Failed to read block data”的 ValidationException | 400 | 提供的数据块不可读。 | PutSnapshotBlock | 是 | 
| 显示任何其他消息的 ValidationException | 400 | 请求语法格式错误，或输入不满足 AWS 服务规定的约束。 | 全部 APIs | 否 | 
| ResourceNotFoundException | 404 | 指定的快照 ID 不存在。 | 全部 APIs | 否 | 
| ConflictException | 409 | 指定的客户端令牌曾在具有不同请求参数的类似请求中使用过。有关更多信息，请参阅 [确保 API 请求中的等性 StartSnapshot](ebs-direct-api-idempotency.md)。 | StartSnapshot | 否 | 
| AccessDeniedException | 403 | 您无权执行请求的操作。 | 全部 APIs | 否 | 
| ServiceQuotaExceededException | 402 | 请求失败，因为执行请求将超出您账户的一项或多项相关服务限额。 | 全部 APIs | 否 | 
| InvalidSignatureException | 403 | 请求授权签名已过期。必须刷新授权签名才能重试请求。 | 全部 APIs | 否 | 

# 优化 EBS Direct 的性能 APIs
<a name="ebsapi-performance"></a>

您可以并发运行 API 请求。假设 PutSnapshotBlock 延迟为 100 毫秒，则一个线程可以在一秒钟内处理 10 个请求。此外，假设您的客户端应用程序创建多个线程和连接（例如 100 个连接），那么它每秒可以发出 1000（10 \$1 100）个请求。这对应于大约每秒 500 MB 的吞吐量。

以下列表包含在您应用程序中需要了解的几点：
+ 每个线程是否使用单独的连接？ 如果应用程序上的连接受限制，则多线程将等待可用连接，而您会发现吞吐量较低。
+ 应用程序的两个放置请求之间是否有任何等待时间？ 这将降低线程的有效吞吐量。
+ 实例的带宽限制-如果实例上的带宽由其他应用程序共享，则可能会限制 PutSnapshotBlock请求的可用吞吐量。

请确保注意账户中可能运行的其他工作负载，以避免瓶颈。您还应该在 EBS 直接 APIs 工作流程中构建重试机制，以处理限制、超时和服务不可用。

查看 EBS 直接 APIs 服务配额，确定每秒可以运行的最大 API 请求数。有关更多信息，请参阅 *AWS 一般参考* 中的 [Amazon Elastic Block Store 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#w542aab9d130b7c15)。

# EBS Direct 的服务端点 APIs
<a name="using-endpoints"></a>

*端点*是用作 AWS Web 服务入口点的 URL。EBS Direct APIs 支持以下终端节点类型：
+ IPv4 端点
+ 同时 IPv4 支持和的双栈端点 IPv6
+ FIPS 端点

当您发出请求时，您可以指定要使用的端点和区域。如果您未指定终端节点，则默认使用该 IPv4 终端节点。要使用不同的端点类型，您必须在请求中指定。有关如何执行此操作的示例，请参阅[指定端点](#examples)。

有关区域的更多信息，请参阅《*Amazon EC2 用户指南*》中的[区域和可用区](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)。有关 EBS direct 的终端[节点列表 APIs，请参阅 APIs中的 EBS 直接](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#ebs_direct_apis)终端节点。*Amazon Web Services 一般参考*

**Topics**
+ [

## IPv4 端点
](#ipv4)
+ [

## 双栈（IPv4 和 IPv6）端点
](#ipv6)
+ [

## FIPS 端点
](#fips)
+ [

## 指定端点
](#examples)

## IPv4 端点
<a name="ipv4"></a>

IPv4 端点仅支持 IPv4 流量。 IPv4 终端节点适用于所有区域。

EBS Direct 仅 APIs 支持可用于发出请求的区域 IPv4 终端节点。您必须将区域指定为端点名称的一部分。端点名称使用以下命名约定：
+ `ebs.region.amazonaws.com`

例如，要将请求定向到`us-east-2` IPv4 终端节点，必须指定`ebs.us-east-2.amazonaws.com`为终端节点。有关 EBS direct 的终端[节点列表 APIs，请参阅 APIs中的 EBS 直接](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#ebs_direct_apis)终端节点。*Amazon Web Services 一般参考*

**定价**  
您无需为使用同一地区的 IPv4 终端节点在 EBS 直接 API 和 Amazon EC2 实例之间直接传输数据付费。但是，如果有中间服务，例如 AWS PrivateLink 终端节点、NAT 网关或 Amazon VPC 传输网关，则需要向您收取相关费用。

## 双栈（IPv4 和 IPv6）端点
<a name="ipv6"></a>

双栈端点同时支持 IPv4 和 IPv6 流量。双堆栈端点适用于所有区域。

要使用 IPv6，必须使用双堆栈终端节点。当您向双栈终端节点发出请求时，终端节点 URL 会解析为 IPv6 或 IPv4 地址，具体取决于您的网络和客户端使用的协议。

EBS Direct 仅 APIs 支持区域双栈终端节点，这意味着您必须在终端节点名称中指定区域。双堆栈端点名称使用以下命名约定：
+ `ebs.region.api.aws`

例如，`eu-west-1` 区域的双堆栈端点名称是 `ebs.eu-west-1.api.aws`。有关 EBS direct 的终端[节点列表 APIs，请参阅 APIs中的 EBS 直接](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#ebs_direct_apis)终端节点。*Amazon Web Services 一般参考*

**定价**  
在相同区域使用双堆栈端点时，EBS 直接 API 和 Amazon EC2 实例之间直接传输数据是免费的。但是，如果有中间服务，例如 AWS PrivateLink 终端节点、NAT 网关或 Amazon VPC 传输网关，则需要向您收取相关费用。

## FIPS 端点
<a name="fips"></a>

EBS direct APIs 为以下区域提供经过 FIPS 验证 IPv4 和双堆栈（IPv4 和 IPv6）的终端节点：
+ `us-east-1` – 美国东部（弗吉尼亚州北部）
+ `us-east-2` – 美国东部（俄亥俄州）
+ `us-west-1` – 美国西部（北加利福尼亚）
+ `us-west-2` – 美国西部（俄勒冈州）
+ `ca-central-1` – 加拿大（中部）
+ `ca-west-1`：加拿大西部（卡尔加里）

**FIPS IPv4 端点**使用以下命名约定:`ebs-fips.region.amazonaws.com`. 例如，的 FIPS IPv4 终端节点`us-east-1`是`ebs-fips.us-east-1.amazonaws.com`。

**FIPS 双堆栈端点**使用以下命名约定：`ebs-fips.region.api.aws`。例如，`us-east-1` 的 FIPS 双堆栈端点是 `ebs-fips.us-east-1.api.aws`。

有关 FIPS 端点的更多信息，请参阅 *Amazon Web Services 一般参考* 中的 [FIPS 端点](https://docs.aws.amazon.com/general/latest/gr/rande.html#FIPS-endpoints)。

## 指定端点
<a name="examples"></a>

本节提供了一些在发出请求时如何指定端点的示例。

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

以下示例显示如何使用 AWS CLI为`us-east-2`区域指定端点。
+ **双堆栈**

  ```
  aws ebs list-snapshot-blocks --snapshot-id snap-0987654321 --starting-block-index 1000 --endpoint-url https://ebs.us-east-2.api.aws
  ```
+ **IPv4**

  ```
  aws ebs list-snapshot-blocks --snapshot-id snap-0987654321 --starting-block-index 1000 --endpoint-url https://ebs.us-east-2.amazonaws.com
  ```

------
#### [ AWS SDK for Java 2.x ]

以下示例显示如何使用 AWS SDK for Java 2.x为`us-east-2`区域指定端点。
+ **双堆栈**

  ```
  AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder.EndpointConfiguration("https://ebs.us-east-2.api.aws", "us-east-2");
  AmazonEBS ebs = AmazonEBSClientBuilder.standard()
      .withEndpointConfiguration(config)
      .build();
  ```
+ **IPv4**

  ```
  AwsClientBuilder.EndpointConfiguration config = new AwsClientBuilder.EndpointConfiguration("https://ebs.us-east-2.amazonaws.com", "us-east-2");
  AmazonEBS ebs = AmazonEBSClientBuilder.standard()
      .withEndpointConfiguration(config)
      .build();
  ```

------
#### [ AWS SDK for Go ]

以下示例显示如何使用 适用于 Go 的 AWS SDK为`us-east-2`区域指定端点。
+ **双堆栈**

  ```
  sess := session.Must(session.NewSession())
  svc := ebs.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast2RegionID),
      Endpoint: aws.String("https://ebs.us-east-2.api.aws")
  })
  ```
+ **IPv4**

  ```
  sess := session.Must(session.NewSession())
  svc := ebs.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast2RegionID),
      Endpoint: aws.String("https://ebs.us-east-2.amazonaws.com")
  })
  ```

------

# AWS EBS Direct 的 SDK 代码示例 APIs
<a name="sdk"></a>

以下代码示例演示如何将 EBS 直接 APIs 与 AWS 软件开发套件 (SDK) 配合使用。

**Topics**
+ [StartSnapshot](#sdk-StartSnapshot)
+ [PutSnapshotBlock](#sdk-PutSnapshotBlock)
+ [CompleteSnapshot](#sdk-CompleteSnapshot)

## `StartSnapshot`与 AWS SDK 或 CLI 配合使用
<a name="sdk-StartSnapshot"></a>

以下代码示例演示了如何使用 `StartSnapshot`。

------
#### [ Rust ]

**适用于 Rust 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/ebs#code-examples)中查找完整示例，了解如何进行设置和运行。

```
async fn start(client: &Client, description: &str) -> Result<String, Error> {
    let snapshot = client
        .start_snapshot()
        .description(description)
        .encrypted(false)
        .volume_size(1)
        .send()
        .await?;

    Ok(snapshot.snapshot_id.unwrap())
}
```
+  有关 API 的详细信息，请参阅适用[StartSnapshot](https://docs.rs/aws-sdk-ebs/latest/aws_sdk_ebs/client/struct.Client.html#method.start_snapshot)于 *Rust 的AWS SDK API 参考*。

------

## `PutSnapshotBlock`与 AWS SDK 或 CLI 配合使用
<a name="sdk-PutSnapshotBlock"></a>

以下代码示例演示了如何使用 `PutSnapshotBlock`。

------
#### [ Rust ]

**适用于 Rust 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/ebs#code-examples)中查找完整示例，了解如何进行设置和运行。

```
async fn add_block(
    client: &Client,
    id: &str,
    idx: usize,
    block: Vec<u8>,
    checksum: &str,
) -> Result<(), Error> {
    client
        .put_snapshot_block()
        .snapshot_id(id)
        .block_index(idx as i32)
        .block_data(ByteStream::from(block))
        .checksum(checksum)
        .checksum_algorithm(ChecksumAlgorithm::ChecksumAlgorithmSha256)
        .data_length(EBS_BLOCK_SIZE as i32)
        .send()
        .await?;

    Ok(())
}
```
+  有关 API 的详细信息，请参阅适用[PutSnapshotBlock](https://docs.rs/aws-sdk-ebs/latest/aws_sdk_ebs/client/struct.Client.html#method.put_snapshot_block)于 *Rust 的AWS SDK API 参考*。

------

## `CompleteSnapshot`与 AWS SDK 或 CLI 配合使用
<a name="sdk-CompleteSnapshot"></a>

以下代码示例演示了如何使用 `CompleteSnapshot`。

------
#### [ Rust ]

**适用于 Rust 的 SDK**  
 还有更多相关信息 GitHub。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/ebs#code-examples)中查找完整示例，了解如何进行设置和运行。

```
async fn finish(client: &Client, id: &str) -> Result<(), Error> {
    client
        .complete_snapshot()
        .changed_blocks_count(2)
        .snapshot_id(id)
        .send()
        .await?;

    println!("Snapshot ID {}", id);
    println!("The state is 'completed' when all of the modified blocks have been transferred to Amazon S3.");
    println!("Use the get-snapshot-state code example to get the state of the snapshot.");

    Ok(())
}
```
+  有关 API 的详细信息，请参阅适用[CompleteSnapshot](https://docs.rs/aws-sdk-ebs/latest/aws_sdk_ebs/client/struct.Client.html#method.complete_snapshot)于 *Rust 的AWS SDK API 参考*。

------

# 在 VPC 和 EBS Direct 之间创建私有连接 APIs
<a name="ebs-apis-vpc-endpoints"></a>

您可以创建 APIs 由提供支持的接*口 VPC 终端节点，从而在您的 VPC* 和 EBS 之间直接建立私有连接。[AWS PrivateLink](https://aws.amazon.com/privatelink/)您可以直接访问 EBS， APIs 就像在 VPC 中一样，无需使用互联网网关、NAT 设备、VPN 连接或 AWS Direct Connect 连接。您的 VPC 中的实例不需要公有 IP 地址即可直接 APIs与 EBS 通信。

我们将在您为接口端点启用的每个子网中创建一个端点网络接口。

有关更多信息，请参阅*AWS PrivateLink 指南 AWS PrivateLink*中的[AWS 服务 通过访问](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)。

## EBS 直接 APIs VPC 终端节点的注意事项
<a name="vpc-endpoint-considerations"></a>

在为 EBS Direct 设置接口 VPC 终端节点之前 APIs，请查看*AWS PrivateLink 指南*中的[注意事项](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#considerations-interface-endpoints)。

默认情况下，允许通过终端节点对 EBS D APIs irect 进行完全访问。您可以使用 VPC 端点策略控制对接口端点的访问。您可以将终端节点策略附加到控制直接 APIs访问 EBS 的 VPC 终端节点。该策略指定以下信息：
+ 可执行操作的**主体**。
+ 可执行的**操作**。
+ 可对其执行操作的**资源**。

有关更多信息，请参阅 *Amazon VPC 用户指南*中的[使用 VPC 终端节点控制对服务的访问](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。

以下是 EBS Direc APIs t 的终端节点策略示例。当连接到终端节点时，此策略授予对所有资源的所有 EBS 直接 APIs 操作的访问权限，但标有密钥`Environment`和值`Test`的快照除外。

```
{
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ebs:*",
            "Principal": "*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "Test"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "ebs:*",
            "Principal": "*",
            "Resource": "*"
        }
    ]
}
```

## 为 EBS Direct 创建接口 VPC 终端节点 APIs
<a name="vpc-endpoint-create"></a>

您可以 APIs 使用 Amazon VPC 控制台或 AWS Command Line Interface (AWS CLI) 直接为 EBS 创建 VPC 终端节点。有关更多信息，请参阅 *AWS PrivateLink 指南*中的[创建 VPC 终端节点](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

 APIs 使用以下服务名称之一为 EBS Direct 创建 VPC 终端节点：
+ `com.amazonaws.region.ebs`
+ `com.amazonaws.region.ebs-fips`：创建符合联邦信息处理标准（FIPS）出版物 140-2 美国政府标准的接口 VPC 端点。
**注意**  
可以为以下区域创建符合 FIPS 标准的接口 VPC 端点：`us-east-1` \$1 `us-east-2` \$1 `us-west-1` \$1 `us-west-2` \$1 `ca-central-1` \$1 `ca-west-1`。符合 FIPS 的接口 VPC 终端节点同时支持和流量 IPv4 。 IPv6 

例如，如果您为终端节点启用私有 DNS，则可以使用该区域的默认 DNS 名称直接 APIs 向 EBS 发出 API 请求。`ebs.us-east-1.amazonaws.com`

# 使用记录 EBS 直接 APIs 呼叫 AWS CloudTrail
<a name="logging-ebs-apis-using-cloudtrail"></a>

EBS direc APIs AWS CloudTrail t 与一项服务集成，该服务提供用户、角色或 AWS 服务所执行操作的记录。 CloudTrail 将直接拨给 EBS 的呼叫 APIs 作为事件进行捕获。捕获的呼叫包括来自的调用 AWS 管理控制台 以及对 EBS 直接 APIs的代码调用。使用收集的信息 CloudTrail，您可以确定向 EBS direct 发出的请求 APIs、发出请求的 IP 地址、发出请求的时间以及其他详细信息。

每个事件或日志条目都包含有关生成请求的人员信息。身份信息有助于您确定以下内容：
+ 请求是使用根用户凭证还是用户凭证发出的。
+ 请求是否代表 IAM Identity Center 用户发出。
+ 请求是使用角色还是联合用户的临时安全凭证发出的。
+ 请求是否由其他 AWS 服务发出。

CloudTrail 在您创建账户 AWS 账户 时在您的账户中处于活动状态，并且您自动可以访问 CloudTrail **活动历史记录**。 CloudTrail **事件历史记录**提供了过去 90 天中记录的管理事件的可查看、可搜索、可下载且不可变的记录。 AWS 区域有关更多信息，请参阅《*AWS CloudTrail 用户指南》*中的 “[使用 CloudTrail 事件历史记录](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)”。查看**活动历史记录**不 CloudTrail收取任何费用。

要持续记录 AWS 账户 过去 90 天内的事件，请创建跟踪或 [CloudTrailLake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html) 事件数据存储。

**CloudTrail 步道**  
*跟踪*允许 CloudTrail 将日志文件传输到 Amazon S3 存储桶。使用创建的所有跟踪 AWS 管理控制台 都是多区域的。您可以通过使用 AWS CLI创建单区域或多区域跟踪。建议创建多区域跟踪，因为您可以捕获账户 AWS 区域 中的所有活动。如果您创建单区域跟踪，则只能查看跟踪的 AWS 区域中记录的事件。有关跟踪的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[为您的 AWS 账户创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)和[为组织创建跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/creating-trail-organization.html)。  
通过创建跟踪，您可以免费将正在进行的管理事件的一份副本传送到您的 Amazon S3 存储桶，但是，会收取 Amazon S3 存储费用。 CloudTrail 有关 CloudTrail 定价的更多信息，请参阅[AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。有关 Amazon S3 定价的信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

**CloudTrail 湖泊事件数据存储**  
CloudTrail L@@ *ak* e 允许你对自己的事件运行基于 SQL 的查询。 CloudTrail Lake 将基于行的 JSON 格式的现有事件转换为 [Apache ORC](https://orc.apache.org/) 格式。ORC 是一种针对快速检索数据进行优化的列式存储格式。事件将被聚合到*事件数据存储*中，它是基于您通过应用[高级事件选择器](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake-concepts.html#adv-event-selectors)选择的条件的不可变的事件集合。应用于事件数据存储的选择器用于控制哪些事件持续存在并可供您查询。有关 CloudTrail Lake 的更多信息，[请参阅*AWS CloudTrail 用户指南*中的使用 AWS CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html)。  
CloudTrail 湖泊事件数据存储和查询会产生费用。创建事件数据存储时，您可以选择要用于事件数据存储的[定价选项](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake-manage-costs.html#cloudtrail-lake-manage-costs-pricing-option)。定价选项决定了摄取和存储事件的成本，以及事件数据存储的默认和最长保留期。有关 CloudTrail 定价的更多信息，请参阅[AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

## EBS 直接 APIs 数据事件位于 CloudTrail
<a name="cloudtrail-data-events"></a>

[数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events)提供有关对在资源上或资源内执行的资源操作的信息。这些也称为数据面板操作。数据事件通常是高容量活动。默认情况下， CloudTrail 不记录数据事件。 CloudTrail **事件历史**记录不记录数据事件。

记录数据事件将收取额外费用。有关 CloudTrail 定价的更多信息，请参阅[AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

您可以使用 CloudTrail 控制台、 AWS CLI或 CloudTrail API 操作记录 EBS 直接 APIs 资源类型的数据事件。有关如何记录数据事件的更多信息，请参阅《AWS CloudTrail 用户指南》**中的[使用 AWS 管理控制台记录数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events-console)和[使用 AWS Command Line Interface记录数据事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#creating-data-event-selectors-with-the-AWS-CLI)。

您可以将以下 EBS 直接 APIs 操作记录为数据事件。
+ [ListSnapshotBlocks](https://docs.aws.amazon.com/ebs/latest/APIReference/API_ListSnapshotBlocks.html)
+ [ListChangedBlocks](https://docs.aws.amazon.com/ebs/latest/APIReference/API_ListChangedBlocks.html)
+ [ GetSnapshotBlock](https://docs.aws.amazon.com/ebs/latest/APIReference/API_GetSnapshotBlock.html)
+ [PutSnapshotBlock](https://docs.aws.amazon.com/ebs/latest/APIReference/API_PutSnapshotBlock.html)

**注意**  
如果您对与您共享的快照执行操作，则不会将数据事件发送到拥有该快照的 AWS 账户。

## EBS 直接 APIs 管理活动位于 CloudTrail
<a name="cloudtrail-management-events"></a>

[管理事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-management-events-with-cloudtrail.html#logging-management-events)提供有关对中的资源执行的管理操作的信息 AWS 账户。这些也称为控制面板操作。默认情况下， CloudTrail 记录管理事件。

EBS Direct APIs 服务将以下控制平面操作记录 CloudTrail 为管理事件。
+ [ StartSnapshot](https://docs.aws.amazon.com/ebs/latest/APIReference/API_StartSnapshot.html)
+ [ CompleteSnapshot](https://docs.aws.amazon.com/ebs/latest/APIReference/API_CompleteSnapshot.html)

## EBS 直接 APIs 事件示例
<a name="understanding-service-name-entries"></a>

事件代表来自任何来源的单个请求，包括有关所请求的 API 操作、操作的日期和时间、请求参数等的信息。 CloudTrail 日志文件不是公共 API 调用的有序堆栈跟踪，因此事件不会按任何特定顺序出现。

以下是 EBS direc APIs t 的示例 CloudTrail 事件。

------
#### [ StartSnapshot ]

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "123456789012",
        "arn": "arn:aws:iam::123456789012:root",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2020-07-03T23:27:26Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "StartSnapshot",
    "awsRegion": "eu-west-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "PostmanRuntime/7.25.0",
    "requestParameters": {
        "volumeSize": 8,
        "clientToken": "token",
        "encrypted": true
    },
    "responseElements": {
        "snapshotId": "snap-123456789012",
        "ownerId": "123456789012",
        "status": "pending",
        "startTime": "Jul 3, 2020 11:27:26 PM",
        "volumeSize": 8,
        "blockSize": 524288,
        "kmsKeyArn": "HIDDEN_DUE_TO_SECURITY_REASONS"
    },
    "requestID": "be112233-1ba5-4ae0-8e2b-1c302EXAMPLE",
    "eventID": "6e12345-2a4e-417c-aa78-7594fEXAMPLE",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}
```

------
#### [ CompleteSnapshot ]

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "123456789012",
        "arn": "arn:aws:iam::123456789012:root",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2020-07-03T23:28:24Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "CompleteSnapshot",
    "awsRegion": "eu-west-1",
    "sourceIPAddress": "192.0.2.0",
    "userAgent": "PostmanRuntime/7.25.0",
    "requestParameters": {
        "snapshotId": "snap-123456789012",
        "changedBlocksCount": 5
    },
    "responseElements": {
        "status": "completed"
    },
    "requestID": "be112233-1ba5-4ae0-8e2b-1c302EXAMPLE",
    "eventID": "6e12345-2a4e-417c-aa78-7594fEXAMPLE",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}
```

------
#### [ ListSnapshotBlocks ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAT4HPB2AO3JEXAMPLE",
        "arn": "arn:aws:iam::123456789012:user/user",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2021-06-03T00:32:46Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "ListSnapshotBlocks",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "111.111.111.111",
    "userAgent": "PostmanRuntime/7.28.0",
    "requestParameters": {
        "snapshotId": "snap-abcdef01234567890",
        "maxResults": 100,
        "startingBlockIndex": 0
    },
    "responseElements": null,
    "requestID": "example6-0e12-4aa9-b923-1555eexample",
    "eventID": "example4-218b-4f69-a9e0-2357dexample",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::EC2::Snapshot",
            "ARN": "arn:aws:ec2:us-west-2::snapshot/snap-abcdef01234567890"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "123456789012",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-SHA",
        "clientProvidedHostHeader": "ebs.us-west-2.amazonaws.com"
    }
}
```

------
#### [ ListChangedBlocks ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAT4HPB2AO3JEXAMPLE",
        "arn": "arn:aws:iam::123456789012:user/user",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2021-06-02T21:11:46Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "ListChangedBlocks",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "111.111.111.111",
    "userAgent": "PostmanRuntime/7.28.0",
    "requestParameters": {
        "firstSnapshotId": "snap-abcdef01234567890",
        "secondSnapshotId": "snap-9876543210abcdef0",
        "maxResults": 100,
        "startingBlockIndex": 0
    },
    "responseElements": null,
    "requestID": "example0-f4cb-4d64-8d84-72e1bexample",
    "eventID": "example3-fac4-4a78-8ebb-3e9d3example",
    "readOnly": true,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::EC2::Snapshot",
            "ARN": "arn:aws:ec2:us-west-2::snapshot/snap-abcdef01234567890"
        },
       {
            "accountId": "123456789012",
            "type": "AWS::EC2::Snapshot",
            "ARN": "arn:aws:ec2:us-west-2::snapshot/snap-9876543210abcdef0"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "123456789012",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-SHA",
        "clientProvidedHostHeader": "ebs.us-west-2.amazonaws.com"
    }
}
```

------
#### [ GetSnapshotBlock ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAT4HPB2AO3JEXAMPLE",
        "arn": "arn:aws:iam::123456789012:user/user",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2021-06-02T20:43:05Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "GetSnapshotBlock",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "111.111.111.111",
    "userAgent": "PostmanRuntime/7.28.0",
    "requestParameters": {
        "snapshotId": "snap-abcdef01234567890",
        "blockIndex": 1,
        "blockToken": "EXAMPLEiL5E3pMPFpaDWjExM2/mnSKh1mQfcbjwe2mM7EwhrgCdPAEXAMPLE"
    },
    "responseElements": null,
    "requestID": "examplea-6eca-4964-abfd-fd9f0example",
    "eventID": "example6-4048-4365-a275-42e94example",
    "readOnly": true,
    "resources": [
        {
          "accountId": "123456789012",
          "type": "AWS::EC2::Snapshot",
          "ARN": "arn:aws:ec2:us-west-2::snapshot/snap-abcdef01234567890"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "123456789012",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-SHA",
        "clientProvidedHostHeader": "ebs.us-west-2.amazonaws.com"
    }
}
```

------
#### [ PutSnapshotBlock ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "AIDAT4HPB2AO3JEXAMPLE",
        "arn": "arn:aws:iam::123456789012:user/user",
        "accountId": "123456789012",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "userName": "user"
    },
    "eventTime": "2021-06-02T21:09:17Z",
    "eventSource": "ebs.amazonaws.com",
    "eventName": "PutSnapshotBlock",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "111.111.111.111",
    "userAgent": "PostmanRuntime/7.28.0",
    "requestParameters": {
        "snapshotId": "snap-abcdef01234567890",
        "blockIndex": 1,
        "dataLength": 524288,
        "checksum": "exampleodSGvFSb1e3kxWUgbOQ4TbzPurnsfVexample",
        "checksumAlgorithm": "SHA256"
    },
    "responseElements": {
        "checksum": "exampleodSGvFSb1e3kxWUgbOQ4TbzPurnsfVexample",
        "checksumAlgorithm": "SHA256"
    },
    "requestID": "example3-d5e0-4167-8ee8-50845example",
    "eventID": "example8-4d9a-4aad-b71d-bb31fexample",
    "readOnly": false,
    "resources": [
        {
            "accountId": "123456789012",
            "type": "AWS::EC2::Snapshot",
            "ARN": "arn:aws:ec2:us-west-2::snapshot/snap-abcdef01234567890"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": false,
    "recipientAccountId": "123456789012",
    "eventCategory": "Data",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-SHA",
        "clientProvidedHostHeader": "ebs.us-west-2.amazonaws.com"
    }
}
```

------

有关 CloudTrail 录音内容的信息，请参阅《*AWS CloudTrail 用户指南》*中的[CloudTrail录制内容](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

# EBS direct 的常见问题解答 APIs
<a name="ebsapi-faq"></a>

** APIs 如果快照处于待处理状态，能否使用 EBS Direct 访问该快照？**  
不可以。仅当快照具有已完成状态时，才能访问该快照。

**EBS 直接 APIs 返回的区块索引是否按数字顺序排列？**  
可以。返回的数据块索引是唯一的，并按数字顺序排列。

**我能否提交 MaxResults 参数值低于 100 的请求？**  
不是。 您可以使用的最小 MaxResult 参数值为 100。如果您提交的请求 MaxResult 参数值低于 100，并且快照中有超过 100 个区块，则 API 将返回至少 100 个结果。

**我是否可以并发运行 API 请求？**  
您可以并发运行 API 请求。请确保注意账户中可能运行的其他工作负载，以避免瓶颈。您还应该在 EBS 直接 APIs 工作流程中构建重试机制，以处理限制、超时和服务不可用。有关更多信息，请参阅 [优化 EBS Direct 的性能 APIs](ebsapi-performance.md)。  
查看 EBS 直接 APIs 服务配额以确定每秒可以运行的 API 请求。有关更多信息，请参阅 *AWS 一般参考* 中的 [Amazon Elastic Block Store 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#w542aab9d130b7c15)。

**运行 ListChangedBlocks 操作时，即使快照中有块，是否也可能得到空响应？**  
可以。如果快照中几乎没有更改的数据块，则响应可能为空，但 API 将返回下一页令牌值。使用下一页令牌值来继续转到下一页结果。当 API 返回的下一页令牌值为 null 时，您可以确认已到达最后一页结果。

**如果 NextToken 参数与参数一起指定，则使用两者中的哪一个 StartingBlockIndex ？**  
使用 NextToken 了，而忽略 StartingBlockIndex 了。

**数据块令牌和下一个令牌的有效期是多久？**  
数据块令牌的有效期为七天，下一个令牌的有效期为 60 分钟。

**是否支持已加密快照？**  
可以。可以使用 EBS 直接 APIs访问加密快照。  
要访问加密快照，用户必须有权访问用于加密快照的 KMS 密钥和 AWS KMS 解密操作。有关分配给用户的 AWS KMS 策略，请参阅本指南前[APIs 使用 IAM 直接控制对 EBS 的访问权限](ebsapi-permissions.md)面的部分。

**是否支持公有快照？**  
不支持公有快照。

**是否 AWS Outposts 支持开启 Amazon EBS 本地快照？**  
不支持开启 AWS Outposts 的 Amazon EBS 本地快照。

**list snapshot block 是返回快照中的所有数据块索引和数据块令牌，还是仅返回那些写入数据的数据块索引和数据块令牌？**  
它只返回写入数据的数据块索引和令牌。

**我能否直接在我的账户 APIs 上获取 EBS 调用的 API 历史记录，用于安全分析和操作故障排除？**  
可以。要接收使用您的账户进行的 EBS 直接 APIs API 调用的历史记录，请打开 AWS CloudTrail 。 AWS 管理控制台有关更多信息，请参阅 [使用记录 EBS 直接 APIs 呼叫 AWS CloudTrail](logging-ebs-apis-using-cloudtrail.md)。