AWS Storage Gateway
用户指南 (API 版本 2013-06-30)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

管理卷网关

在下文中,您可以找到有关如何管理卷网关资源的信息。

缓存卷是 Amazon Simple Storage Service (Amazon S3) 中作为 iSCSI 目标公开的卷,您可以使用这些卷存储应用程序数据。您可以在下面找到有关如何为缓存设置添加和移除卷的信息。您还可以了解到如何在 Amazon EC2 网关中添加和移除 Amazon Elastic Block Store (Amazon EBS) 卷。

重要

如果缓存卷将您的主要数据保存在 Amazon S3 中,您应该避免在整个卷上读取或写入所有数据的过程。例如,我们建议不要使用扫描整个缓存卷的病毒扫描软件。此类扫描 (无论是按需执行的还是按计划执行的) 都会导致存储在 Amazon S3 中的所有数据为了扫描而进行本地下载,从而导致高带宽使用率。作为进行整个磁盘扫描的替代方法,您可以使用实时病毒扫描,亦即扫描从/向缓存卷读写的数据。

不支持重新配置卷的大小。要更改某个卷的大小,请创建该卷的快照,然后从该快照创建新的缓存卷。新卷可大于快照所从创建的卷。有关描述如何移除卷的步骤,请参阅移除卷。有关描述如何添加卷和保存现有数据的步骤,请参阅删除卷

所有缓存卷数据和快照数据均存储在 Amazon S3 中,并使用服务器端加密 (SSE) 进行静态加密。不过,您不能使用 Amazon S3 API 或其他工具(如 Amazon S3 管理控制台)访问这些数据。

添加卷

随着应用程序需求增长,您可能需要向网关添加更多卷。添加更多卷时,您必须考虑分配给网关的缓存存储和上传缓冲区的大小。网关必须有供新卷使用的充足缓冲区和缓存空间。有关更多信息,请参阅确定要分配的上传缓冲区的大小

您可以使用 AWS Storage Gateway 控制台或 AWS Storage Gateway API 添加卷。有关使用 AWS Storage Gateway API 添加卷的信息,请参阅 CreateCachediSCSIVolume。有关使用 AWS Storage Gateway 控制台添加卷的说明,请参阅创建卷

扩展卷的大小

随着应用程序需求增长,您可能希望扩展卷而不是将更多卷添加到网关。在这种情况下,您可以执行下列操作之一:

  • 创建您想要扩展的卷的快照,然后使用此快照创建更大的新卷。有关如何创建快照的信息,请参阅创建一次性快照。有关如何使用快照创建新卷的信息,请参阅创建卷

  • 使用您想要扩展的已缓存卷克隆更大的新卷。有关如何克隆卷的信息,请参阅克隆卷。有关如何创建卷的信息,请参阅创建卷

克隆卷

您可以从同一 AWS 区域内的任何现有缓存卷创建新卷。将从选定卷的最新恢复点创建新卷。卷恢复点 是一个卷的所有数据都保持一致的时间点。要克隆卷,您可选择 Create volume 对话框中的 Clone from last recovery point 选项,然后选择要用作源的卷。以下屏幕截图显示 Create volume 对话框。

与创建 Amazon EBS 快照相比,从现有卷克隆的方式将更快速、更经济高效。克隆操作将使用源卷的最新恢复点,将数据从源卷逐字节复制到新卷。Storage Gateway 自动为缓存卷创建恢复点。要查看创建上一个恢复点的时间,可以查看 Amazon CloudWatch 中的 TimeSinceLastRecoveryPoint 指标。

克隆的卷独立于源卷。也就是说,在克隆后对任一卷的更改将不会影响另一个卷。例如,如果您删除源卷,并不会影响克隆的卷。您可以在启动程序已连接且正在使用时克隆源卷。这样做不会影响源卷的性能。有关如何克隆卷的信息,请参阅创建卷

您也可以在恢复方案中使用克隆过程。有关更多信息,请参阅 您的缓存网关无法访问,您希望恢复数据

从卷恢复点进行克隆

以下过程介绍如何从卷恢复点克隆一个卷并使用该卷。

从无法访问的网关克隆并使用卷

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在 AWS Storage Gateway 控制台中,选择 Create volume (创建卷)

  3. Create volume (创建卷) 对话框中,为 Gateway (网关) 选择网关。

  4. 对于容量,键入卷的容量。此容量必须至少与源卷的大小相同。

  5. 选择 Clone from last recovery point,然后为 Source volume 选择卷 ID。源卷可以是所选 AWS 区域中的任何缓存卷。

  6. iSCSI target name (iSCSI 目标名称) 键入名称。

    目标名称可包含小写字母、数字句点 (.) 和连词符 (-)。在发现目标后,此目标名称将在 iSCSI Microsoft initiator (iSCSI Microsoft 启动程序) UI 的 Targets (目标) 选项卡中显示为 iSCSI target node (iSCSI 目标节点) 名称。例如,名称 target1 将显示为 iqn.1007-05.com.amazon:target1。确保目标名称在存储区域网络 (SAN) 内具有全局唯一性。

  7. 验证 Network interface 设置是否为网关的 IP 地址,或者为 Network interface 选择 IP 地址。

    如果您已将网关定义为使用多个网络适配器,则选择存储应用程序将用于访问卷的 IP 地址。为网关定义的每个网络适配器代表您可以选择的一个 IP 地址。

    如果网关 VM 是针对多个网络适配器配置的,则创建卷对话框对于网络接口将显示一个列表。在该列表中,一个 IP 地址对应一个为网关 VM 配置的适配器。如果网关 VM 只是为一个网络适配器配置的,则不会显示列表,因为只有一个 IP 地址。

  8. 选择 Create volume (创建卷)。此时将显示 Configure CHAP Authentication (配置 CHAP 身份验证) 对话框。您稍后可以配置 CHAP。有关信息,请参阅 为 iSCSI 目标配置 CHAP 身份验证

下一步是将卷连接到客户端。有关更多信息,请参阅 将卷连接到客户端

创建恢复快照

以下过程说明如何从卷恢复点创建一个快照并使用该快照。您可以拍摄一次性快照、临时快照或者为卷设置快照计划。

从无法访问的网关创建并使用卷的恢复快照

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择 Gateways

  3. 选择无法访问的网关,然后选择 Details 选项卡。

    此时选项卡上会显示恢复快照消息。

  4. 选择 Create recovery snapshot 以打开 Create recovery snapshot 对话框。

  5. 从显示的卷列表中,选择要恢复的卷,然后选择 Create snapshots

    AWS Storage Gateway 初始化快照进程。

  6. 查找并还原快照。

查看卷使用率

当您将数据写入卷时,可以在 AWS Storage Gateway 管理控制台中查看卷上存储的数据量。每个卷的 Details 选项卡显示卷使用率信息。

查看写入到卷中的数据量

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择 Volumes,然后选择您感兴趣的卷。

  3. 选择 Details 选项卡。

    以下字段提供有关卷的信息:

    • Size:所选卷的总容量。

    • Used:卷上存储的数据量。

      注意

      这些值不适用于在 2015 年 5 月 13 日之前创建的卷,除非您在卷上存储数据。

删除卷

随着应用程序需求的变化,您可能需要删除卷,例如在迁移应用程序以使用更大存储卷的情况下。删除某个卷前,请确保当前没有应用程序正在写入该卷。另外,请确保该卷没有正在拍摄的快照。如果已为卷定义快照计划,则可在 AWS Storage Gateway 控制台的 Snapshot Schedules (快照计划) 选项卡中进行查看。有关更多信息,请参阅编辑快照计划

您可以使用 AWS Storage Gateway 控制台或 AWS Storage Gateway API 删除卷。有关使用 AWS Storage Gateway API 删除卷的信息,请参阅删除卷。以下过程展示如何使用控制台。

在删除卷之前,备份您的数据或拍摄关键数据的快照。对于存储卷,您的本地磁盘不会被擦除。删除的卷将无法恢复。

移除卷

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. Volumes 选项卡上,选择卷并选择确认对话框。确保列出的卷就是您要删除的卷。

  3. 选择 Delete 以删除卷。

将您的卷迁移至不同的网关

随着数据和性能需求的增长,您可能希望将卷移动到不同的卷网关。要执行此操作,您可以使用 Storage Gateway 控制台或 API 分离并附加卷。

通过分离并附加卷,您可以实现:

  • 将卷移动到较好的主机平台或者较新的 Amazon EC2 实例。

  • 刷新服务器的底层硬件。

  • 在不同管理程序类型之间移动卷类型。

在分离卷时,您的网关将卷数据和元数据上传并存储到 AWS 的 AWS Storage Gateway 服务中。以后,您可以轻松地将分离的卷附加到任何支持的主机平台。

注意

已分离的卷按照标准卷存储费率计费,直至您删除它。有关如何减少账单的信息,请参阅减少卷上的计费存储量

注意

附加和分离卷有一些限制:

  • 分离卷可能需要较长的时间。分离卷时,网关将卷上的所有数据上传到 AWS,然后再分离卷。完成上传所需的时间取决于需要上传的数据量以及您的网络与 AWS 的连接。

  • 如果分离缓存卷,则您无法将其作为存储卷重新附加。

  • 如果分离存储卷,则您无法将其作为缓存卷重新附加。

  • 已分离的卷在附加到网关之前无法使用。

  • 在您附加存储卷时,该卷需要完全恢复之后才能附加到网关。

  • 当您开始附加或分离卷时,需要等待直至操作完成,然后才能使用卷。

  • 目前,只有 API 中支持强制删除卷。

  • 如果有卷正在从网关中分离而您删除了该网关,则会导致数据丢失。请等待直至卷分离操作完成,然后再删除网关。

  • 如果存储网关存储正在还原的状态,您无法从其中分离卷。

以下步骤演示如何使用 Storage Gateway 控制台分离和附加卷。有关使用 API 完成此操作的更多信息,请参阅 AWS Storage Gateway API Reference 中的 DetachVolumeAttachVolume

从网关分离卷

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择

  3. 从卷列表中,选择要分离的卷。您可以选择多个卷以一次分离多个卷。

  4. 对于操作,选择分离卷。您选择的卷在显示的分离卷对话框中列出。确保仅列出您要分离的卷。

  5. 选择分离卷。如果您要分离的卷有大量数据,则其状态会从已附加转变为正在分离,直至完成上传所有数据。然后,状态更改为已分离。如果只有少量数据,您可能无法看到正在分离状态。如果卷上没有数据,则状态从已附加更改为已分离

现在,您可以将此卷附加到其他网关。

将卷附加到网关

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择。已分离的各个卷的状态显示为已分离

  3. 从已分离卷列表中,选择要附加的卷。一次只能附加一个卷。

  4. 对于操作,选择附加卷

  5. 附加卷对话框中,选择要将卷附加到的网关,然后输入要将卷连接到的 iSCSI 目标。

    如果您在附加存储卷,请为磁盘 ID 输入其磁盘标识符。

  6. 选择附加卷。如果您附加的卷包含大量数据,则在 AttachVolume 操作成功时,卷会从已分离转换为已附加

  7. 在显示的配置 CHAP 身份验证向导中,在各自的框中提供启动程序名称启动程序密钥目标密钥,然后选择保存。有关使用质询握手身份验证协议 (CHAP) 身份验证的更多信息,请参阅为 iSCSI 目标配置 CHAP 身份验证

减少卷上的计费存储量

从文件系统中删除文件不一定会从底层块储存设备删除数据或减少卷上存储的数据量。如果您要减少卷上的计费存储量,我们建议用零来覆盖您的文件以将存储压缩到极小的实际存储量。AWS Storage Gateway 基于压缩的存储收取卷用量费用。

注意

如果您使用删除工具,该工具用随机数据来覆盖卷上的数据,则您的用量不会减少。这是因为随机数据是不可压缩的。

创建一次性快照

除了预定快照外,对于卷网关,您还可以拍摄一次性的临时快照。这样一来,您可以立即备份存储卷,而无需等待下次预定快照。

拍摄存储卷的一次性快照

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择 Volumes,然后选择要从中创建快照的卷。

  3. Actions 菜单上,选择 Create snapshot

  4. Create snapshot 对话框中,键入快照描述,然后选择 Create snapshot

    您可以验证是否已使用控制台创建快照。

您的快照在与卷位于相同行的 Snapshots 中列出。

编辑快照计划

对于存储卷,AWS Storage Gateway 创建每天执行一次的默认快照计划。

注意

您无法删除默认快照计划。存储卷需要至少一个快照计划。但是,您可以通过指定快照每天发生的时间和/或频率 (每 1、2、4、8、12 或 24 个小时) 来更改快照计划。

对于缓存卷,AWS Storage Gateway 不创建默认快照计划。不会创建默认计划,因为您的数据存储在 Amazon S3 中,所以,您无需快照或快照计划以用于灾难恢复目的。不过,您可以在需要时随时设置快照计划。为缓存卷创建快照提供了另一种在必要时恢复数据的方法。

通过使用以下步骤,您可以编辑卷的快照计划。

编辑卷的快照计划

  1. 通过以下网址打开 AWS Storage Gateway 控制台:https://console.amazonaws.cn/storagegateway/home

  2. 在导航窗格中,选择 Volumes,然后选择已从中创建快照的卷。

  3. Actions 菜单上,选择 Edit snapshot schedule

  4. Edit snapshot schedule 对话框中,修改计划,然后选择 Save

删除快照

可以删除存储卷的快照。例如,当您在一段时间内拍摄了存储卷的许多快照而不再需要较旧的快照时,您可能想要删除快照。由于快照是增量备份,因此删除某个快照的操作仅会删除其他快照不需要的数据。

在 Amazon EBS 控制台中,您可以一次删除一个快照。有关如何使用 Amazon EBS 控制台删除快照的信息,请参阅 Amazon EC2 用户指南 中的删除 Amazon EBS 快照

要一次性删除多个快照,可使用支持 AWS Storage Gateway 操作的 AWS 开发工具包之一。有关示例,请参阅 使用适用于 Java 的 AWS 开发工具包删除快照使用适用于 .NET 的 AWS 开发工具包删除快照使用适用于 Windows PowerShell 的 AWS 工具删除快照

使用适用于 Java 的 AWS 开发工具包删除快照

如需删除与卷关联的多个快照,您可以使用编程方法。以下示例演示如何使用适用于 Java 的 AWS 开发工具包删除快照。如需使用示例代码,您应该熟悉 Java 控制台应用程序的运行方式。有关更多信息,请参阅 AWS SDK for Java Developer Guide 中的入门部分。如果您只需删除少量快照,请按 删除快照 中所述使用控制台。

例 :使用适用于 Java 的 AWS 开发工具包删除快照

以下 Java 代码示例列出了网关各个卷的快照以及快照起始日期是在指定日期前还是之后。它将适用于 Java 的 AWS 开发工具包 API 用于 AWS Storage Gateway 和 Amazon EC2。Amazon EC2 API 包括数种使用快照的操作。

更新代码以提供服务终端节点、您的网关的 Amazon 资源名称 (ARN) 和您想要保存快照的回溯天数。此截止日期之前拍摄的快照都将被删除。您还需要指定布尔值 viewOnly,该值表明是要查看要删除的快照还是实际执行快照删除。先只带 view 选项 (即将 viewOnly 设置为 true) 运行代码,看看代码会删除什么。有关可用于 AWS Storage Gateway 的 AWS 服务终端节点的列表,请参阅 AWS 一般参考 中的区域和终端节点

import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.GregorianCalendar; import java.util.List; import com.amazonaws.auth.PropertiesCredentials; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.ec2.model.DeleteSnapshotRequest; import com.amazonaws.services.ec2.model.DescribeSnapshotsRequest; import com.amazonaws.services.ec2.model.DescribeSnapshotsResult; import com.amazonaws.services.ec2.model.Filter; import com.amazonaws.services.ec2.model.Snapshot; import com.amazonaws.services.storagegateway.AWSStorageGatewayClient; import com.amazonaws.services.storagegateway.model.ListVolumesRequest; import com.amazonaws.services.storagegateway.model.ListVolumesResult; import com.amazonaws.services.storagegateway.model.VolumeInfo; public class ListDeleteVolumeSnapshotsExample { public static AWSStorageGatewayClient sgClient; public static AmazonEC2Client ec2Client; static String serviceURLSG = "https://storagegateway.us-east-1.amazonaws.com"; static String serviceURLEC2 = "https://ec2.us-east-1.amazonaws.com"; // The gatewayARN public static String gatewayARN = "*** provide gateway ARN ***"; // The number of days back you want to save snapshots. Snapshots before this cutoff are deleted // if viewOnly = false. public static int daysBack = 10; // true = show what will be deleted; false = actually delete snapshots that meet the daysBack criteria public static boolean viewOnly = true; public static void main(String[] args) throws IOException { // Create a storage gateway and amazon ec2 client sgClient = new AWSStorageGatewayClient(new PropertiesCredentials( ListDeleteVolumeSnapshotsExample.class.getResourceAsStream("AwsCredentials.properties"))); sgClient.setEndpoint(serviceURLSG); ec2Client = new AmazonEC2Client(new PropertiesCredentials( ListDeleteVolumeSnapshotsExample.class.getResourceAsStream("AwsCredentials.properties"))); ec2Client.setEndpoint(serviceURLEC2); List<VolumeInfo> volumes = ListVolumesForGateway(); DeleteSnapshotsForVolumes(volumes, daysBack); } public static List<VolumeInfo> ListVolumesForGateway() { List<VolumeInfo> volumes = new ArrayList<VolumeInfo>(); String marker = null; do { ListVolumesRequest request = new ListVolumesRequest().withGatewayARN(gatewayARN); ListVolumesResult result = sgClient.listVolumes(request); marker = result.getMarker(); for (VolumeInfo vi : result.getVolumeInfos()) { volumes.add(vi); System.out.println(OutputVolumeInfo(vi)); } } while (marker != null); return volumes; } private static void DeleteSnapshotsForVolumes(List<VolumeInfo> volumes, int daysBack2) { // Find snapshots and delete for each volume for (VolumeInfo vi : volumes) { String volumeARN = vi.getVolumeARN(); String volumeId = volumeARN.substring(volumeARN.lastIndexOf("/")+1).toLowerCase(); Collection<Filter> filters = new ArrayList<Filter>(); Filter filter = new Filter().withName("volume-id").withValues(volumeId); filters.add(filter); DescribeSnapshotsRequest describeSnapshotsRequest = new DescribeSnapshotsRequest().withFilters(filters); DescribeSnapshotsResult describeSnapshotsResult = ec2Client.describeSnapshots(describeSnapshotsRequest); List<Snapshot> snapshots = describeSnapshotsResult.getSnapshots(); System.out.println("volume-id = " + volumeId); for (Snapshot s : snapshots){ StringBuilder sb = new StringBuilder(); boolean meetsCriteria = !CompareDates(daysBack, s.getStartTime()); sb.append(s.getSnapshotId() + ", " + s.getStartTime().toString()); sb.append(", meets criteria for delete? " + meetsCriteria); sb.append(", deleted? "); if (!viewOnly & meetsCriteria) { sb.append("yes"); DeleteSnapshotRequest deleteSnapshotRequest = new DeleteSnapshotRequest().withSnapshotId(s.getSnapshotId()); ec2Client.deleteSnapshot(deleteSnapshotRequest); } else { sb.append("no"); } System.out.println(sb.toString()); } } } private static String OutputVolumeInfo(VolumeInfo vi) { String volumeInfo = String.format( "Volume Info:\n" + " ARN: %s\n" + " Type: %s\n", vi.getVolumeARN(), vi.getVolumeType()); return volumeInfo; } // Returns the date in two formats as a list public static boolean CompareDates(int daysBack, Date snapshotDate) { Date today = new Date(); Calendar cal = new GregorianCalendar(); cal.setTime(today); cal.add(Calendar.DAY_OF_MONTH, -daysBack); Date cutoffDate = cal.getTime(); return (snapshotDate.compareTo(cutoffDate) > 0) ? true : false; } }

使用适用于 .NET 的 AWS 开发工具包删除快照

如需删除与卷关联的多个快照,您可以使用编程方法。以下示例演示如何使用适用于 .NET 的 AWS 开发工具包版本 2 和 3 删除快照。如需使用示例代码,您应该熟悉 .NET 控制台应用程序的运行方式。有关更多信息,请参阅 适用于 .NET 的 AWS 开发工具包开发人员指南 中的入门部分。如果您只需删除少量快照,请按 删除快照 中所述使用控制台。

例 :使用适用于 .NET 的 AWS 开发工具包删除快照

在以下 C# 代码示例中,一个 AWS Identity and Access Management (IAM) 用户可以列出一个网关的每个卷的快照。然后,该用户可以判断快照的起始时间是在指定日期 (保留期) 之前还是之后,并删除过了保留期的快照。该示例将适用于 .NET 的 AWS 开发工具包 API 用于 AWS Storage Gateway 和 Amazon EC2。Amazon EC2 API 包括数种使用快照的操作。

以下代码示例使用适用于 .NET 的 AWS 开发工具包版本 2 和 3。您可以将旧版本的 .NET 迁移到新版本。有关更多信息,请参阅将您的代码迁移到最新版本的适用于 .NET 的 AWS 开发工具包

更新代码以提供服务终端节点、您的网关的 Amazon 资源名称 (ARN) 和您想要保存快照的回溯天数。此截止日期之前拍摄的快照都将被删除。您还需要指定布尔值 viewOnly,该值表明是要查看要删除的快照还是实际执行快照删除。先只带 view 选项 (即将 viewOnly 设置为 true) 运行代码,看看代码会删除什么。有关可用于 AWS Storage Gateway 的 AWS 服务终端节点的列表,请参阅 AWS 一般参考 中的区域和终端节点

首先,创建一个 IAM 用户并将最小 IAM 策略挂载到该 IAM 用户。然后为您的网关制定自动快照计划。

以下代码创建允许 IAM 用户删除快照的最小策略。在本示例中,策略的名称为 sgw-delete-snapshot

{ "Version": "2012-10-17", "Statement": [ { "Sid": "StmtEC2Snapshots", "Effect": "Allow", "Action": [ "ec2:DeleteSnapshot", "ec2:DescribeSnapshots" ], "Resource": [ "*" ] }, { "Sid": "StmtSgwListVolumes", "Effect": "Allow", "Action": [ "storagegateway:ListVolumes" ], "Resource": [ "*" ] } ] }

以下 C# 代码在指定网关中查找与卷和指定截止期匹配的所有快照并将其删除。

using System; using System.Collections.Generic; using System.Text; using Amazon.EC2; using Amazon.EC2.Model; using Amazon.StorageGateway.Model; using Amazon.StorageGateway; namespace DeleteStorageGatewaySnapshotNS { class Program { /* * Replace the variables below to match your environment. */ /* IAM AccessKey */ static String AwsAccessKey = "AKIA................"; /* IAM SecretKey */ static String AwsSecretKey = "***********************"; /* AWS Account number, 12 digits, no hyphen */ static String OwnerID = "123456789012"; /* Your Gateway ARN. Use a Storage Gateway ID, sgw-XXXXXXXX* */ static String GatewayARN = "arn:aws:storagegateway:ap-southeast-2:123456789012:gateway/sgw-XXXXXXXX"; /* Snapshot status: "completed", "pending", "error" */ static String SnapshotStatus = "completed"; /* AWS Region where your gateway is activated */ static String AwsRegion = "ap-southeast-2"; /* Minimum age of snapshots before they are deleted (retention policy) */ static int daysBack = 30; /* * Do not modify the four lines below. */ static AmazonEC2Config ec2Config; static AmazonEC2Client ec2Client; static AmazonStorageGatewayClient sgClient; static AmazonStorageGatewayConfig sgConfig; static void Main(string[] args) { // Create an EC2 client. ec2Config = new AmazonEC2Config(); ec2Config.ServiceURL = "https://ec2." + AwsRegion + ".amazonaws.com"; ec2Client = new AmazonEC2Client(AwsAccessKey, AwsSecretKey, ec2Config); // Create a Storage Gateway client. sgConfig = new AmazonStorageGatewayConfig(); sgConfig.ServiceURL = "https://storagegateway." + AwsRegion + ".amazonaws.com"; sgClient = new AmazonStorageGatewayClient(AwsAccessKey, AwsSecretKey, sgConfig); List<VolumeInfo> StorageGatewayVolumes = ListVolumesForGateway(); List<Snapshot> StorageGatewaySnapshots = ListSnapshotsForVolumes(StorageGatewayVolumes, daysBack); DeleteSnapshots(StorageGatewaySnapshots); } /* * List all volumes for your gateway * returns: A list of VolumeInfos, or null. */ private static List<VolumeInfo> ListVolumesForGateway() { ListVolumesResponse response = new ListVolumesResponse(); try { ListVolumesRequest request = new ListVolumesRequest(); request.GatewayARN = GatewayARN; response = sgClient.ListVolumes(request); foreach (VolumeInfo vi in response.VolumeInfos) { Console.WriteLine(OutputVolumeInfo(vi)); } } catch (AmazonStorageGatewayException ex) { Console.WriteLine(ex.Message); } return response.VolumeInfos; } /* * Gets the list of snapshots that match the requested volumes * and cutoff period. */ private static List<Snapshot> ListSnapshotsForVolumes(List<VolumeInfo> volumes, int snapshotAge) { List<Snapshot> SelectedSnapshots = new List<Snapshot>(); try { foreach (VolumeInfo vi in volumes) { String volumeARN = vi.VolumeARN; String volumeID = volumeARN.Substring(volumeARN.LastIndexOf("/") + 1).ToLower(); DescribeSnapshotsRequest describeSnapshotsRequest = new DescribeSnapshotsRequest(); Filter ownerFilter = new Filter(); List<String> ownerValues = new List<String>(); ownerValues.Add(OwnerID); ownerFilter.Name = "owner-id"; ownerFilter.Values = ownerValues; describeSnapshotsRequest.Filters.Add(ownerFilter); Filter statusFilter = new Filter(); List<String> statusValues = new List<String>(); statusValues.Add(SnapshotStatus); statusFilter.Name = "status"; statusFilter.Values = statusValues; describeSnapshotsRequest.Filters.Add(statusFilter); Filter volumeFilter = new Filter(); List<String> volumeValues = new List<String>(); volumeValues.Add(volumeID); volumeFilter.Name = "volume-id"; volumeFilter.Values = volumeValues; describeSnapshotsRequest.Filters.Add(volumeFilter); DescribeSnapshotsResponse describeSnapshotsResponse = ec2Client.DescribeSnapshots(describeSnapshotsRequest); List<Snapshot> snapshots = describeSnapshotsResponse.Snapshots; Console.WriteLine("volume-id = " + volumeID); foreach (Snapshot s in snapshots) { if (IsSnapshotPastRetentionPeriod(snapshotAge, s.StartTime)) { Console.WriteLine(s.SnapshotId + ", " + s.VolumeId + ", " + s.StartTime + ", " + s.Description); SelectedSnapshots.Add(s); } } } } catch (AmazonEC2Exception ex) { Console.WriteLine(ex.Message); } return SelectedSnapshots; } /* * Deletes a list of snapshots. */ private static void DeleteSnapshots(List<Snapshot> snapshots) { try { foreach (Snapshot s in snapshots) { DeleteSnapshotRequest deleteSnapshotRequest = new DeleteSnapshotRequest(s.SnapshotId); DeleteSnapshotResponse response = ec2Client.DeleteSnapshot(deleteSnapshotRequest); Console.WriteLine("Volume: " + s.VolumeId + " => Snapshot: " + s.SnapshotId + " Response: " + response.HttpStatusCode.ToString()); } } catch (AmazonEC2Exception ex) { Console.WriteLine(ex.Message); } } /* * Checks if the snapshot creation date is past the retention period. */ private static Boolean IsSnapshotPastRetentionPeriod(int daysBack, DateTime snapshotDate) { DateTime cutoffDate = DateTime.Now.Add(new TimeSpan(-daysBack, 0, 0, 0)); return (DateTime.Compare(snapshotDate, cutoffDate) < 0) ? true : false; } /* * Displays information related to a volume. */ private static String OutputVolumeInfo(VolumeInfo vi) { String volumeInfo = String.Format( "Volume Info:\n" + " ARN: {0}\n" + " Type: {1}\n", vi.VolumeARN, vi.VolumeType); return volumeInfo; } } }

使用适用于 Windows PowerShell 的 AWS 工具删除快照

如需删除与卷关联的多个快照,您可以使用编程方法。以下示例演示如何使用适用于 Windows PowerShell 的 AWS 工具删除快照。如需使用示例脚本,您应该熟悉如何运行 Powershell 脚本。有关更多信息,请参见 适用于 Windows PowerShell 的 AWS 工具 中的入门。如果您只需要删除少量快照,请按 删除快照 中所述使用控制台。

例 :使用适用于 Windows PowerShell 的 AWS 工具删除快照

以下 PowerShell 脚本示例列出了网关各个卷的快照以及快照起始日期是在指定日期前还是之后。它将适用于 Windows PowerShell cmdlet 的 AWS 工具用于 AWS Storage Gateway 和 Amazon EC2。Amazon EC2 API 包括数种使用快照的操作。

您需要更新脚本并提供您的网关的 Amazon 资源名称 (ARN) 和想要保存快照的回溯天数。此截止日期之前拍摄的快照都将被删除。您还需要指定布尔值 viewOnly,该值表明是要查看要删除的快照还是实际执行快照删除。先只带 view 选项 (即将 viewOnly 设置为 true) 运行代码,看看代码会删除什么。

<# .DESCRIPTION Delete snapshots of a specified volume that match given criteria. .NOTES PREREQUISITES: 1) AWS Tools for PowerShell from http://console.amazonaws.cn/powershell/ 2) Credentials and AWS Region stored in session using Initialize-AWSDefault. For more info see, https://docs.amazonaws.cn/powershell/latest/userguide//specifying-your-aws-credentials.html .EXAMPLE powershell.exe .\SG_DeleteSnapshots.ps1 #> # Criteria to use to filter the results returned. $daysBack = 18 $gatewayARN = "*** provide gateway ARN ***" $viewOnly = $true; #ListVolumes $volumesResult = Get-SGVolume -GatewayARN $gatewayARN $volumes = $volumesResult.VolumeInfos Write-Output("`nVolume List") foreach ($volumes in $volumesResult) { Write-Output("`nVolume Info:") Write-Output("ARN: " + $volumes.VolumeARN) write-Output("Type: " + $volumes.VolumeType) } Write-Output("`nWhich snapshots meet the criteria?") foreach ($volume in $volumesResult) { $volumeARN = $volume.VolumeARN $volumeId = ($volumeARN-split"/")[3].ToLower() $filter = New-Object Amazon.EC2.Model.Filter $filter.Name = "volume-id" $filter.Value.Add($volumeId) $snapshots = get-EC2Snapshot -Filter $filter Write-Output("`nFor volume-id = " + $volumeId) foreach ($s in $snapshots) { $d = ([DateTime]::Now).AddDays(-$daysBack) $meetsCriteria = $false if ([DateTime]::Compare($d, $s.StartTime) -gt 0) { $meetsCriteria = $true } $sb = $s.SnapshotId + ", " + $s.StartTime + ", meets criteria for delete? " + $meetsCriteria if (!$viewOnly -AND $meetsCriteria) { $resp = Remove-EC2Snapshot -SnapshotId $s.SnapshotId #Can get RequestId from response for troubleshooting. $sb = $sb + ", deleted? yes" } else { $sb = $sb + ", deleted? no" } Write-Output($sb) } }

了解卷状态和转换

每个卷均有关联的状态,让您一目了然地了解卷的运行状态。状态大多数时候会显示卷运行正常,无需您采取任何行动。在某些情况下,状态显示卷有问题,可能需要您执行相关操作,也可能不需要。您可以找到以下信息以帮助您决定何时需要采取行动。您可通过 AWS Storage Gateway 控制台或使用 Storage Gateway API 操作之一查看卷状态,例如,DescribeCachediSCSIVolumesDescribeStorediSCSIVolumes

理解卷状态

下表显示了 Storage Gateway 控制台中的卷状态。卷状态显示在网关中各个存储卷的 Status (状态) 一栏中。正常工作的卷的状态显示为可用

在下表中,您可以找到各个存储卷状态的描述,以及基于每种状态,您是否需要采取行动和应在何时采取行动。可用状态是卷的正常状态。在使用卷的所有或大部分时间,卷都应具有此状态。

状态 含义
Available

卷可供使用。此状态是卷的正常运行状态。

正在引导阶段完成后,卷将恢复为可用状态。即,网关已同步自卷首次进入传递状态以来对卷所做的任何更改。

正在引导

网关正在本地同步数据,同时将数据的副本存储在 AWS 中。您通常不需要针对该状态采取任何行动,因为大多情况下,存储卷将自动显示为可用状态。

以下是卷状态为正在引导的场景:

  • 网关意外关闭。

  • 超出了网关的上传缓冲区容量。在这种情况下,当您的卷处于传递状态并且自由上传缓冲区空间充分增加时,将发生引导。您可以提供额外的上传缓冲区空间,作为提高自由上传缓冲区空间百分比的一种方式。在此特殊的情况下,存储卷从传递转为正在引导,再转为可用状态。您可在引导期间继续使用此卷。但此时您不能拍摄卷的快照。

  • 您正在创建存储卷网关并保留现有磁盘数据。在这种情况下,您的网关开始将所有数据上传到 AWS。卷处于正在引导状态,直至本地磁盘上的所有数据都复制到 AWS。您可在引导期间继续使用此卷。但此时您不能拍摄卷的快照。

创建

目前正在创建卷,因此尚不能使用它。正在创建状态是过渡型状态。无需采取行动。

删除

卷当前正在删除。正在删除状态是过渡型状态。无需采取行动。

无法恢复

发生错误,卷无法从其还原。有关在此情况下采取何种措施的信息,请参见 排查卷问题

传递

本地维护的数据与 AWS 中存储的数据不同步。对处于传递状态的卷写入的数据将保持在缓存中,直至卷的状态成为正在引导。在开始成为正在引导状态时,此数据开始上传到 AWS。

传递状态可因多种原因而出现,如下面所列:

  • 如果网关已用完上传缓冲区空间,则将出现传递状态。当卷均处于传递状态时,您的应用程序可继续在其中读取和写入数据。但是,网关不会向其上传缓冲区写入任何您的卷数据,也不会将任何此类数据上传到 AWS。

    网关将继续上传在卷进入传递状态之前写入卷的任何数据。当卷处于传递状态时,存储卷的任何待处理或计划快照均会失败。有关因超出上传缓冲区容量而导致存储卷处于传递状态的情况下应执行的操作的信息,请参阅排查卷问题

    要返回“活动”状态,处于传递状态的卷必须完成正在引导阶段。在正在引导状态期间,该卷重新建立与 AWS 的同步,因此它可以恢复对卷的更改记录(日志),并重新启用 CreateSnapshot 功能。在正在引导状态期间,写入到卷的内容记录在上传缓冲空间。

  • 一次存在多个存储卷引导时,将出现传递状态。同一时间只能有一个存储卷进行自举。例如,假设您创建两个存储卷并选择保存两个存储卷上的现有数据。在这种情况下,第二个存储卷就会显示传递状态,直至第一个存储卷完成引导。在这种情况下,您不需要采取行动。各个存储卷将会在创建完成后自动转为可用状态。您可以在存储卷处于传递正在引导状态时对其进行读写操作。

  • 传递状态偶尔可能表示为上传缓冲区使用分配的磁盘已失效。有关在此场景中应采取何种行动的信息,请参阅 排查卷问题

  • 当卷处于活动正在引导状态时,可能发生传递状态。在这种情况下,卷收到一个写入,但上传缓冲区没有足够容量来记录该写入。

  • 当卷处于任何状态并且网关未完全关闭时,发生传递状态。发生这种类型的关闭的原因一是软件崩溃,二是 VM 关闭。在这种情况下,处于任意状态的卷都将进入传递状态。

还原

卷正在从现有快照还原。此状态仅适用于存储卷。有关更多信息,请参阅 AWS Storage Gateway 的工作原理 (架构)

如果您同时还原两个存储卷,则两个存储卷均会显示还原状态。各个存储卷将会在创建完成后自动转为可用状态。您可以在存储卷处于还原状态时对其进行读写操作并拍摄快照。

Restoring Pass Through (还原传递)

该卷正在从现有快照还原,并且遇到了上传缓冲区问题。此状态仅适用于存储卷。有关更多信息,请参阅 AWS Storage Gateway 的工作原理 (架构)

导致 Restoring Pass Through (还原传递) 状态的一个原因是您的网关已用完上传缓冲区空间。当存储卷处于 Restoring Pass Through (还原传递) 状态时,您的应用程序可继续在其中读取和写入数据。但是,在 Restoring Pass Through (还原传递) 状态期间,您无法拍摄存储卷的任何快照。有关存储卷因超出上传缓冲区容量而处于 Restoring Pass Through (还原传递) 状态时应采取操作的信息,请参阅排查卷问题

Restoring Pass Through (还原传递) 状态偶尔也可能表示为上传缓冲区分配的磁盘失效。有关在此场景中应采取何种行动的信息,请参阅 排查卷问题

Upload Buffer Not Configured (上传缓冲区未配置)

由于网关未配置上传缓冲区,因此您无法创建或使用卷。有关如何为缓存卷设置中的卷添加上传缓冲区容量的信息,请参阅确定要分配的上传缓冲区的大小。有关如何为存储卷设置中的卷添加上传缓冲区容量的信息,请参阅确定要分配的上传缓冲区的大小

了解连接状态

您可以使用 Storage Gateway 控制台或 API,从网关分离卷或者将卷附加到网关。下表显示了 Storage Gateway 控制台中的卷连接状态。卷连接状态显示在网关中各个存储卷的连接状态列中。例如,已从网关中分离的卷具有已分离状态。有关如何附加和分离卷的信息,请参阅将您的卷迁移至不同的网关

状态 含义
Attached

卷已附加到网关。

Detached

卷已从网关上分离。

正在分离

卷正在从网关上分离。当您分离某个卷且该卷上没有数据时,可能不会看到此状态。

了解缓存卷状态转换

通过以下状态示意图了解缓存网关中卷状态之间的最常见转换。您无需详细了解该示意图就能有效使用网关。不过,如果您有兴趣进一步了解卷网关的工作方式,该示意图提供了详细的信息。

该示意图没有显示 Upload Buffer Not Configured (上传缓冲区未配置) 状态,也没有显示正在删除 状态。示意图中的卷状态以绿色、黄色和红色框的形式呈现。各种颜色的具体含义如下。

颜色 卷状态
Green 网关运行正常。卷状态为可用,或者最终变为可用
黄色 卷处于传递状态,这表示存储卷具有潜在问题。如果该状态是由于上传缓冲区空间已满所致,那么在某些情况下,缓冲区空间可能变得再次可用。此时,存储卷将自动更正为可用状态。在其他情况下,您可能需要向网关添加更多上传缓冲区空间,以使存储卷状态转为可用。有关在超出上传缓冲区容量的情况下如何进行故障排除的信息,请参阅 排查卷问题。有关如何添加上传缓冲区容量的信息,请参阅 确定要分配的上传缓冲区的大小
红光 存储卷处于无法恢复状态。在这种情况下,您应删除卷。有关如何执行此操作的信息,请参阅 移除卷

在示意图中,两种状态之间的转换使用标记线表示。例如,从正在创建状态到可用状态的转换被标记为创建基本卷或从快照中创建卷。此转换表示正在创建缓存卷。有关创建存储卷的更多信息,请参阅添加卷

注意

卷状态传递在该示意图中显示为黄色。但是,这与 Storage Gateway 控制台的 Status (状态) 框中的此状态图标颜色不匹配。

了解存储卷状态转换

通过以下状态示意图了解存储网关中卷状态之间的最常见转换。您无需详细了解该示意图就能有效使用网关。示意图只是在您希望详细了解卷网关的工作方式的情况下,为您提供详细信息。

该示意图没有显示 Upload Buffer Not Configured (上传缓冲区未配置) 状态,也没有显示正在删除 状态。示意图中的卷状态以绿色、黄色和红色框的形式呈现。各种颜色的具体含义如下。

颜色 卷状态
Green 网关运行正常。卷状态为可用,或者最终变为可用
黄色 在您创建存储卷并保存数据时,如果另一个卷进行引导,则将出现从正在创建状态到传递状态的路径。在这种情况下,如果第一个卷完成引导,则处于传递状态的卷将转为正在引导状态再转为可用状态。除了所述具体情况外,黄色(传递状态)表示存储卷可能存在问题,最常见的一个问题是上传缓冲区问题。如果超出了上传缓冲区容量,则某些情况下缓冲区空间将变得再次可用。此时,存储卷将自动更正为可用状态。在其他情况下,您可能需要向网关添加更多上传缓冲区容量,以使存储卷返回可用状态。有关在超出上传缓冲区容量的情况下如何进行故障排除的信息,请参阅 排查卷问题。有关如何添加上传缓冲区容量的信息,请参阅 确定要分配的上传缓冲区的大小
红光 存储卷处于无法恢复状态。在这种情况下,您应删除卷。有关如何执行此操作的信息,请参阅 删除卷

在下面的示意图中,两种状态之间的转换用标记线表示。例如,从正在创建状态到可用状态的转换被标记为创建基本卷。此转换表示在不保存数据的情况下创建存储卷或者从快照创建卷。

注意

卷状态传递在该示意图中显示为黄色。但是,这与 Storage Gateway 控制台的 Status (状态) 框中的此状态图标颜色不匹配。