Eliminación de una instantánea - AWS Storage Gateway

La documentación de puerta de enlace de archivo de Amazon S3 se ha trasladado a What is Amazon S3 File Gateway?

La documentación de Amazon FSx File Gateway se ha trasladado a ¿Qué es Amazon FSx File Gateway?

La documentación de puerta de enlace de cinta se ha trasladado a ¿Qué es una puerta de enlace de cinta?

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Eliminación de una instantánea

Es posible eliminar instantáneas del volumen de almacenamiento. Quizá desee hacerlo si, por ejemplo, ha tomado muchas instantáneas de un volumen de almacenamiento y no necesita las más antiguas. Dado que las instantáneas son copias de seguridad incrementales, si se elimina una instantánea, solo se eliminarán los datos que no se necesiten en otras instantáneas.

En la consola de Amazon EBS, puede eliminar instantáneas de una en una. Para obtener información sobre cómo eliminar instantáneas de la consola de Amazon EBS, consulte Eliminar una instantánea de Amazon EBS en la Guía del usuario de Amazon EC2.

Para eliminar varias instantáneas a la vez, puede usar uno de los AWS SDK que admiten las operaciones de Storage Gateway. Para ver ejemplos, consulte Eliminación de instantáneas utilizando el AWS SDK para Java, Eliminación de instantáneas utilizando el AWS SDK para .NET y Eliminación de instantáneas utilizando el AWS Tools for Windows PowerShell.

Eliminación de instantáneas utilizando el AWS SDK para Java

Para eliminar muchas instantáneas asociadas con un volumen, puede utilizar un enfoque programático. En el ejemplo siguiente se muestra cómo eliminar instantáneas utilizando el AWS SDK para Java. Para utilizar el código del ejemplo, debe haberse familiarizado con la ejecución de aplicaciones de la consola de Java. Para obtener más información, consulte Introducción en la Guía para desarrolladores de AWS SDK para Java. Si solo necesita iluminar algunas instantáneas, utilice la consola como se describe en Eliminación de una instantánea.

ejemplo : Eliminar instantáneas mediante el AWS SDK para Java

En el siguiente ejemplo de código Java se muestran las instantáneas para cada volumen de una gateway y si la hora de inicio de la instantánea es anterior o posterior a una fecha especificada. Utiliza la API de AWS SDK for Java para Storage Gateway y Amazon EC2. La API de Amazon EC2 incluye operaciones para trabajar con instantáneas.

Actualice el código para proporcionar el punto de enlace de servicio, el Nombre de recurso de Amazon (ARN) de la gateway y el número de días pasados cuyas instantáneas desea guardar. Las instantáneas realizadas antes de la fecha más antigua se eliminan. También debe especificar el valor booleano viewOnly, que indica si desea ver las instantáneas que se vayan a eliminar o realizar realmente las eliminaciones de instantáneas. Primero ejecute el código solo con la opción de vista (es decir, con viewOnly con el valor true) para ver qué elimina el código. Para obtener una lista de los puntos de enlace de AWS servicio que puede usar con Storage Gateway, consulte AWS Storage Gateway Puntos de conexión y cuotas en. Referencia general de 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; } }

Eliminación de instantáneas utilizando el AWS SDK para .NET

Para eliminar muchas instantáneas asociadas con un volumen, puede utilizar un enfoque programático. En el ejemplo siguiente se muestra cómo eliminar instantáneas utilizando el AWS SDK para .NET versión 2 y 3. Para utilizar el código del ejemplo, debe haberse familiarizado con la ejecución de aplicaciones de la consola de .NET. Para obtener más información, consulte Introducción en la Guía para desarrolladores de AWS SDK para .NET. Si solo necesita iluminar algunas instantáneas, utilice la consola como se describe en Eliminación de una instantánea.

ejemplo : Eliminar instantáneas mediante el AWS SDK para .NET

En el siguiente ejemplo de código en C#, un AWS Identity and Access Management usuario puede enumerar las instantáneas de cada volumen de una puerta de enlace. Eso permite al usuario determinar si la hora de inicio de la instantánea es anterior o posterior a una fecha especificada (periodo de retención) y eliminar las instantáneas que hayan superado el periodo de retención. En el ejemplo se utiliza la API de AWS SDK para .NET de Storage Gateway y Amazon EC2. La API de Amazon EC2 incluye operaciones para trabajar con instantáneas.

En el siguiente ejemplo de código se utiliza el AWS SDK para las versiones 2 y 3 de S.NET. Puede migrar las versiones más antiguas de .NET a la versión más reciente. Para obtener más información, consulte Migración del código a la última versión del AWS SDK para .NET.

Actualice el código para proporcionar el punto de enlace de servicio, el Nombre de recurso de Amazon (ARN) de la gateway y el número de días pasados cuyas instantáneas desea guardar. Las instantáneas realizadas antes de la fecha más antigua se eliminan. También debe especificar el valor booleano viewOnly, que indica si desea ver las instantáneas que se vayan a eliminar o realizar realmente las eliminaciones de instantáneas. Primero ejecute el código solo con la opción de vista (es decir, con viewOnly con el valor true) para ver qué elimina el código. Para obtener una lista de los puntos de enlace de AWS servicio que puede usar con Storage Gateway, consulte AWS Storage Gateway Puntos de conexión y cuotas en. Referencia general de AWS

En primer lugar, cree un usuario y asocie la política de IAM mínima al usuario. A continuación, programe instantáneas automatizadas para la gateway.

El siguiente código crea la política mínima que permite a un usuario eliminar instantáneas. En este ejemplo, la política se denomina 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": [ "*" ] } ] }

El siguiente código de C# comprueba todas las instantáneas de la gateway especificada que coinciden con los volúmenes y el periodo de corte especificado y las 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; } } }

Eliminación de instantáneas utilizando el AWS Tools for Windows PowerShell

Para eliminar muchas instantáneas asociadas con un volumen, puede utilizar un enfoque programático. En el ejemplo siguiente se muestra cómo eliminar instantáneas utilizando el AWS Tools for Windows PowerShell. Para usar el script de ejemplo, debe estar familiarizado con la ejecución de un PowerShell script. Para obtener más información, consulte Introducción en la AWS Tools for Windows PowerShell. Si solo necesita iluminar algunas instantáneas, utilice la consola como se describe en Eliminación de una instantánea.

ejemplo : Eliminar instantáneas mediante el AWS Tools for Windows PowerShell

El siguiente ejemplo de PowerShell script muestra las instantáneas de cada volumen de una puerta de enlace y indica si la hora de inicio de la instantánea es anterior o posterior a una fecha especificada. Utiliza los AWS Tools for Windows PowerShell cmdlets de Storage Gateway y Amazon EC2. La API de Amazon EC2 incluye operaciones para trabajar con instantáneas.

Deberá actualizar el código del script para proporcionar el Nombre de recurso de Amazon (ARN) de la gateway y el número de días pasados cuyas instantáneas desea guardar. Las instantáneas realizadas antes de la fecha más antigua se eliminan. También debe especificar el valor booleano viewOnly, que indica si desea ver las instantáneas que se vayan a eliminar o realizar realmente las eliminaciones de instantáneas. Primero ejecute el código solo con la opción de vista (es decir, con viewOnly con el valor true) para ver qué elimina el código.

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