IBM Cloud Docs
Vidage d'un seau

Vidage d'un seau

Cette présentation se concentre sur les étapes nécessaires pour accéder à la liste de tous les éléments d'un compartiment dans une instance de IBM Cloud® Object Storage afin de supprimer chaque élément de manière séquentielle.

Le processus de vidage d'un compartiment est familier à toute personne qui doit supprimer des compartiments dans son instance de IBM Cloud Object Storage car un compartiment doit être vide pour être supprimé. Il peut y avoir d'autres raisons pour lesquelles vous souhaitez supprimer des éléments, mais vous souhaitez éviter de supprimer chaque objet individuellement. Ce modèle de code pour les logiciels SDK pris en charge vous permet de définir votre configuration, de créer un client, puis de vous connecter à ce client pour obtenir la liste de tous les éléments d'un compartiment identifié afin de les supprimer.

Si la gestion des versions est activée, les règles d'expiration créent des marqueurs de suppression.

Il est recommandé d'éviter de placer des données d'identification dans des scripts. Cet exemple est destiné à des fins de test et de formation, et votre configuration spécifique doit être informée par les meilleures pratiques et Developer Guidance.

Avant de commencer

Des instructions spécifiques pour le téléchargement et l'installation de logiciels SDK sont disponibles pour Python, Node.js, Java et Go. De plus, lorsque vous utilisez les instructions de ligne de commande (CLI) et vos clients CLI, consultez les informations pertinentes relatives à Object Storage concernant la compatibilité AWS, Minio et rclone.

Pour ce modèle de code, vous aurez besoin:

Utilisation de la console

Avant d'accéder aux exemples, il est possible de vider un compartiment via l'interface graphique sur la console IBM Clouden utilisant une règle d'expiration sur le compartiment lui-même. Pour plus d'informations, consultez la documentation relative à la suppression de données périmées avec des règles d'expiration.

Après vous être connecté à Object Storage, choisissez votre instance de stockage. Ensuite, sélectionnez votre compartiment dans la liste de vos compartiments. Pour définir la règle de suppression des éléments, sélectionnez Configuration dans le menu de navigation et cliquez sur Ajouter une règle dans la section Règle d'expiration. Définissez le nombre de jours sur '1' pour supprimer tous les éléments après un jour.

Ajouter une règle d'expiration pour supprimer les articles

Le processus d'achèvement de la règle peut prendre jusqu'à 24 heures et est planifié selon une planification définie. Veuillez en tenir compte lors de l'application de cette technique.

Exemples de client CLI

De nombreux outils sont disponibles pour aider les utilisateurs à tirer le meilleur parti de Object Storage et les clients CLI suivants offrent des moyens simples de vider les compartiments.

Des exemples d'instructions sont fournis pour l'utilisation d'une application client ou d'une ligne de commande une fois que votre client CLI a été configuré et qu'il est opérationnel.

rcloneexemple

L'outil " rclone est généralement utilisé pour maintenir les répertoires synchronisés et pour migrer les données entre les plates-formes de stockage. Pour en savoir plus, consultez la documentation relative à à l'aide de rclone.

rclone purge {remote}:{path} [flags]

Exemple Minio

Le client open source Minio vous permet d'utiliser des commandes de type UNIX (ls, cp, cat, etc.) avec IBM Cloud® Object Storage. Pour plus d'informations, voir Utilisation de Minio.

mc rm --recursive --force {instance-alias}/{bucket-name}

Exemple AWS

L'interface de ligne de commande officielle pour AWS est compatible avec l'API IBM Cloud Object Storage S3 et vous pouvez découvrir comment utiliser l'interface de ligne de commande AWS.

aws s3 rm s3://{bucket-name} --recursive

Exemple de code

La suppression d'un répertoire entier ou la suppression de tout le contenu d'un compartiment peut prendre du temps à supprimer chaque objet, un par un. La possibilité de supprimer un élément à la fois peut être optimisée pour gagner du temps et de l'effort en collectant une liste de tous les éléments avant la suppression.

La rubrique elle-même met en évidence le risque de suppression: les données seront perdues. Bien sûr, lorsque c'est l'objectif, il convient de faire preuve de prudence en ce qui concerne le fait que seules les suppressions ciblées doivent être effectuées. Vérifiez les instances, les noms de compartiment et les éventuels préfixes ou chemins à spécifier.

Présentation

Le modèle de code de cet exercice configure un client avant d'en créer un pour la collecte d'une liste d'éléments en vue de la suppression de chaque objet.

Le modèle de code de cet exercice configure un client avant d'en créer un pour la collecte d'une liste d'éléments en vue de la suppression de chaque objet.

Le modèle de code de cet exercice configure un client avant d'en créer un pour la collecte d'une liste d'éléments en vue de la suppression de chaque objet.

Le modèle de code de cet exercice configure un client avant d'en créer un pour la collecte d'une liste d'éléments en vue de la suppression de chaque objet.

const myCOS = require('ibm-cos-sdk');

var config = {
    endpoint: 's3.us-geo.cloud-object-storage.appdomain.cloud',
    apiKeyId: 'd-2-DO-NOT-USEevplExampleo_t3ZTCJO',
    ibmAuthEndpoint: 'https://iam.cloud.ibm.com/identity/token',
    serviceInstanceId: 'crn:v1:bluemix:public:cloud-object-storage:global:a/SAMPLE253abf6e65dca920c9d58126b:3f656f43-5c2a-941e-b128-DO-NOT-USE::',
};

var cosClient = new myCOS.S3(config);

function logDone() {
    console.log('COMPLETE!\n');
}

function logError(e) {
    console.log(`ERROR: ${e.code} - ${e.message}\n`);
}

// Retrieve the list of contents from a bucket for deletion
function deleteContents(bucketName) {
    var returnArr = new Array();

    console.log(`Retrieving bucket contents from: ${bucketName}\n`);
    return cosClient.listObjects(
        {Bucket: bucketName},
    ).promise()
    .then((data) => {
        if (data != null && data.Contents != null) {
            for (var i = 0; i < data.Contents.length; i++) {
                returnArr.push(data.Contents[i].Key);
                var itemKey = data.Contents[i].Key;
                var itemSize = data.Contents[i].Size;
                console.log(`Item: ${itemKey} (${itemSize} bytes).\n`)
            }
            deleteItem(bucketName, itemName);
            logDone();
        }
    })
    .catch(logError);
}

// Delete item
function deleteItem(bucketName, itemName) {
    console.log(`Deleting item: ${itemName}`);
    return cosClient.deleteObject({
        Bucket: bucketName,
        Key: itemName
    }).promise()
    .then(() =>{
        console.log(`Item: ${itemName} deleted!`);
    })
    .catch(logError);
}

function main() {
    try {
        var BucketName = "<BUCKET_NAME>";

        deleteContents(BucketName);
    }
    catch(ex) {
        logError(ex);
    }
}

main();
import ibm_boto3
from ibm_botocore.client import Config, ClientError

# Constants for IBM COS values
COS_ENDPOINT = "<endpoint>" # Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
COS_API_KEY_ID = "<api-key>" # eg "W00YiRnLW4a3fTjMB-odB-2ySfTrFBIQQWanc--P3byk"
COS_AUTH_ENDPOINT = "https://iam.cloud.ibm.com/identity/token"
COS_RESOURCE_CRN = "<resource-instance-id>" # eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003abfb5d29761c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"

# Create resource
cos = ibm_boto3.resource("s3",
    ibm_api_key_id=COS_API_KEY_ID,
    ibm_service_instance_id=COS_RESOURCE_CRN,
    ibm_auth_endpoint=COS_AUTH_ENDPOINT,
    config=Config(signature_version="oauth"),
    endpoint_url=COS_ENDPOINT
)

def get_bucket_contents(bucket_name, max_keys):
    print("Retrieving bucket contents from: {0}".format(bucket_name))
    returnArray = []
    try:
        files = cos.Bucket(bucket_name).objects.all()
        for file in files:
            print("Item: {0} ({1} bytes).".format(file["Key"], file["Size"]))
            returnArray.append(file["Key"])

    except ClientError as be:
        print("CLIENT ERROR: {0}\n".format(be))
    except Exception as e:
        print("Unable to retrieve bucket contents: {0}".format(e))

    return returnArray

def delete_item(bucket_name, item_name):
    print("Deleting item: {0}".format(item_name))
    try:
        cos.Object(bucket_name, item_name).delete()
        print("Item: {0} deleted!".format(item_name))
    except ClientError as be:
        print("CLIENT ERROR: {0}\n".format(be))
    except Exception as e:
        print("Unable to delete item: {0}".format(e))

def main():
    bucket = "<bucket_name>"
    deleteListArray = get_bucket_contents(bucket, 1000)
    for item_name in deleteListArray:
        delete_item(bucket, item_name)

main()
package com.cos;

    import java.sql.Timestamp;
    import java.util.List;

    import com.ibm.cloud.objectstorage.ClientConfiguration;
    import com.ibm.cloud.objectstorage.SDKGlobalConfiguration;
    import com.ibm.cloud.objectstorage.auth.AWSCredentials;
    import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
    import com.ibm.cloud.objectstorage.auth.BasicAWSCredentials;
    import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder.EndpointConfiguration;
    import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
    import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
    import com.ibm.cloud.objectstorage.services.s3.model.Bucket;
    import com.ibm.cloud.objectstorage.services.s3.model.ListObjectsRequest;
    import com.ibm.cloud.objectstorage.services.s3.model.ListObjectsV2Request;
    import com.ibm.cloud.objectstorage.services.s3.model.ListObjectsV2Result;
    import com.ibm.cloud.objectstorage.services.s3.model.ObjectListing;
    import com.ibm.cloud.objectstorage.services.s3.model.S3ObjectSummary;
    import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;

    public class CosDeleteMultipleItems
    {

        private static AmazonS3 _cosClient;

        /**
         * @param args
         */
        public static void main(String[] args)
        {

            SDKGlobalConfiguration.IAM_ENDPOINT = "https://iam.cloud.ibm.com/identity/token";

            String bucketName = "<BUCKET_NAME>";  // eg my-unique-bucket-name
            String newBucketName = "<NEW_BUCKET_NAME>"; // eg my-other-unique-bucket-name
            String api_key = "<API_KEY>"; // eg "W00YiRnLW4k3fTjMB-oiB-2ySfTrFBIQQWanc--P3byk"
            String service_instance_id = "<SERVICE_INSTANCE_ID"; // eg "crn:v1:bluemix:public:cloud-object-storage:global:a/3bf0d9003abfb5d29761c3e97696b71c:d6f04d83-6c4f-4a62-a165-696756d63903::"
            String endpoint_url = "https://s3.us.cloud-object-storage.appdomain.cloud"; // this could be any service endpoint

            String storageClass = "us-geo";
            String location = "us";

            _cosClient = createClient(api_key, service_instance_id, endpoint_url, location);

            contentsForDeletion(bucketName, 1000);

            for(Int deletedItem: itemsForDeletion) {
                deleteItem(bucketName, deletedItem.getKey());
                System.out.printf("Deleted item: %s\n", deletedItem.getKey());
            }
        }

        /**
         * @param api_key
         * @param service_instance_id
         * @param endpoint_url
         * @param location
         * @return AmazonS3
         */
        public static AmazonS3 createClient(String api_key, String service_instance_id, String endpoint_url, String location)
        {
            AWSCredentials credentials;
            credentials = new BasicIBMOAuthCredentials(api_key, service_instance_id);

            ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
            clientConfig.setUseTcpKeepAlive(true);

            AmazonS3 cosClient = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withEndpointConfiguration(new EndpointConfiguration(endpoint_url, location)).withPathStyleAccessEnabled(true)
                    .withClientConfiguration(clientConfig).build();
            return cosClient;
        }

        public static List contentsForDeletion(String bucketName, int maxKeys) {
            System.out.printf("Retrieving bucket contents (V2) from: %s\n", bucketName);

            boolean moreResults = true;
            String nextToken = "";

            while (moreResults) {
                ListObjectsV2Request request = new ListObjectsV2Request()
                    .withBucketName(bucketName)
                    .withMaxKeys(maxKeys)
                    .withContinuationToken(nextToken);

                ListObjectsV2Result result = _cosClient.listObjectsV2(request);
                for(S3ObjectSummary objectSummary : result.getObjectSummaries()) {
                    System.out.printf("Item: %s (%s bytes)\n", objectSummary.getKey(), objectSummary.getSize());
                    deleteItem(bucketName, objectSummary.getKey());
                }

                if (result.isTruncated()) {
                    nextToken = result.getNextContinuationToken();
                    System.out.println("...More results in next batch!\n");
                }
                else {
                    nextToken = "";
                    moreResults = false;
                }
            }
            System.out.println("...No more results!");
        }

        public static void deleteItem(String bucketName, String itemName) {
            System.out.printf("Deleting item: %s\n", itemName);
            _cosClient.deleteObject(bucketName, itemName);
            System.out.printf("Item: %s deleted!\n", itemName);
        }

    }
import (
    "github.com/IBM/ibm-cos-sdk-go/aws/credentials/ibmiam"
    "github.com/IBM/ibm-cos-sdk-go/aws"
    "github.com/IBM/ibm-cos-sdk-go/aws/session"
    "github.com/IBM/ibm-cos-sdk-go/service/s3"
)

// Constants for IBM COS values
const (
    apiKey            = "<API_KEY>"  // eg "0viPHOY7LbLNa9eLftrtHPpTjoGv6hbLD1QalRXikliJ"
    serviceInstanceID = "<RESOURCE_INSTANCE_ID>" // "crn:v1:bluemix:public:cloud-object-storage:global:a/<CREDENTIAL_ID_AS_GENERATED>:<SERVICE_ID_AS_GENERATED>::"
    authEndpoint      = "https://iam.cloud.ibm.com/identity/token"
    serviceEndpoint   = "<SERVICE_ENDPOINT>" // eg "https://s3.us.cloud-object-storage.appdomain.cloud"
    bucketLocation    = "<LOCATION>" // eg "us"
)

// Create config
conf := aws.NewConfig().
    WithRegion("us-standard").
    WithEndpoint(serviceEndpoint).
    WithCredentials(ibmiam.NewStaticCredentials(aws.NewConfig(), authEndpoint, apiKey, serviceInstanceID)).
    WithS3ForcePathStyle(true)

func main() {

    // Create client
    sess := session.Must(session.NewSession())
    client := s3.New(sess, conf)

    // Bucket Names
    Bucket := "<BUCKET_NAME>"
    Input := &s3.ListObjectsV2Input{
            Bucket: aws.String(Bucket),
        }

    res, _ := client.ListObjectsV2(Input)

    for _, item := range res.Contents {
        input := &s3.DeleteObjectInput{
                Bucket: aws.String(Bucket),
                Key:    aws.String(*item.Key),
            }
        d, _ := client.DeleteObject(input)
        fmt.Println(d)
    }
}

Etapes suivantes

L'exploitation des capacités nouvelles et existantes des outils couverts dans cette vue d'ensemble peut être explorée plus en détail à l'adresse suivante: PlateformeIBM Cloud.