Löschen eines Snapshots - AWS Storage Gateway

Die Amazon S3 File Gateway-Dokumentation wurde nach Was ist Amazon S3 File Gateway? verschoben.

Die Amazon FSx File Gateway-Dokumentation wurde nach Was ist Amazon FSx File Gateway verschoben?

Die Tape-Gateway-Dokumentation wurde nach Was ist Tape Gateway verschoben?

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Löschen eines Snapshots

Sie können einen Snapshot des Speichervolumes löschen. Dies kann beispielsweise sinnvoll sein, wenn Sie im Lauf der Zeit Snapshots eines Speichervolumes erstellt haben und die älteren Snapshots nicht mehr benötigen. Da es sich bei Snapshots um inkrementelle Sicherungen handelt, werden nur die Daten gelöscht, die nicht in anderen Snapshots benötigt werden, wenn Sie diese löschen.

Auf der Amazon-EBS-Konsole können Sie jeden Snapshot einzeln löschen. Informationen zum Löschen von Snapshots mithilfe der Amazon-EBS-Konsole finden Sie unter Löschen eines Amazon-EBS-Snapshots im Amazon-EC2-Benutzerhandbuch.

Um mehrere Snapshots gleichzeitig zu löschen, können Sie eines der - AWS SDKs verwenden, die Storage Gateway-Operationen unterstützen. Beispiele finden Sie unter Das Löschen von Snapshots unter Verwendung von AWS SDK für Java, Löschen von Snapshots unter Verwendung von AWS SDK für .NET und Löschen von Snapshots unter Verwendung der AWS Tools for Windows PowerShell.

Das Löschen von Snapshots unter Verwendung von AWS SDK für Java

Um so viele Snapshots im Zusammenhang mit einem Volume zu löschen, können Sie eine programmatische Herangehensweise verwenden. Im folgenden Beispiel wird gezeigt, wie Sie mit dem AWS SDK für Java Snapshots löschen. Wenn Sie den Beispielcode verwenden möchten, sollten Sie mit der Ausführung einer Java-Konsolenanwendung vertraut sein. Weitere Informationen finden Sie unter Erste Schritte im AWS SDK für Java- Entwicklerhandbuch. Falls Sie nur einige Snapshots löschen möchten, verwenden Sie die Konsole, wie hier beschrieben Löschen eines Snapshots.

Beispiel : Löschen von Snapshots mit dem AWS SDK for Java

Das folgende Java-Codebeispiel listet die Snapshots für jedes Volume einer Gateway auf und ob die Snapshot-Startzeit vor oder nach einem bestimmten Datum liegt. Es verwendet die AWS SDK for Java API für Storage Gateway und Amazon EC2. Die Amazon-EC2-API beinhaltet Operationen für das Arbeiten mit Snapshots.

Aktualisieren Sie den Code, um den Service-Endpunkt, den Amazon-Ressourcennamen (ARN) des Gateways sowie die Anzahl der zurückliegenden Tage anzugeben, für die Snapshots gespeichert werden sollen. Snapshots, die vor diesem Zeitlimit aufgenommen wurden, werden gelöscht. Sie müssen außerdem den Booleschen Wert angeben viewOnly, der anzeigt, ob Sie den zu löschenden Snapshot ansehen möchten oder die eigentliche Löschung der Snapshots ausführen möchten. Führen Sie den Code zunächst nur mit der Ansichtsoption aus (weisen Sie also viewOnly den Wert true zu), um zu prüfen, was der Code löschen wird. Eine Liste der AWS Service-Endpunkte, die Sie mit Storage Gateway verwenden können, finden Sie unter AWS Storage Gateway Endpunkte und Kontingente im Allgemeine AWS-Referenz.

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

Löschen von Snapshots unter Verwendung von AWS SDK für .NET

Um so viele Snapshots im Zusammenhang mit einem Volume zu löschen, können Sie eine programmatische Herangehensweise verwenden. Im folgenden Beispiel wird gezeigt, wie Sie mit der AWS SDK für .NET Version 2 und 3 Snapshots löschen. Wenn Sie den Beispielcode verwenden möchten, sollten Sie mit der Ausführung einer .NET-Konsolenanwendung vertraut sein. Weitere Informationen finden Sie unter Erste Schritte im AWS SDK für .NET Entwicklerhandbuch. Falls Sie nur einige Snapshots löschen möchten, verwenden Sie die Konsole, wie hier beschrieben Löschen eines Snapshots.

Beispiel : Löschen von Snapshots mit dem AWS SDK for .NET

Im folgenden C#-Codebeispiel kann ein - AWS Identity and Access Management Benutzer die Snapshots für jedes Volume eines Gateways auflisten. Der Benutzer kann dann bestimmen, ob die Snapshot-Startzeit vor oder nach einem bestimmten Datum (Aufbewahrungszeitraum) liegt, und Snapshots löschen, deren Aufbewahrungszeitraum überschritten ist. Im Beispiel kommt die AWS SDK für .NET-API für Storage Gateway und Amazon EC2 zum Einsatz. Die Amazon-EC2-API beinhaltet Operationen für das Arbeiten mit Snapshots.

Im folgenden Codebeispiel wird das AWS SDK für .NET Version 2 und 3 verwendet. Sie können ältere Versionen von .NET auf die neue Version migrieren. Weitere Informationen finden Sie unter Migrieren Ihres Codes zur neuesten Version des AWS SDK for .NET .

Aktualisieren Sie den Code, um den Service-Endpunkt, den Amazon-Ressourcennamen (ARN) des Gateways sowie die Anzahl der zurückliegenden Tage anzugeben, für die Snapshots gespeichert werden sollen. Snapshots, die vor diesem Zeitlimit aufgenommen wurden, werden gelöscht. Sie müssen außerdem den Booleschen Wert angeben viewOnly, der anzeigt, ob Sie den zu löschenden Snapshot ansehen möchten oder die eigentliche Löschung der Snapshots ausführen möchten. Führen Sie den Code zunächst nur mit der Ansichtsoption aus (weisen Sie also viewOnly den Wert true zu), um zu prüfen, was der Code löschen wird. Eine Liste der AWS Service-Endpunkte, die Sie mit Storage Gateway verwenden können, finden Sie unter AWS Storage Gateway Endpunkte und Kontingente im Allgemeine AWS-Referenz.

Zuerst erstellen Sie einen Benutzer und fügen die minimale IAM-Richtlinie zu dem IAM-Benutzer hinzu. Anschließend planen Sie automatische Snapshots für Ihr Gateway.

Die folgende Codes erstellen die minimale Richtlinie, die einem Benutzer erlauben Snapshots zu löschen. In diesem Beispiel heißt die Richtlinie 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": [ "*" ] } ] }

Der folgende C#-Code sucht alle Snapshots im angegebenen Gateway, die den Volumes und dem angegebenen Unterbrechungszeitraum entsprechen an und löscht sie dann.

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 = "*******************************"; /* 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"; /* 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; } } }

Löschen von Snapshots unter Verwendung der AWS Tools for Windows PowerShell

Um so viele Snapshots im Zusammenhang mit einem Volume zu löschen, können Sie eine programmatische Herangehensweise verwenden. Im folgenden Beispiel wird gezeigt, wie Sie mit den AWS Tools for Windows PowerShell Snapshots löschen. Um das Beispielskript verwenden zu können, sollten Sie mit der Ausführung eines PowerShell Skripts vertraut sein. Weitere Informationen finden Sie unter Erste Schritte im AWS Tools for Windows PowerShell. Falls Sie nur einige Snapshots löschen möchten, verwenden Sie die Konsole, wie hier beschrieben Löschen eines Snapshots.

Beispiel : Löschen von Snapshots mithilfe der AWS Tools for Windows PowerShell

Das folgende PowerShell Skriptbeispiel listet die Snapshots für jedes Volume eines Gateways auf und ob die Snapshot-Startzeit vor oder nach einem bestimmten Datum liegt. Es verwendet die AWS Tools for Windows PowerShell Cmdlets für Storage Gateway und Amazon EC2. Die Amazon-EC2-API beinhaltet Operationen für das Arbeiten mit Snapshots.

Sie müssen das Skript aktualisieren und den Amazon-Ressourcennamen (ARN) des Gateways sowie die Anzahl der zurückliegenden Tage angeben, für die Snapshots gespeichert werden sollen. Snapshots, die vor diesem Zeitlimit aufgenommen wurden, werden gelöscht. Sie müssen außerdem den Booleschen Wert angeben viewOnly, der anzeigt, ob Sie den zu löschenden Snapshot ansehen möchten oder die eigentliche Löschung der Snapshots ausführen möchten. Führen Sie den Code zunächst nur mit der Ansichtsoption aus (weisen Sie also viewOnly den Wert true zu), um zu prüfen, was der Code löschen wird.

<# .DESCRIPTION Delete snapshots of a specified volume that match given criteria. .NOTES PREREQUISITES: 1) AWS Tools for Windows PowerShell from https://aws.amazon.com/powershell/ 2) Credentials and AWS Region stored in session using Initialize-AWSDefault. For more info see, https://docs.aws.amazon.com/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) } }