Excluindo instantâneos de seus volumes de armazenamento - AWS Storage Gateway

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Excluindo instantâneos de seus volumes de armazenamento

Você pode excluir um snapshot de seu volume de armazenamento. Por exemplo, você pode fazer isso se tiver tirado muitos snapshots de um volume de armazenamento ao longo de um período e não precisar dos snapshots mais antigos. Como os snapshots são backups incrementais, se excluir um snapshot, somente os dados que não são necessários em outros snapshots são excluídos.

No EBS console da Amazon, você pode excluir os snapshots um por vez. Para obter informações sobre como excluir snapshots usando o EBS console da Amazon, consulte Excluindo um Amazon EBS Snapshot no Guia do usuário da Amazon EC2.

Para excluir vários instantâneos ao mesmo tempo, você pode usar um AWS SDKs que ofereça suporte às operações do Storage Gateway. Para obter exemplo, consulte Excluindo instantâneos usando o AWS SDK para Java, Excluindo instantâneos usando o AWS SDK for. NET e Como excluir snapshots com as AWS Tools for Windows PowerShell.

Excluindo instantâneos usando o AWS SDK para Java

Para excluir vários snapshots associados a um volume, você pode usar uma abordagem programática. O exemplo a seguir demonstra como excluir instantâneos usando o AWS SDK for Java. Para usar o código de exemplo, você deve estar familiarizado com a execução de aplicativos em console Java. Para obter mais informações, consulte Introdução no Guia do desenvolvedor AWS SDK para Java. Se você precisar excluir apenas alguns snapshots, use o console tal como descrito em Excluindo instantâneos de seus volumes de armazenamento.

exemplo : Excluindo instantâneos usando o for Java AWS SDK

O exemplo de código Java a seguir mostra os snapshots de cada volume do gateway e se o horário de início do snapshot é antes ou depois de uma data específica. Ele usa o AWS SDK para Java API para Storage Gateway e AmazonEC2. A Amazon EC2 API inclui operações para trabalhar com instantâneos.

Atualize o código para fornecer o endpoint do serviço, o Amazon Resource Name (ARN) do gateway e o número de dias atrás em que você deseja salvar os snapshots. Os snapshots tirados antes desse limite são excluídos. Além disso, você precisa especificar o valor booleano viewOnly, que indica se deseja visualizar os snapshots a serem excluídos ou se na verdade deseja excluir os snapshots. Primeiro, execute o código apenas com a opção de visualização (isto é, com viewOnly definida como true) para ver o que o código excluirá. Para obter uma lista dos endpoints de AWS serviço que você pode usar com o Storage Gateway, consulte AWS Storage Gateway Endpoints and Quotas no. Referência geral da 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; } }

Excluindo instantâneos usando o AWS SDK for. NET

Para excluir vários snapshots associados a um volume, você pode usar uma abordagem programática. O exemplo a seguir demonstra como excluir instantâneos usando o AWS SDK for. NETversões 2 e 3. Para usar o código de exemplo, você deve estar familiarizado com a execução de um. NETaplicativo de console. Para obter mais informações, consulte Introdução ao AWS SDKfor. NETGuia do desenvolvedor. Se você precisar excluir apenas alguns snapshots, use o console tal como descrito em Excluindo instantâneos de seus volumes de armazenamento.

exemplo : Excluindo instantâneos usando o AWS SDK for. NET

No exemplo de código C# a seguir, um AWS Identity and Access Management usuário pode listar os instantâneos de cada volume de um gateway. O usuário pode determinar se o horário de início do snapshot deve ser antes ou depois de uma determinada data (período de retenção) e excluir os snapshots que tenham passado do período de retenção. O exemplo usa o AWS SDK for. NETAPIpara Storage Gateway e AmazonEC2. A Amazon EC2 API inclui operações para trabalhar com instantâneos.

O exemplo de código a seguir usa o AWS SDK for. NETversões 2 e 3. Você pode migrar versões mais antigas do. NETpara a versão mais recente. Para obter mais informações, consulte Como migrar seu código para a versão mais recente do AWS SDK for. NET.

Atualize o código para fornecer o endpoint do serviço, o Amazon Resource Name (ARN) do gateway e o número de dias atrás em que você deseja salvar os snapshots. Os snapshots tirados antes desse limite são excluídos. Além disso, você precisa especificar o valor booleano viewOnly, que indica se deseja visualizar os snapshots a serem excluídos ou se na verdade deseja excluir os snapshots. Primeiro, execute o código apenas com a opção de visualização (isto é, com viewOnly definida como true) para ver o que o código excluirá. Para obter uma lista dos endpoints de AWS serviço que você pode usar com o Storage Gateway, consulte AWS Storage Gateway Endpoints and Quotas no. Referência geral da AWS

Primeiro, você cria um usuário e anexa a IAM política mínima ao usuário. Em seguida, você pode programar snapshots automatizados para seu gateway.

O código a seguir cria a política mínima que permite que um usuário do IAM exclua snapshots. Neste exemplo, a política é denominada 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": [ "*" ] } ] }

O código C# a seguir localiza todos os snapshots no gateway especificado que correspondem aos volumes e ao período limite especificado, e os exclui em seguida.

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

Como excluir snapshots com as AWS Tools for Windows PowerShell

Para excluir vários snapshots associados a um volume, você pode usar uma abordagem programática. O exemplo a seguir demonstra como excluir snapshots usando o AWS Tools for Windows PowerShell. Para usar o script de exemplo, você deve estar familiarizado com a execução de um PowerShell script. Para obter mais informações, consulte Conceitos básicos no AWS Tools for Windows PowerShell. Se você precisar excluir somente alguns snapshots, use o console tal como descrito em Excluindo instantâneos de seus volumes de armazenamento.

exemplo : Excluindo instantâneos usando o AWS Tools for Windows PowerShell

O exemplo de PowerShell script a seguir lista os instantâneos de cada volume de um gateway e se o horário de início do instantâneo é antes ou depois de uma data especificada. Ele usa os AWS Tools for Windows PowerShell cmdlets do Storage Gateway e da Amazon. EC2 A Amazon EC2 API inclui operações para trabalhar com instantâneos.

Você precisa atualizar o script e fornecer seu gateway Amazon Resource Name (ARN) e o número de dias atrás em que você deseja salvar os snapshots. Os snapshots tirados antes desse limite são excluídos. Além disso, você precisa especificar o valor booleano viewOnly, que indica se deseja visualizar os snapshots a serem excluídos ou se na verdade deseja excluir os snapshots. Primeiro, execute o código apenas com a opção de visualização (isto é, com viewOnly definida como true) para ver o que o código excluirá.

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