Eliminazione di uno snapshot - AWS Storage Gateway

La documentazione del gateway di file Amazon S3 è stata spostata in Cos'è un gateway di file Amazon S3?

La documentazione di Amazon FSx File Gateway è stata spostata in Cos'è Amazon FSx File Gateway?

La documentazione del gateway di nastri virtuali è stata spostata in Cos'è un gateway di nastri virtuali?

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Eliminazione di uno snapshot

Puoi eliminare uno snapshot del volume di storage. Ad esempio, potresti doverlo fare se hai acquisito molti snapshot di un volume di storage nel tempo e quelli meno recenti non ti servono più. Poiché gli snapshot sono backup incrementali, se ne elimini uno, verranno eliminati solo i dati che non sono necessari negli altri snapshot.

Nella console Amazon EBS puoi eliminare uno snapshot per volta. Per informazioni su come eliminare snapshot tramite la console Amazon EBS, consulta Eliminazione di uno snapshot Amazon EBS nella Guida per l'utente di Amazon EC2.

Per eliminare più istantanee alla volta, puoi utilizzare uno degli AWS SDK che supportano le operazioni di Storage Gateway. Per alcuni esempi, consulta Eliminazione di snapshot tramite l'SDK AWS per Java, Eliminazione di snapshot tramite l'SDK AWS per .NET e Eliminazione di snapshot tramite AWS Tools for Windows PowerShell.

Eliminazione di snapshot tramite l'SDK AWS per Java

Per eliminare molti snapshot associati a un volume, puoi usare un approccio programmatico. L'esempio seguente descrive come eliminare snapshot tramite l'SDK AWS per Java. Per usare il codice di esempio, devi avere familiarità con l'esecuzione di un'applicazione di console Java. Per ulteriori informazioni, consulta Nozioni di base nella Guida per gli sviluppatori dell'SDK AWS per Java. Se devi eliminare solo pochi snapshot, usa la console, come descritto in Eliminazione di uno snapshot.

Esempio : eliminazione di istantanee utilizzando l' AWS SDK for Java

L'esempio di codice Java seguente elenca gli snapshot per ogni volume di un gateway e indica se la data di inizio dello snapshot è precedente o successiva a una data specificata. Utilizza l'API AWS SDK for Java per Storage Gateway e Amazon EC2. L'API di Amazon EC2 include operazioni per l'uso di snapshot.

Aggiorna il codice per fornire l'endpoint del servizio, il nome della risorsa Amazon (ARN) del gateway e il numero di giorni precedenti per cui vuoi salvare gli snapshot. Verranno eliminati gli snapshot acquisiti prima di questo limite. Potresti anche dover specificare il valore booleano viewOnly, che indica se vuoi visualizzare gli snapshot da eliminare o eseguire effettivamente le eliminazioni degli snapshot. Prima di tutto, esegui il codice solo con l'opzione di visualizzazione, ovvero con viewOnly impostato su true, per visualizzare gli snapshot eliminati dal codice. Per un elenco degli endpoint di AWS servizio che è possibile utilizzare con Storage Gateway, vedere AWS Storage Gateway Endpoints and Quotas nel. Riferimenti generali di 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; } }

Eliminazione di snapshot tramite l'SDK AWS per .NET

Per eliminare molti snapshot associati a un volume, puoi usare un approccio programmatico. L'esempio seguente descrive come eliminare snapshot tramite l'SDK AWS per .NET versioni 2 e 3. Per usare il codice di esempio, devi avere familiarità con l'esecuzione di un'applicazione di console .NET. Per ulteriori informazioni, consulta Nozioni di base nella Guida per gli sviluppatori dell'SDK AWS per .NET. Se devi eliminare solo pochi snapshot, usa la console, come descritto in Eliminazione di uno snapshot.

Esempio : eliminazione di istantanee utilizzando l' AWS SDK for .NET

Nel seguente esempio di codice C#, un AWS Identity and Access Management utente può elencare le istantanee per ogni volume di un gateway. L'utente può quindi determinare se la data di inizio dello snapshot è precedente o successiva a una data specificata (periodo di conservazione) ed eliminare gli snapshot che hanno superato questo periodo di conservazione. L'esempio utilizza l'API SDK AWS per .NET per Storage Gateway e Amazon EC2. L'API di Amazon EC2 include operazioni per l'uso di snapshot.

L'esempio di codice seguente utilizza l' AWS SDK for .NET versione 2 e 3. Puoi eseguire la migrazione delle versioni precedenti di .NET alla versione più recente. Per ulteriori informazioni, consulta Migrazione del codice all'ultima versione dell' AWS SDK for .NET.

Aggiorna il codice per fornire l'endpoint del servizio, il nome della risorsa Amazon (ARN) del gateway e il numero di giorni precedenti per cui vuoi salvare gli snapshot. Verranno eliminati gli snapshot acquisiti prima di questo limite. Potresti anche dover specificare il valore booleano viewOnly, che indica se vuoi visualizzare gli snapshot da eliminare o eseguire effettivamente le eliminazioni degli snapshot. Prima di tutto, esegui il codice solo con l'opzione di visualizzazione, ovvero con viewOnly impostato su true, per visualizzare gli snapshot eliminati dal codice. Per un elenco degli endpoint di AWS servizio che è possibile utilizzare con Storage Gateway, vedere AWS Storage Gateway Endpoints and Quotas nel. Riferimenti generali di AWS

Prima di tutto, devi creare un utente e collegare la policy IAM minima all'utente. Puoi quindi pianificare gli snapshot automatici per il gateway.

Il codice seguente crea la policy minima che permette a un utente di eliminare snapshot. In questo esempio, la policy è denominata 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": [ "*" ] } ] }

Il codice C# seguente trova nel gateway specificato tutti gli snapshot che corrispondono ai volumi e al periodo limite e quindi li elimina.

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

Eliminazione di snapshot tramite AWS Tools for Windows PowerShell

Per eliminare molti snapshot associati a un volume, puoi usare un approccio programmatico. L'esempio seguente descrive come eliminare snapshot tramite AWS Tools for Windows PowerShell. Per utilizzare lo script di esempio, è necessario avere dimestichezza con l'esecuzione di uno PowerShell script. Per ulteriori informazioni, consulta l'argomento relativo alle nozioni di base nella AWS Tools for Windows PowerShell. Se devi eliminare solo pochi snapshot, usa la console, come descritto in Eliminazione di uno snapshot.

Esempio : Eliminazione di istantanee utilizzando AWS Tools for Windows PowerShell

Il seguente esempio di PowerShell script elenca le istantanee per ogni volume di un gateway e indica se l'ora di inizio dell'istantanea è precedente o successiva a una data specificata. Utilizza i AWS Tools for Windows PowerShell cmdlet per Storage Gateway e Amazon EC2. L'API di Amazon EC2 include operazioni per l'uso di snapshot.

Devi aggiornare lo script e specificare l'ARN (Amazon Resource Name) del gateway e il numero di giorni precedenti per cui vuoi salvare gli snapshot. Verranno eliminati gli snapshot acquisiti prima di questo limite. Potresti anche dover specificare il valore booleano viewOnly, che indica se vuoi visualizzare gli snapshot da eliminare o eseguire effettivamente le eliminazioni degli snapshot. Prima di tutto, esegui il codice solo con l'opzione di visualizzazione, ovvero con viewOnly impostato su true, per visualizzare gli snapshot eliminati dal codice.

<# .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) } }