¿Cómo utilizo Operaciones por lotes de Amazon S3 para copiar objetos de más de 5 GB?
Quiero copiar objetos de Amazon Simple Storage Service (Amazon S3) de más de 5 GB de un bucket a otro.
Descripción corta
Para copiar objetos de Amazon S3 de más de 5 GB de un bucket a otro, usa Operaciones por lotes de S3 con una función de AWS Lambda. Para obtener más información, consulta Copiar objetos de más de 5 GB con Operaciones por lotes de Amazon S3.
Nota: También puedes usar la API de carga multiparte para copiar objetos de Amazon S3 de más de 5 GB. Para obtener más información, consulta Copiar un objeto mediante la carga multiparte.
Resolución
Antes de empezar, asegúrate de haber creado un bucket de S3 de destino al que copiar los objetos.
Creación de una función de Lambda
Sigue estos pasos:
-
Abre la consola de Lambda.
-
Selecciona Crear función.
-
Selecciona Crear desde cero.
-
En Nombre de la función, introduce un nombre para la función, por ejemplo, S3BatchCopy.
-
Elige la lista desplegable Runtime y, a continuación, elige Python 3.9.
-
En Arquitectura, elige x86_64 y, a continuación, elige Crear función.
-
En el editor de código integrado, introduce el código de la función de Lambda.
Ejemplo de código de función Lambda:import boto3 import os from urllib import parse from botocore.client import Config from boto3.s3.transfer import TransferConfig target_bucket = os.environ['destination_bucket'] new_prefix = os.environ['destination_bucket_prefix'] metadata_copy = os.environ['copy_metadata'] tagging_copy = os.environ['copy_tagging'] storage_class = os.environ['copy_storage_class'] # Added storage class s3Client = boto3.client('s3', config=Config(retries={'max_attempts': 3})) def lambda_handler(event, context): task = event['tasks'][0] s3Key = parse.unquote_plus(task['s3Key'], encoding='utf-8') s3VersionId = task['s3VersionId'] s3Bucket = task['s3BucketArn'].split(':')[-1] try: copy_source = {'Bucket': s3Bucket, 'Key': s3Key} if s3VersionId: copy_source['VersionId'] = s3VersionId newKey = f"{new_prefix}/{s3Key}" if new_prefix else s3Key myargs = { 'ACL': 'bucket-owner-full-control', 'StorageClass': storage_class # Added storage class to copy arguments } # Add metadata if enabled if metadata_copy == 'Enable': get_metadata = s3Client.head_object(Bucket=s3Bucket, Key=s3Key, VersionId=s3VersionId if s3VersionId else None) for key in ['CacheControl', 'ContentDisposition', 'ContentEncoding', 'ContentLanguage', 'Metadata', 'WebsiteRedirectLocation', 'Expires']: if value := get_metadata.get(key): myargs[key] = value # Add tagging if enabled if tagging_copy == 'Enable': get_obj_tag = s3Client.get_object_tagging(Bucket=s3Bucket, Key=s3Key, VersionId=s3VersionId if s3VersionId else None) if tag_set := get_obj_tag.get('TagSet'): myargs['Tagging'] = "&".join([f"{parse.quote_plus(d['Key'])}={parse.quote_plus(d['Value'])}" for d in tag_set]) response = s3Client.copy(copy_source, target_bucket, newKey, ExtraArgs=myargs) result = {'resultCode': 'Succeeded', 'resultString': str(response)} except Exception as e: result = {'resultCode': 'PermanentFailure', 'resultString': str(e)} return { 'invocationSchemaVersion': event['invocationSchemaVersion'], 'treatMissingKeysAs': 'PermanentFailure', 'invocationId': event['invocationId'], 'results': [{'taskId': task['taskId'], **result}] } -
Selecciona Desplegar.
Creación de un rol de IAM para la función de Lambda
Sigue estos pasos:
-
Abre la consola de AWS Identity and Access Management (IAM).
-
En el panel de navegación, elige Roles y, a continuación, Crear rol.
-
En Tipo de entidad de confianza, elige Servicio de AWS.
-
Selecciona la lista desplegable Caso de uso y, a continuación, elige Lambda.
-
Selecciona Siguiente.
-
Elige la política AWSLambdaBasicExecutionRole y, a continuación, elige Siguiente.
-
En Nombre de rol, introduce un nombre, por ejemplo, LambdaS3BatchRole.
-
Introduce la siguiente política:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging", "s3:ListBucket*" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging", "s3:PutObjectLegalHold", "s3:PutObjectRetention", "s3:GetBucketObjectLockConfiguration", "s3:ListBucket*", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-destination-bucket", "arn:aws:s3:::amzn-s3-demo-destination-bucket/*" ], "Effect": "Allow" } ] } -
Selecciona Crear rol.
Nota: Si utilizas una clave de AWS Key Management Service (AWS KMS) administrada por el cliente para cifrar tu bucket, el rol de IAM debe conceder permisos adicionales. Para más información, consulta Mi bucket de Amazon S3 tiene un cifrado predeterminado mediante una clave de AWS KMS personalizada. ¿Cómo puedo permitir que los usuarios descarguen desde el bucket y carguen a este?
Creación de una política de permisos de operaciones por lotes
Sigue estos pasos:
-
Abre la consola de IAM.
-
En el panel de navegación, elige Roles y, a continuación, Crear rol.
-
En Tipo de entidad de confianza, elige Servicio de AWS.
-
Selecciona la lista desplegable Caso de uso y, a continuación, elige S3.
-
Elige Operaciones por lotes de S3.
-
Selecciona Siguiente.
-
En Nombre de rol, introduce un nombre, por ejemplo, S3BatchOperationsRole.
-
Introduce la siguiente política:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-manifest-bucket", "arn:aws:s3:::amzn-s3-demo-manifest-bucket/" ], "Effect": "Allow" }, { "Action": [ "s3:PutObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-completion-report-bucket", "arn:aws:s3:::amzn-s3-demo-completion-report-bucket/" ], "Effect": "Allow" }, { "Action": [ "lambda:InvokeFunction" ], "Resource": "arn_of_lambda_function_created_in_step1", "Effect": "Allow" } ] } -
Selecciona Crear rol.
Creación de un trabajo de operaciones por lotes
Sigue estos pasos:
- Abre la consola de Amazon S3.
- En el panel de navegación, elige Operaciones por lotes y, a continuación, elige Crear trabajo.
- En Formato del manifiesto, selecciona Informe de inventario de S3 o CSV.
- En Objeto del manifiesto, elige Examinar S3.
- Selecciona el bucket de origen del que deseas copiar los objetos.
- Selecciona los objetos en el bucket de origen y, a continuación, selecciona Elegir ruta.
- Selecciona Siguiente.
- En Elegir operación, selecciona Copiar.
- En Destino de copia, selecciona Examinar S3.
- Selecciona el bucket de destino al que deseas copiar los objetos y, a continuación, selecciona Elegir ruta.
- Selecciona Acepto que los objetos existentes con el mismo nombre se sobrescribirán y elige Siguiente.
- En Permisos, elige la lista desplegable Rol de IAM y, a continuación, selecciona tu rol de IAM S3BatchOperationsRole.
- Elige Siguiente y, a continuación, elige Crear.
Acceso entre cuentas
Si el bucket de S3 de destino está en otra cuenta de AWS, debes adjuntar al bucket una política basada en recursos.
Ejemplo de política basada en recursos:
{ "Version": "2012-10-17", "Id": "Policy1541018284691", "Statement": [ { "Sid": "Allow Cross Account Copy", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::SourceAccountNumber:role/LambdaS3BatchRole" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging" ], "Resource": "arn:aws:s3:::DESTINATION_BUCKET/*" } ] }
Para obtener instrucciones, consulta ¿Cómo copio objetos de Amazon S3 de otra cuenta de AWS?
Información relacionada
¿Cómo soluciono los problemas de operaciones por lotes de Amazon S3?
¿Cómo puedo copiar todos los objetos de un bucket de Amazon S3 a otro?
¿Cuál es la mejor forma de transferir grandes cantidades de datos de un bucket de Amazon S3 a otro?
- Temas
- Storage
- Etiquetas
- Amazon Simple Storage Service
- Idioma
- Español

Contenido relevante
preguntada hace un año
preguntada hace 2 años
preguntada hace un año
OFICIAL DE AWSActualizada hace un año
OFICIAL DE AWSActualizada hace 2 años