Copia de objetos - Amazon Simple Storage Service

Copia de objetos

La operación de copia crea una copia de un objeto que ya esté almacenado en Amazon S3.

Puede crear una copia de su objeto de hasta 5 GB en una única operación atómica. Sin embargo, para copiar un objeto mayor de 5 GB, debe usar la API de carga multiparte.

Con la operación CopyObject, puede:

  • Crear copias adicionales de objetos

  • Cambiar el nombre de objetos copiándolos y eliminando los originales

  • Mover objetos entre ubicaciones de Amazon S3 (p. ej. us-west-1 y Europa)

  • Cambiar metadatos de objetos

    Cada objeto de Amazon S3 tiene metadatos. Son un conjunto de pares nombre-​valor. Puede establecer los metadatos de un objeto en el momento en el que lo sube. Tras cargar el objeto, no puede modificar sus metadatos. La única manera de modificar los metadatos de un objeto es realizar una copia del mismo y configurar sus metadatos. En la operación de copia, verá el mismo objeto en el origen y el destino.

Todos los objetos tienen metadatos. Algunos de ellos son metadatos del sistema y otros definidos por el usuario. Puede controlar algunos de los metadatos del sistema, como la configuración de la clase de almacenamiento que se va a usar para el objeto y la del cifrado del lado del servidor. Cuando copia un objeto, los metadatos del sistema controlados por el usuario y los metadatos definidos por el usuario también se copian. Amazon S3 reinicia los metadatos controlados por el sistema. Por ejemplo, cuando se copia un objeto, Amazon S3 restablece la fecha de creación del objeto copiado. No necesita establecer ninguno de estos valores en su solicitud de copia.

Al copiar un objeto, puede decidir actualizar algunos de los valores de los metadatos. Por ejemplo, si su objeto de origen está configurado para usar almacenamiento S3 estándar, podría elegir usar S3 Intelligent-Tiering para la copia del objeto. También podría decidir alterar algunos de los valores de metadatos definidos por el usuario presentes en el objeto de origen. Si decide actualizar cualquiera de los metadatos del objeto configurables por el usuario (definidos por el sistema o por el usuario) durante la copia, debe especificar explícitamente todos los metadatos configurables por el usuario presentes en el objeto de origen de la solicitud, incluso aunque solo cambie uno de los valores de metadatos.

Para obtener más información acerca de los metadatos del objeto, consulte Trabajar con metadatos de objeto.

nota
  • La copia de objetos entre ubicaciones genera cargos por uso de ancho de banda.

  • Si el objeto de origen está archivado en S3 Glacier Flexible Retrieval o S3 Glacier Deep Archive, deberá restaurar primero una copia temporal antes de poder copiar el objeto a otro bucket. Para obtener información acerca del archivado de objetos, consulte Transición a las clases de almacenamiento S3 Glacier Flexible Retrieval y S3 Glacier Deep Archive (archivo de objetos).

  • La operación de copia de objetos restaurados no se admite en la consola de Amazon S3 para los objetos de las clases de almacenamiento S3 Glacier Flexible Retrieval o S3 Glacier Deep Archive. Para este tipo de operación de copia, utilice la AWS Command Line Interface (AWS CLI), los SDK de AWS o la API de REST.

Amazon S3 cifra automáticamente todos los objetos nuevos que se copian a un bucket de S3. Si no especifica la información de cifrado en su solicitud de copia, la configuración de cifrado del objeto de destino se establece con la configuración de cifrado predeterminada del bucket de destino. De forma predeterminada, todos los buckets tienen un nivel de configuración de cifrado básico que utiliza el cifrado del lado del servidor con claves administradas de Amazon S3 (SSE-S3). Si el bucket de destino tiene una configuración de cifrado predeterminada que utiliza el cifrado del lado del servidor con una clave de AWS Key Management Service (AWS KMS) (SSE-KMS) o una clave de cifrado proporcionada por el cliente (SSE-C), Amazon S3 utiliza la clave de KMS correspondiente o una clave proporcionada por el cliente para cifrar la copia del objeto de destino. Al copiar un objeto, si desea utilizar un tipo de configuración de cifrado diferente para el objeto de destino, puede solicitar que Amazon S3 cifre el objeto de destino con una clave de KMS, una clave administrada de Amazon S3 o una clave proporcionada por el cliente. Si la configuración de cifrado de su solicitud es diferente de la configuración de cifrado predeterminada del bucket de destino, tendrá prioridad la configuración de cifrado de su solicitud. Si el objeto de origen de la copia se ha almacenado en Amazon S3 con SSE-C, debe facilitar la información de cifrado necesaria en la solicitud, de modo que Amazon S3 pueda descifrar el objeto para copiarlo. Para obtener más información, consulte Protección de los datos mediante el cifrado.

Al copiar objetos, puede optar por utilizar un algoritmo de suma de comprobación diferente para el objeto. Tanto si elige utilizar el mismo algoritmo como uno nuevo, Amazon S3 calcula un nuevo valor de suma de comprobación después de copiar el objeto. Amazon S3 no copia directamente el valor de la suma de comprobación. El valor de la suma de comprobación de los objetos que se han cargado mediante cargas multiparte podría cambiar. Para obtener más información sobre el cálculo de la suma de comprobación, consulte Uso de sumas de comprobación a nivel de parte para cargas multiparte.

Para copiar más de un objeto de Amazon S3 con una sola solicitud, puede utilizar las operaciones por lotes de Amazon S3. Proporcione a Operaciones por lotes de S3 una lista de objetos en los que operar. Operaciones por lotes de S3 llama a la operación de la API respectiva para realizar la operación especificada. Un solo trabajo de operaciones por lotes puede realizar la operación especificada en miles de millones de objetos con exabytes de datos.

Operaciones por lotes de S3 realiza un seguimiento del avance, envía notificaciones y guarda un informe de finalización de todas las acciones, por lo que proporciona una experiencia sin servidor, auditable, completamente administrada. Puede emplear Operaciones por lotes de S3 a través de la consola de Amazon S3, AWS CLI, los SDK de AWS o la API de REST. Para obtener más información, consulte Conceptos básicos de Operaciones por lotes de S3.

nota

Para obtener más información sobre el uso de la clase de almacenamiento Amazon S3 Express One Zone con buckets de directorio, consulte ¿Qué es S3 Express One Zone? y Buckets de directorio. Para obtener más información sobre cómo copiar un objeto a un bucket de directorio, consulte Copiar un objeto en un bucket de directorio.

Para copiar un objeto

Para copiar un objeto, utilice los métodos siguientes.

En la consola Amazon S3, puede copiar o mover un objeto. Para obtener más información, consulte los siguientes procedimientos.

nota
  • Los objetos cifrados con claves de cifrado proporcionadas por el cliente (SSE-C) no se pueden copiar ni mover con la consola S3. Para copiar o mover objetos cifrados con SSE-C, utilice la AWS CLI, el SDK de AWS o la API de REST de Amazon S3.

  • Cuando copia un objeto utilizando la consola de Amazon S3, debe conceder permiso s3:ListAllMyBuckets. La consola necesita este permiso para validar la operación de copia.

  • La consola de Amazon S3 no admite la copia entre regiones de objetos de AWS KMS cifrados.

Para copiar un objeto
  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. Desplácese hasta el bucket o la carpeta de Amazon S3 que contiene los objetos que desea copiar.

  3. Seleccione la casilla de verificación situada a la izquierda de los nombres de los objetos que desea copiar.

  4. Elija Acciones y luego Copiar en la lista de opciones que aparece.

    También puede elegir Copy (Copiar) en las opciones de la esquina superior derecha.

  5. Seleccione el tipo de destino y la cuenta de destino. Para especificar la ruta de destino, seleccione Browse S3 (Examinar S3), desplácese hasta el destino y active la casilla de verificación situada a la izquierda del destino. Seleccione Elegir destino en la esquina inferior derecha.

    También puede escribir la ruta de destino.

  6. Si no tiene activado el control de versiones del bucket, es posible que se le pida que confirme que los objetos que tengan el mismo nombre se deben sobrescribir. Si así es, seleccione la casilla de verificación y continúe. Si quiere mantener todas las versiones de los objetos en este bucket, seleccione Enable Bucket Versioning (Habilitar control de versiones de bucket). También puede actualizar las propiedades predeterminadas de cifrado y de bloqueo de objetos de S3.

  7. En Additional checksums (Sumas de comprobación adicionales), elija si desea copiar los objetos utilizando la función de suma de comprobación existente o sustituir la función de suma de comprobación existente por otra nueva. Al cargar los objetos, tenía la opción de especificar el algoritmo de suma de comprobación que se utilizó para verificar la integridad de los datos. Al copiar el objeto, tiene la opción de elegir una nueva función. Si no especificó originalmente una suma de comprobación adicional, puede utilizar esta sección de las opciones de copia para agregar una.

    nota

    Incluso si opta por utilizar la misma función de suma de comprobación, el valor de la suma de comprobación podría cambiar si copia el objeto y este tiene un tamaño superior a 16 MB. El valor de la suma de comprobación podría cambiar debido a cómo se calculan las sumas de comprobación para las cargas multiparte. Para obtener más información acerca de cómo puede cambiar la suma de comprobación al copiar el objeto, consulte Uso de sumas de comprobación a nivel de parte para cargas multiparte.

    Para cambiar la función de suma de comprobación, elija Reemplazar por una nueva función de suma de comprobación. Seleccione la nueva función de suma de comprobación en el recuadro. Cuando se copia el objeto, la nueva suma de comprobación se calcula y almacena con el algoritmo especificado.

  8. En la esquina inferior derecha, elija Copiar. Amazon S3 copia el objeto en el destino.

Para mover objetos
  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. Desplácese hasta el bucket o carpeta de Amazon S3 que contiene los objetos que quiera mover.

  3. Seleccione la casilla situada a la izquierda del nombre de cada uno de los objetos que quiera mover.

  4. Seleccione Actions (Acciones) y después Move (Mover) en la lista de opciones que aparece.

    También puede seleccionar Move (Mover) en las opciones de la esquina superior derecha.

  5. Para especificar la ruta de destino, seleccione Examinar S3, desplácese hasta el destino y active la casilla de verificación situada a la izquierda del destino. Seleccione Elegir destino en la esquina inferior derecha.

    También puede escribir la ruta de destino.

  6. Si no tiene activado el control de versiones del bucket, es posible que se le pida que confirme que los objetos que tengan el mismo nombre se deben sobrescribir. Si así es, seleccione la casilla de verificación y continúe. Si quiere mantener todas las versiones de los objetos en este bucket, seleccione Enable Bucket Versioning (Habilitar control de versiones de bucket). También puede actualizar las propiedades predeterminadas de cifrado y de bloqueo de objetos.

  7. En la esquina inferior derecha, elija Move (Mover). Amazon S3 mueve los objetos al destino.

nota
  • Esta acción crea una copia de todos los objetos especificados con parámetros actualizados, actualiza la fecha de última modificación en la ubicación especificada y agrega un marcador de eliminación al objeto original.

  • Al mover carpetas, espere a que finalice la acción de movimiento antes de realizar cambios adicionales en las carpetas.

  • Esta acción actualiza los metadatos para el control de versiones de bucket, el cifrado, las características de bloqueo de objetos y los objetos archivados.

Los ejemplos de esta sección demuestran cómo copiar objetos de hasta 5 GB en una única operación. Para copiar objetos mayores de 5 GB, debe usar la API de carga multiparte. Para obtener más información, consulte Copiar un objeto con la carga multiparte.

Java

En el siguiente ejemplo, se copia un objeto en Amazon S3 mediante AWS SDK for Java. Para obtener instrucciones sobre la creación y comprobación de una muestra funcional, consulte Prueba de los ejemplos de código de Java de Amazon S3.

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CopyObjectRequest; import java.io.IOException; public class CopyObjectSingleOperation { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String sourceKey = "*** Source object key *** "; String destinationKey = "*** Destination object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Copy the object into a new object in the same bucket. CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, sourceKey, bucketName, destinationKey); s3Client.copyObject(copyObjRequest); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

En el siguiente ejemplo de código C#, se utiliza AWS SDK for .NET de alto nivel para copiar objetos con un tamaño que puede alcanzar los 5 GB en una sola operación. Para objetos que sean mayores de 5 GB, use el ejemplo de copia de carga multiparte que se describe en Copiar un objeto con la carga multiparte.

En este ejemplo se realiza una copia de un objeto que tiene un máximo de 5 GB. Para obtener información acerca de la compatibilidad del ejemplo con una versión específica de AWS SDK para .NET e instrucciones acerca de cómo crear y probar un ejemplo funcional, consulte Ejecución de ejemplos de código .NET de Amazon S3.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CopyObjectTest { private const string sourceBucket = "*** provide the name of the bucket with source object ***"; private const string destinationBucket = "*** provide the name of the bucket to copy the object to ***"; private const string objectKey = "*** provide the name of object to copy ***"; private const string destObjectKey = "*** provide the destination object key name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); Console.WriteLine("Copying an object"); CopyingObjectAsync().Wait(); } private static async Task CopyingObjectAsync() { try { CopyObjectRequest request = new CopyObjectRequest { SourceBucket = sourceBucket, SourceKey = objectKey, DestinationBucket = destinationBucket, DestinationKey = destObjectKey }; CopyObjectResponse response = await s3Client.CopyObjectAsync(request); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }
PHP

En este tema, se detallará el proceso de uso las clases de la versión 3 de AWS SDK for PHP que permiten copiar un único objeto o varios de ellos dentro de Amazon S3, de un bucket a otro o dentro del mismo bucket.

En este tema, se da por sentado que está familiarizado con las instrucciones para Uso del AWS SDK for PHP y ejecución de ejemplos de PHP y ha instalado AWS SDK for PHP adecuadamente.

El siguiente ejemplo de código PHP ilustra el uso del método copyObject() para copiar un único objeto en Amazon S3 y usar un lote de llamadas a CopyObject usando el método getcommand() para realizar varias copias de un objeto.

1

Cree una instancia de un cliente de Amazon S3 con el constructor de clase Aws\S3\S3Client.

2

Para realizar varias copias de un objeto, ejecute un lote de llamadas al método del cliente de Amazon S3 getCommand(), heredado de la clase Aws\CommandInterface. Debe proporcionar el comando CopyObject como primer argumento y una matriz que contenga el bucket de origen, el nombre de la clave de origen, el bucket de destino y el nombre de la clave de destino como segundo argumento.

require 'vendor/autoload.php'; use Aws\CommandPool; use Aws\Exception\AwsException; use Aws\ResultInterface; use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targetBucket = '*** Your Target Bucket Name ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Copy an object. $s3->copyObject([ 'Bucket' => $targetBucket, 'Key' => "$sourceKeyname-copy", 'CopySource' => "$sourceBucket/$sourceKeyname", ]); // Perform a batch of CopyObject operations. $batch = array(); for ($i = 1; $i <= 3; $i++) { $batch[] = $s3->getCommand('CopyObject', [ 'Bucket' => $targetBucket, 'Key' => "{targetKeyname}-$i", 'CopySource' => "$sourceBucket/$sourceKeyname", ]); } try { $results = CommandPool::batch($s3, $batch); foreach ($results as $result) { if ($result instanceof ResultInterface) { // Result handling here } if ($result instanceof AwsException) { // AwsException handling here } } } catch (Exception $e) { // General error handling here }
Python
class ObjectWrapper: """Encapsulates S3 object actions.""" def __init__(self, s3_object): """ :param s3_object: A Boto3 Object resource. This is a high-level resource in Boto3 that wraps object actions in a class-like structure. """ self.object = s3_object self.key = self.object.key
def copy(self, dest_object): """ Copies the object to another bucket. :param dest_object: The destination object initialized with a bucket and key. This is a Boto3 Object resource. """ try: dest_object.copy_from( CopySource={"Bucket": self.object.bucket_name, "Key": self.object.key} ) dest_object.wait_until_exists() logger.info( "Copied object from %s:%s to %s:%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) except ClientError: logger.exception( "Couldn't copy object from %s/%s to %s/%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) raise
Ruby

Las siguientes tareas lo guiarán a través del uso de las clases de Ruby para copiar un objeto en Amazon S3 de un bucket a otro o dentro del mismo bucket.

1

Utilice la gema modularizada de Amazon S3 para la versión 3 de AWS SDK for Ruby, solicite 'aws-sdk-s3' y proporcione sus credenciales de AWS. Para obtener más información acerca de cómo proporcionar sus credenciales, consulte Realización de solicitudes con las credenciales de usuario de IAM o Cuenta de AWS.

2

Brinde la información de solicitud, como el nombre del bucket de origen, el nombre de la clave de origen y la clave de destino.

En el siguiente ejemplo de código Ruby se muestran las tareas anteriores utilizando el método #copy_object para copiar un objeto de un bucket a otro.

require "aws-sdk-s3" # Wraps Amazon S3 object actions. class ObjectCopyWrapper attr_reader :source_object # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for # copy actions. def initialize(source_object) @source_object = source_object end # Copy the source object to the specified target bucket and rename it with the target key. # # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied. # @param target_object_key [String] The key to give the copy of the object. # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil. def copy_object(target_bucket, target_object_key) @source_object.copy_to(bucket: target_bucket.name, key: target_object_key) target_bucket.object(target_object_key) rescue Aws::Errors::ServiceError => e puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}" end end # Example usage: def run_demo source_bucket_name = "doc-example-bucket1" source_key = "my-source-file.txt" target_bucket_name = "doc-example-bucket2" target_key = "my-target-file.txt" source_bucket = Aws::S3::Bucket.new(source_bucket_name) wrapper = ObjectCopyWrapper.new(source_bucket.object(source_key)) target_bucket = Aws::S3::Bucket.new(target_bucket_name) target_object = wrapper.copy_object(target_bucket, target_key) return unless target_object puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key}." end run_demo if $PROGRAM_NAME == __FILE__

En este ejemplo se describe cómo copiar un objeto con REST. Para obtener más información acerca de la API de REST, consulte PUT Object (Copy).

En este ejemplo se copia el objeto flotsam desde el bucket pacific al objeto jetsam del bucket atlantic, conservando sus metadatos.

PUT /jetsam HTTP/1.1 Host: atlantic.s3.amazonaws.com x-amz-copy-source: /pacific/flotsam Authorization: AWS AKIAIOSFODNN7EXAMPLE:ENoSbxYByFA0UGLZUqJN5EUnLDg= Date: Wed, 20 Feb 2008 22:12:21 +0000

La firma se generó a partir de la siguiente información.

PUT\r\n \r\n \r\n Wed, 20 Feb 2008 22:12:21 +0000\r\n x-amz-copy-source:/pacific/flotsam\r\n /atlantic/jetsam

Amazon S3 devuelve la siguiente respuesta, que especifica el ETag del objeto y cuándo se modificó por última vez.

HTTP/1.1 200 OK x-amz-id-2: Vyaxt7qEbzv34BnSu5hctyyNSlHTYZFMWK4FtzO+iX8JQNyaLdTshL0KxatbaOZt x-amz-request-id: 6B13C3C5B34AF333 Date: Wed, 20 Feb 2008 22:13:01 +0000 Content-Type: application/xml Transfer-Encoding: chunked Connection: close Server: AmazonS3 <?xml version="1.0" encoding="UTF-8"?> <CopyObjectResult> <LastModified>2008-02-20T22:13:01</LastModified> <ETag>"7e9c608af58950deeb370c98608ed097"</ETag> </CopyObjectResult>

También puede usar la AWS Command Line Interface (AWS CLI) para crear un objeto de S3. Para obtener más información, consulte copy-object en la Referencia de comandos de la AWS CLI.

Para obtener información sobre AWS CLI, consulte ¿Qué es AWS Command Line Interface? en la Guía del usuario de AWS Command Line Interface.