AWS Storage Gateway
User Guide (API Version 2013-06-30)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon 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. 对于 Capacity,键入卷的容量。此容量必须至少与源卷的大小相同。

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

  6. iSCSI target name 键入名称。

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

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

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

    如果网关 VM 配置为使用多个网络适配器,则 Create volume 对话框将为 Network interface 显示一个列表,并为已为网关 VM 配置的每个适配器显示一个 IP 地址。如果网关 VM 配置为仅使用一个网络适配器,则不会显示下拉列表,因为只有一个 IP 地址。

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

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

创建恢复快照

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

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

  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 以删除卷。

创建一次性快照

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

拍摄存储卷的一次性快照

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

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

  3. Action 菜单上,选择 Create snapshot

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

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

  5. 您的快照在与卷位于相同行的 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. Action 菜单上,选择 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,该值表明是要查看要删除的快照还是实际执行快照删除。您应先利用查看选项运行代码 (即将 viewOnly 设置为 true) 以查看代码将删除的内容。有关可用于 AWS Storage Gateway 的 AWS 服务终端节点的列表,请参阅 AWS 一般参考 中的区域和终端节点

Copy
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 控制台应用程序的运行方式。有关更多信息,请参阅 AWS SDK for .NET Developer Guide 中的入门部分。如果您只需删除少量快照,请按 删除快照 中所述使用控制台。

例 :使用适用于 .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,该值表明是要查看要删除的快照还是实际执行快照删除。您应先利用查看选项运行代码 (即将 viewOnly 设置为 true) 以查看代码将删除的内容。有关可用于 AWS Storage Gateway 的 AWS 服务终端节点的列表,请参阅 AWS 一般参考 中的区域和终端节点

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

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

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

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

Copy
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 脚本。有关更多信息,请参阅 AWS Tools for Windows PowerShell 中的入门。如果您只需要删除少量快照,请按 删除快照 中所述使用控制台。

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

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

您需要更新脚本并提供网关的 Amazon 资源名称 (ARN) 和返回要保存快照的天数 - 删除此截止日期之前拍摄的快照。您还需要指定布尔值 viewOnly,该值表明是要查看要删除的快照还是实际执行快照删除。您应先利用查看选项运行代码 (即将 viewOnly 设置为 true) 以查看代码将删除的内容。

Copy
<# .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 region stored in session using Initialize-AWSDefault. For more info see, http://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 控制台或使用 AWS Storage Gateway API 操作之一查看卷状态,例如,DescribeCachediSCSIVolumesDescribeStorediSCSIVolumes。以下示例在 AWS Storage Gateway 控制台上显示了卷状态。卷状态显示在网关中各个存储卷的 Status (状态) 一栏中。正常工作的卷的状态显示为 AVAILABLE。

下表描述了各个存储卷的状态,以及您是否需要以及应在何时根据每种状态采取行动。AVAILABLE (可用) 状态是卷的正常状态,卷应该在使用的全部或大部分时间处于此状态。

状态 含义
AVAILABLE
  • 卷可供使用。此状态是卷的正常运行状态。

  • BOOTSTRAP 阶段完成之后,卷将返回 ACTIVE 状态 (即网关已同步对卷进行的所有更改,因为它首先进入了 PASSTHROUGH 状态)。

BOOTSTRAPPING

网关正在本地同步数据,同时将数据的副本存储在 AWS 中。您一般不需要对该状态采取任何行动,因为在大多情况下,存储卷将自动查看 AVAILABLE 状态。

以下是卷状态为 BOOTSTRAPPING 的场景:

  • 网关意外关闭。

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

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

CREATING

该卷正在创建并且尚未可供使用。CREATING (正在创建) 状态是过渡型状态。无需采取行动。

删除

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

IRRECOVERABLE

发生错误,卷无法从其还原。有关在此情况下采取行动的更多信息,请参阅 排查卷问题

PASS THROUGH

本地维护的数据与 AWS 中存储的数据不同步。请注意,当卷处于 PASS THROUGH 状态时,向卷中写入的数据保存在缓存中,直至卷状态为 BOOTSTRAPPING,并在进入 BOOTSTRAPPING 状态时开始上传到 AWS。

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

  • 如果网关已用完上传缓冲区空间,则将出现 PASS THROUGH (直通) 状态。当卷均处于 PASS THROUGH (直通) 状态时,您的应用程序可继续在其中读取和写入数据。但是,网关不会向其上传缓冲区写入任何您的卷数据,也不会将任何此类数据上传到 AWS。在卷进入 PASS THROUGH (直通) 状态之前,网关将继续上传写入卷的任何数据。当卷处于 PASS THROUGH 状态时,存储卷的任何待处理或计划快照均会失败。有关因超出上传缓冲区容量而导致存储卷处于 PASS THROUGH (直通) 状态的情况下应执行的操作的信息,请参阅 排查卷问题

    要返回 ACTIVE 状态,处于 PASS THROUGH 状态的卷必须完成 BOOTSTRAPPING 阶段。在 BOOTSTRAPPING 状态期间,该卷重新建立与 AWS 的同步,因此它可以恢复卷的更改记录 (日志),并重新启用 CreateSnapshot 功能。在 BOOTSTRAPPING 状态期间,写入到卷的内容记录在上传缓冲区。

  • 一次存在多个存储卷引导时,将出现 PASS THROUGH (直通) 状态。同一时间只能有一个存储卷进行自举。例如,如果您创建两个存储卷并选择保存两个存储卷上的现有数据,那么第二个存储卷就会显示 PASS THROUGH 状态,直至第一个存储卷完成引导启动。在此场景中,您不需要采取行动。各个存储卷将会在创建完成后自动转为 AVAILABLE 状态。您可以在存储卷处于 PASS THROUGH (直通) 或 BOOTSTRAPPING (正在引导) 状态时对其进行读写操作。

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

  • 当卷处于 ACTIVE 或 BOOTSTRAPPING 状态且卷接收写入时,如果上传缓冲区的容量不足以记录写入,则会显示 PASS THROUGH 状态。

  • 当卷处于任意状态且网关未完全关闭,因为软件崩溃或 VM 已关闭,则会显示 PASS THROUGH 状态。在这种情况下,处于任意状态的卷都将进入 PASS THROUGH 状态。

还原

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

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

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

由于网关未配置上传缓冲区,卷无法创建或使用。有关如何为缓存卷设置中的卷添加上传缓冲区容量的信息,请参阅添加和移除上传缓冲区。有关如何为存储卷设置中的卷添加上传缓冲区容量的信息,请参阅添加和移除上传缓冲区

缓存卷状态转换

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

该示意图不显示 UPLOAD BUFFER NOT CONFIGURED 状态,也不显示 DELETING 状态。示意图中的卷状态分别由绿、黄和红框表示。这些色彩的含义说明如下。

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

在示意图中,两种状态之间的转换使用标记线表示。例如,从 CREATING 状态到 AVAILABLE 状态的转换被标记为 Create Basic Volume or Create Volume from Snapshot,表示正在创建缓存卷。有关创建存储卷的更多信息,请参阅添加卷

注意

卷状态 PASS THROUGH (直通) 在该示意图中表示为黄色,这与 AWS Storage Gateway 控制台的 Status (状态) 框中的此状态图标颜色不匹配。

存储卷状态转换

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

该示意图不显示 UPLOAD BUFFER NOT CONFIGURED 状态,也不显示 DELETING 状态。示意图中的卷状态分别由绿、黄和红框表示。这些色彩的含义说明如下。

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

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

注意

卷状态 PASS THROUGH (直通) 在该示意图中表示为黄色,这与 AWS Storage Gateway 控制台的 Status (状态) 框中的此状态图标颜色不匹配。