IBM Cloud Docs
Vaciado de un grupo

Vaciado de un grupo

Esta visión general se centra en los pasos necesarios para acceder a una lista de todos los elementos de un grupo dentro de una instancia de IBM Cloud® Object Storage con el fin de suprimir cada uno de forma secuencial.

El proceso de vaciar un grupo es familiar para cualquiera que tenga que suprimir grupos en su instancia de IBM Cloud Object Storage porque un grupo tiene que estar vacío para poder suprimirlo. Puede haber otras razones por las que desee suprimir elementos, pero desea evitar suprimir cada objeto individualmente. Este patrón de código para los SDK soportados le permitirá definir la configuración, crear un cliente y, a continuación, conectarse con ese cliente para obtener una lista de todos los elementos de un grupo identificado para suprimirlos.

Si el mantenimiento de versiones está habilitado, las reglas de caducidad crean marcadores de supresión.

Se recomienda evitar la colocación de credenciales en scripts. Este ejemplo es para fines de prueba y formación, y la configuración específica debe estar informada por las prácticas recomendadas y la Guía del desarrollador.

Antes de empezar

Dispone de instrucciones específicas para descargar e instalar SDK para Python, Node.js, Java y Go. Además, cuando trabaje con las instrucciones de línea de mandatos (CLI) y los clientes de CLI, consulte la información pertinente relacionada con Object Storage en relación con la compatibilidad de AWS, Minio y rclone.

Para este patrón de código, necesitará:

Utilización de la consola

Antes de llegar a los ejemplos, hay una forma de vaciar un grupo a través de la GUI en la consola deIBM Cloud: utilizando una regla de caducidad en el propio grupo. Para obtener más información, consulte la documentación sobre supresión de datos obsoletos con reglas de caducidad.

Después de iniciar sesión en Object Storage, elija su instancia de almacenamiento. A continuación, seleccione el grupo en la lista de grupos. Para establecer la regla para eliminar los elementos, seleccione Configuración en el menú de navegación y haga clic en Añadir regla en la sección Regla de caducidad. Establezca el número de días en '1' para suprimir todos los elementos después de un día.

'

Añadir regla de caducidad para eliminar elementos
' '

El proceso de finalización de la regla puede tardar hasta 24 horas y está en una planificación establecida. Tenga esto en cuenta al aplicar esta técnica.

Ejemplos de cliente de CLI

Hay muchas herramientas disponibles para ayudar a los usuarios a aprovechar al máximo Object Storage y los siguientes clientes de CLI ofrecen formas sencillas de vaciar grupos.

Se proporcionan instrucciones de ejemplo para utilizar una aplicación cliente o una línea de mandatos una vez que el cliente CLI se ha configurado y está operativo.

Ejemplo de rclone

La herramienta " rclone " suele utilizarse para mantener sincronizados los directorios y para migrar datos entre plataformas de almacenamiento. Puede obtener más información de la documentación sobre utilizando rclone.

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

Ejemplo de Minio

El cliente Minio de código abierto le permite utilizar mandatos de tipo UNIX (ls, cp, cat, etc.) con IBM Cloud® Object Storage. Para obtener más información, consulte utilización de Minio.

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

Ejemplo de AWS

La interfaz de línea de mandatos oficial para AWS es compatible con la API S3 de IBM Cloud Object Storage y puede obtener más información sobre cómo utilizar la CLI de AWS.

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

Ejemplo de código

La supresión de un directorio completo o la eliminación de todo el contenido de un grupo puede tardar mucho tiempo en suprimir cada objeto, de uno en uno. La capacidad de suprimir un elemento a la vez se puede aprovechar para ahorrar tiempo y esfuerzo recopilando una lista de todos los elementos antes de la supresión.

El propio tema señala el peligro de supresión: los datos se perderán. Por supuesto, cuando ese es el objetivo, se debe tener precaución de que solo se produzcan las supresiones específicas. Instancias de comprobación y comprobación doble, nombres de grupo y cualquier prefijo o vía de acceso que sea necesario especificar.

Visión general

El patrón de código de este ejercicio configura un cliente antes de crear uno con el fin de recopilar una lista de elementos con el fin de suprimir cada objeto.

El patrón de código de este ejercicio configura un cliente antes de crear uno con el fin de recopilar una lista de elementos con el fin de suprimir cada objeto.

El patrón de código de este ejercicio configura un cliente antes de crear uno con el fin de recopilar una lista de elementos con el fin de suprimir cada objeto.

El patrón de código de este ejercicio configura un cliente antes de crear uno con el fin de recopilar una lista de elementos con el fin de suprimir cada objeto.

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

Próximos pasos

El aprovechamiento de las capacidades nuevas y existentes de las herramientas cubiertas en esta visión general se puede explorar más a fondo en la PlataformaIBM Cloud.