亚马逊AWS官方博客

使用 EBS Direct API 从任何块存储创建快照

我很高兴地宣布,现在大家可以从任何块存储数据创建 Amazon Elastic Block Store (EBS) 快照,例如本地卷、来自其他云服务提供商的卷、Amazon Simple Storage Service (S3) 上存储的现有块数据、甚至您自己的笔记本电脑上的数据。

将云作为本地基础设施的灾难恢复选择的 AWS 客户都会遇到一个同样的问题:任何以低成本、高效率的方式将本地卷数据传输到云中? 通常,您会创建临时的 Amazon Elastic Compute Cloud (EC2) 实例,挂载 Amazon Elastic Block Store (EBS) 卷,然后将数据块级别的数据从本地传输到这些新的 Amazon Elastic Block Store (EBS) 卷,为创建的每个 EBS 卷拍摄快照,最后清除临时基础设施。一些人会选择使用 CloudEndure 来简化这一过程。由于此过程十分复杂,有人也可能直接放弃,不将本地卷复制到云中。

为简化这一过程,我们在今天宣布推出 3 个新的 API,这是我们在 re:Invent 2019 大会上宣布推出的新 API 组合 EBS direct API 的一部分。我们最初推出了读取和差异比较 API。今天我们增加了写入功能。借助这 3 个新的 API,您可以从本地卷或者您希望能够在 AWS 中存储和恢复的任何块存储数据创建 Amazon Elastic Block Store (EBS) 快照。

在 EBS direct API 增加写入功能后,您现在可以从本地卷创建新快照,或者创建增量快照,以及删除快照。创建快照后,它将拥有与从 Amazon Elastic Block Store (EBS) 卷创建的快照相同的所有优势。您可以复制或在 AWS 账户之间共享这些快照,也可将它们用于快速快照还原,或者利用它们创建 Amazon Elastic Block Store (EBS) 卷。

由于可以从任何卷创建 Amazon Elastic Block Store (EBS) 快照,无需设置 Amazon Elastic Compute Cloud (EC2) 实例和 Amazon Elastic Block Store (EBS) 卷,这将帮助您简化云中灾难恢复副本的创建和管理工作并降低成本。

下面我们来详细看看此 API
您首先需要调用 StartSnapshot 来创建一个新的快照。如果快照属于增量快照,您需要传递父级快照的 ID。此外,您还可以传递要应用到快照的其他标签,或者加密这些快照并管理密钥,一切与正常的操作无二。如果您选择对快照加密,请务必查看我们的技术文档以了解相关细节和选项。

然后对于每个数据块,您需要调用 PutSnapshotBlock。此 API 有 6 个必填的参数:snapshot-idblock-indexblock-datablock-lengthchecksumchecksum-algorithm。此 API 支持的数据块长度为 512KB。您可以按任何顺序发送数据块,而 block-index 会同时确保正确的顺序。

在您发送所有数据块后,您可以使用您发送的数据块数量填写 changed-blocks-count 参数后调用 CompleteSnapshot

步骤汇总
下面是您在创建快照是必须编写的伪码。

AmazonEBS amazonEBS = AmazonEBSClientBuilder.standard()
   .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpointName, awsRegion))
   .withCredentials(credentialsProvider)
   .build();

response = amazonEBS.startSnapshot(startSnapshotRequest)
snapshotId = response.getSnapshotId();

for each (block in changeset) {
    putResponse = amazonEBS.putSnapshotBlock(putSnapshotBlockRequest);
}
amazonEBS.completeSnapshot(completeSnapshotRequest);

与往常一样,在使用此代码时,您必须拥有恰当 IAM 策略以允许调用此新 API。例如:

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

此外在创建加密快照时,您还需包含一些 KMS 相关的权限。

快照的存储成本以外,调用 PutSnapshotBlock 还会产生每次 API 调用的费用

这些新的快照 API 现已在下列 AWS 区域开放:美国东部(俄亥俄)美国东部(弗吉尼亚北部)美国西部(加利福尼亚北部)美国西部(俄勒冈)亚太地区(香港)亚太地区(孟买)亚太地区(首尔)亚太地区(新加坡)亚太地区(悉尼)亚太地区(东京)加拿大(中部)中国(北京)中国(宁夏)欧洲(法兰克福)欧洲(爱尔兰)欧洲(伦敦)欧洲(巴黎)欧洲(斯德哥尔摩)中东(巴林)南美洲(圣保罗)

您可以立即开始使用。

— seb