

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Supprimer des instantanés de vos volumes de stockage
<a name="DeletingASnapshot"></a>

Vous pouvez supprimer un instantané de votre volume de stockage, par exemple, si vous avez pris de nombreux instantanés d’un volume de stockage au fil du temps et que vous n’avez pas besoin des instantanés plus anciens. Etant donné que les instantanés sont des sauvegardes incrémentielles, si vous supprimez un instantané, seules les données qui ne sont pas nécessaire dans les autres instantanés sont supprimées. 

**Topics**
+ [Suppression de snapshots à l'aide du AWS SDK for Java](#DeletingSnapshotsUsingJava)
+ [Suppression de snapshots à l'aide du AWS SDK pour .NET](#DeletingSnapshotsUsingDotNet)
+ [Supprimer des instantanés à l'aide du AWS Tools for Windows PowerShell](#DeletingSnapshotsUsingPowerShell)

Sur la console Amazon EBS, vous pouvez supprimer un instantané à la fois. Pour obtenir des informations sur la suppression des instantanés à l’aide de la console Amazon EBS, consultez [Suppression d’un instantané Amazon EBS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-deleting-snapshot.html) dans le *Guide de l’utilisateur Amazon EC2.* 

 Pour supprimer plusieurs instantanés à la fois, vous pouvez utiliser l'un d'entre eux AWS SDKs prenant en charge les opérations de Storage Gateway. Pour obtenir des exemples, consultez [Suppression de snapshots à l'aide du AWS SDK for Java](#DeletingSnapshotsUsingJava), [Suppression de snapshots à l'aide du AWS SDK pour .NET](#DeletingSnapshotsUsingDotNet) et [Supprimer des instantanés à l'aide du AWS Tools for Windows PowerShell](#DeletingSnapshotsUsingPowerShell).

## Suppression de snapshots à l'aide du AWS SDK for Java
<a name="DeletingSnapshotsUsingJava"></a>

Pour supprimer plusieurs instantanés associés à un volume, vous pouvez utiliser une approche par programme. L’exemple suivant montre comment supprimer des instantanés à l’aide du kit logiciel AWS  SDK pour Java. Pour utiliser l’exemple de code, vous devez maîtriser l’exécution d’une application de console Java. Pour plus d’informations, consultez [Mise en route](https://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-setup.html) dans le *Manuel du développeur du kit logiciel AWS  SDK pour Java*. Si vous avez besoin de supprimer quelques instantanés seulement, utilisez la console comme décrit dans [Supprimer des instantanés de vos volumes de stockage](#DeletingASnapshot).

**Example : Suppression de snapshots à l'aide du AWS SDK for Java**  
L’exemple de code Java suivant répertorie les instantanés de chaque volume d’une passerelle et si l’heure de début d’un instantané est antérieure ou postérieure à une date spécifiée. Il utilise l'API AWS SDK for Java pour Storage Gateway et Amazon EC2. L’API Amazon EC2 inclut des opérations pour l’utilisation des instantanés.   
Mettez le code à jour pour fournir le point de terminaison de service, votre passerelle Amazon Resource Name (ARN) et le nombre de jours pendant lesquels vous souhaitez enregistrer des instantanés. Les instantanés pris avant cette date sont supprimés. Vous devez également spécifier la valeur booléenne `viewOnly`, qui indique si vous souhaitez afficher les instantanés à supprimer ou exécuter vraiment les suppressions d’instantanés. Commencez par exécuter le code avec uniquement l’option d’affichage (c’est-à-dire avec `viewOnly` défini sur `true`) pour voir ce que le code supprime. Pour obtenir la liste des points de terminaison de AWS service que vous pouvez utiliser avec Storage Gateway, consultez la section [AWS Storage Gateway Endpoints and Quotas](https://docs.aws.amazon.com/general/latest/gr/sg.html) dans le. *Références générales 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;
    }

}
```

## Suppression de snapshots à l'aide du AWS SDK pour .NET
<a name="DeletingSnapshotsUsingDotNet"></a>

Pour supprimer plusieurs instantanés associés à un volume, vous pouvez utiliser une approche par programme. L’exemple suivant montre comment supprimer des instantanés à l’aide du kit logiciel AWS SDK pour .NET versions 2 et 3. Pour utiliser l’exemple de code, vous devez maîtriser l’exécution d’une application de console .NET. Pour plus d’informations, consultez [Mise en route](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-config.html) dans le *Manuel du développeur du kit logiciel AWS  SDK pour .NET*. Si vous avez besoin de supprimer quelques instantanés seulement, utilisez la console comme décrit dans [Supprimer des instantanés de vos volumes de stockage](#DeletingASnapshot).

**Example : Suppression de snapshots à l'aide du AWS SDK pour .NET**  
Dans l'exemple de code C\$1 suivant, un Gestion des identités et des accès AWS utilisateur peut répertorier les instantanés pour chaque volume d'une passerelle. L’utilisateur peut alors déterminer si l’heure de début de l’instantané est antérieure ou postérieure à une date spécifiée (période de conservation) et supprimer les instantanés qui ont dépassé cette période. L'exemple utilise le AWS SDK pour l'API .NET pour Storage Gateway et Amazon EC2. L’API Amazon EC2 inclut des opérations pour l’utilisation des instantanés.   
L'exemple de code suivant utilise le AWS SDK pour .NET versions 2 et 3. Vous pouvez migrer des versions antérieures de .NET vers la nouvelle version. Pour plus d'informations, consultez la section [Migration de votre projet pour le AWS SDK](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-migrating.html) pour .NET.  
Mettez le code à jour pour fournir le point de terminaison de service, votre passerelle Amazon Resource Name (ARN) et le nombre de jours pendant lesquels vous souhaitez enregistrer des instantanés. Les instantanés pris avant cette date sont supprimés. Vous devez également spécifier la valeur booléenne `viewOnly`, qui indique si vous souhaitez afficher les instantanés à supprimer ou exécuter vraiment les suppressions d’instantanés. Commencez par exécuter le code avec uniquement l’option d’affichage (c’est-à-dire avec `viewOnly` défini sur `true`) pour voir ce que le code supprime. Pour obtenir la liste des points de terminaison de AWS service que vous pouvez utiliser avec Storage Gateway, consultez la section [AWS Storage Gateway Endpoints and Quotas](https://docs.aws.amazon.com/general/latest/gr/sg.html) dans le. *Références générales AWS*   
 Tout d’abord, vous créez un utilisateur et vous attachez la politique IAM minimum à cet utilisateur. Vous planifiez ensuite des instantanés automatiques pour votre passerelle.   
Le code suivant crée la stratégie minimum qui permet à un utilisateur de supprimer des instantanés. Dans cet exemple, la stratégie se nomme **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": [
                  "*"
              ]
          }
      ]
  }
```
Le code C\$1 suivant recherche tous les instantanés de la passerelle spécifiée qui correspondent aux volumes et à la période limite, puis il les supprime.   

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

## Supprimer des instantanés à l'aide du AWS Tools for Windows PowerShell
<a name="DeletingSnapshotsUsingPowerShell"></a>

Pour supprimer plusieurs instantanés associés à un volume, vous pouvez utiliser une approche par programme. L’exemple suivant montre comment supprimer des instantanés à l’aide de AWS Tools for Windows PowerShell. Pour utiliser l'exemple de script, vous devez être familiarisé avec l'exécution d'un PowerShell script. Pour plus d’informations, consultez [Démarrez](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-started.html) dans le *AWS Tools for Windows PowerShell*. Si vous avez besoin de supprimer quelques instantanés, utilisez la console comme décrit dans [Supprimer des instantanés de vos volumes de stockage](#DeletingASnapshot).

**Example : Supprimer des instantanés à l'aide du AWS Tools for Windows PowerShell**  
L'exemple de PowerShell script suivant répertorie les instantanés pour chaque volume d'une passerelle et indique si l'heure de début des instantanés est antérieure ou postérieure à une date spécifiée. Il utilise les AWS Tools for Windows PowerShell applets de commande pour Storage Gateway et Amazon EC2. L’API Amazon EC2 inclut des opérations pour l’utilisation des instantanés.  
Vous devez mettre le code à jour et fournir votre passerelle Amazon Resource Name (ARN) et le nombre de jours pendant lesquels vous souhaitez enregistrer des instantanés. Les instantanés pris avant cette date sont supprimés. Vous devez également spécifier la valeur booléenne `viewOnly`, qui indique si vous souhaitez afficher les instantanés à supprimer ou exécuter vraiment les suppressions d’instantanés. Commencez par exécuter le code avec uniquement l’option d’affichage (c’est-à-dire avec `viewOnly` défini sur `true`) pour voir ce que le code supprime.   

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