Habilitar el control de versiones en buckets - Amazon Simple Storage Service

Habilitar el control de versiones en buckets

Utilice S3 Versioning para mantener varias versiones de un objeto en un bucket. En esta sección, se proporcionan ejemplos de cómo habilitar el control de versiones en un bucket mediante la consola, la API de REST, los SDK de AWS y AWS Command Line Interface (AWS CLI).

nota

Si habilita el control de versiones en un bucket por primera vez, es posible que el cambio tarde unos 15 minutos en propagarse. Para emitir operaciones de escritura (PUT o DELETE) en los objetos del bucket, se recomienda que espere 15 minutos después de habilitar el control de versiones. Las operaciones de escritura realizadas antes de que se complete la conversión pueden aplicarse a objetos no versionados.

Para obtener más información sobre el control de versiones de S3, consulte Usar el control de versiones en buckets de S3. Para obtener información sobre cómo trabajar con objetos que se encuentran en buckets con control de versiones habilitado, consulte Trabajar con objetos en un bucket con control de versiones habilitado.

Para obtener más información sobre cómo utilizar el control de versiones de S3 para proteger los datos, consulte el Tutorial: Protecting data on Amazon S3 against accidental deletion or application bugs using S3 Versioning, S3 Object Lock, and S3 Replication (Protección de los datos en Amazon S3 contra la eliminación accidental o los errores en la aplicación mediante el control de versiones de S3, S3 Object Lock y la Replicación de S3).

Cada bucket de S3 que crea cuenta con un subrecurso de control de versiones asociado. (Para obtener más información, consulte Opciones de configuración de buckets.) De forma predeterminada, su bucket no tendrá control de versiones y, por tanto, el subrecurso de control de versiones almacena una configuración de control de versiones vacía.

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> </VersioningConfiguration>

Para habilitar el control de versiones, puede enviar una solicitud a Amazon S3 con una configuración de control de versiones que incluya un estado.

<VersioningConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Status>Enabled</Status> </VersioningConfiguration>

Para suspender el control de versiones, puede configurar el valor de estado como Suspended.

El propietario del bucket y todos los usuarios autorizados pueden habilitar el control de versiones. El propietario del bucket es la Cuenta de AWS que creó el bucket (la cuenta raíz). Para obtener más información sobre los permisos, consulte Identity and Access Management en Amazon S3.

En las siguientes secciones, se proporcionan más detalles sobre cómo habilitar el control de versiones de S3 a través de la consola, la AWS CLI y los SDK de AWS.

Siga estos pasos para utilizar la AWS Management Console a fin de habilitar el control de versiones en un bucket de S3.

Para habilitar o deshabilitar el control de versiones en un bucket de S3:
  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. En la lista Buckets (Buckets), elija el nombre del bucket para el que desea activar el control de versiones.

  3. Seleccione Properties (Propiedades).

  4. En Bucket Versioning (Control de versiones del bucket), elija Edit (Editar).

  5. Elija Suspend (Suspender) o Enable (Habilitar) y, a continuación, elija Save changes (Guardar cambios).

nota

Puede utilizar la autenticación multifactor (MFA) de AWS con el control de versiones. Cuando utiliza MFA con el control de versiones, debe proporcionar las claves de acceso de su Cuenta de AWS y un código válido del dispositivo MFA de la cuenta para eliminar de manera permanente una versión de un objeto o suspender o volver a activar el control de versiones.

Para utilizar la MFA con el control de versiones, habilite MFA Delete. Sin embargo, no puede habilitar MFA Delete mediante la AWS Management Console. Para ello debe utilizar AWS Command Line Interface (AWS CLI) o la API. Para obtener más información, consulte Configurar la eliminación de MFA.

En el ejemplo siguiente se habilita el control de versiones en un bucket de S3.

aws s3api put-bucket-versioning --bucket DOC-EXAMPLE-BUCKET1 --versioning-configuration Status=Enabled

En el siguiente ejemplo se habilita el control de versiones de S3 y la eliminación de autenticación multifactor (MFA) en un bucket.

aws s3api put-bucket-versioning --bucket DOC-EXAMPLE-BUCKET1 --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa "SERIAL 123456"
nota

El uso de la eliminación de MFA requiere un dispositivo de autenticación física o virtual aprobado. Para obtener más información sobre el uso de eliminación de MFA en Amazon S3, consulte Configurar la eliminación de MFA.

Para obtener más información sobre cómo habilitar el control de versiones mediante la AWS CLI, consulte put-bucket-versioning en la Referencia de comandos de AWS CLI.

Mediante los siguientes ejemplos, se habilita el control de versiones en un bucket y, a continuación, se recupera el estado de control de versiones mediante AWS SDK for Java y AWS SDK for .NET. Para obtener información acerca del uso de otros SDK de AWS, consulte el Centro de desarrolladores de AWS.

.NET

Para obtener información acerca de cómo crear y probar una muestra funcional, consulte Ejecución de ejemplos de código .NET de Amazon S3.

using System; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class BucketVersioningConfiguration { static string bucketName = "*** bucket name ***"; public static void Main(string[] args) { using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { try { EnableVersioningOnBucket(client); string bucketVersioningStatus = RetrieveBucketVersioningConfiguration(client); } catch (AmazonS3Exception amazonS3Exception) { if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity"))) { Console.WriteLine("Check the provided AWS Credentials."); Console.WriteLine( "To sign up for service, go to http://aws.amazon.com/s3"); } else { Console.WriteLine( "Error occurred. Message:'{0}' when listing objects", amazonS3Exception.Message); } } } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } static void EnableVersioningOnBucket(IAmazonS3 client) { PutBucketVersioningRequest request = new PutBucketVersioningRequest { BucketName = bucketName, VersioningConfig = new S3BucketVersioningConfig { Status = VersionStatus.Enabled } }; PutBucketVersioningResponse response = client.PutBucketVersioning(request); } static string RetrieveBucketVersioningConfiguration(IAmazonS3 client) { GetBucketVersioningRequest request = new GetBucketVersioningRequest { BucketName = bucketName }; GetBucketVersioningResponse response = client.GetBucketVersioning(request); return response.VersioningConfig.Status; } } }
Java

Para obtener instrucciones acerca de cómo crear y probar una muestra funcional, consulte Prueba de los ejemplos de código de Java de Amazon S3.

import java.io.IOException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.BucketVersioningConfiguration; import com.amazonaws.services.s3.model.SetBucketVersioningConfigurationRequest; public class BucketVersioningConfigurationExample { public static String bucketName = "*** bucket name ***"; public static AmazonS3Client s3Client; public static void main(String[] args) throws IOException { s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); s3Client.setRegion(Region.getRegion(Regions.US_EAST_1)); try { // 1. Enable versioning on the bucket. BucketVersioningConfiguration configuration = new BucketVersioningConfiguration().withStatus("Enabled"); SetBucketVersioningConfigurationRequest setBucketVersioningConfigurationRequest = new SetBucketVersioningConfigurationRequest(bucketName,configuration); s3Client.setBucketVersioningConfiguration(setBucketVersioningConfigurationRequest); // 2. Get bucket versioning configuration information. BucketVersioningConfiguration conf = s3Client.getBucketVersioningConfiguration(bucketName); System.out.println("bucket versioning configuration status: " + conf.getStatus()); } catch (AmazonS3Exception amazonS3Exception) { System.out.format("An Amazon S3 error occurred. Exception: %s", amazonS3Exception.toString()); } catch (Exception ex) { System.out.format("Exception: %s", ex.toString()); } } }
Python

Para obtener instrucciones acerca de cómo crear y probar una muestra funcional, consulte Mediante AWS SDK for Python (Boto).

Con el siguiente ejemplo de código de Python, se crea un bucket de Amazon S3, se habilita el control de versiones y se configura un ciclo de vida que establece el vencimiento de las versiones de objetos no actuales después de 7 días.

def create_versioned_bucket(bucket_name, prefix): """ Creates an Amazon S3 bucket, enables it for versioning, and configures a lifecycle that expires noncurrent object versions after 7 days. Adding a lifecycle configuration to a versioned bucket is a best practice. It helps prevent objects in the bucket from accumulating a large number of noncurrent versions, which can slow down request performance. Usage is shown in the usage_demo_single_object function at the end of this module. :param bucket_name: The name of the bucket to create. :param prefix: Identifies which objects are automatically expired under the configured lifecycle rules. :return: The newly created bucket. """ try: bucket = s3.create_bucket( Bucket=bucket_name, CreateBucketConfiguration={ "LocationConstraint": s3.meta.client.meta.region_name }, ) logger.info("Created bucket %s.", bucket.name) except ClientError as error: if error.response["Error"]["Code"] == "BucketAlreadyOwnedByYou": logger.warning("Bucket %s already exists! Using it.", bucket_name) bucket = s3.Bucket(bucket_name) else: logger.exception("Couldn't create bucket %s.", bucket_name) raise try: bucket.Versioning().enable() logger.info("Enabled versioning on bucket %s.", bucket.name) except ClientError: logger.exception("Couldn't enable versioning on bucket %s.", bucket.name) raise try: expiration = 7 bucket.LifecycleConfiguration().put( LifecycleConfiguration={ "Rules": [ { "Status": "Enabled", "Prefix": prefix, "NoncurrentVersionExpiration": {"NoncurrentDays": expiration}, } ] } ) logger.info( "Configured lifecycle to expire noncurrent versions after %s days " "on bucket %s.", expiration, bucket.name, ) except ClientError as error: logger.warning( "Couldn't configure lifecycle on bucket %s because %s. " "Continuing anyway.", bucket.name, error, ) return bucket