Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Come posso utilizzare Operazioni in batch Amazon S3 per copiare oggetti di dimensioni superiori a 5 GB?
Desidero copiare oggetti Amazon Simple Storage Service (Amazon S3) di dimensioni superiori a 5 GB da un bucket a un altro.
Breve descrizione
Per copiare oggetti Amazon S3 di dimensioni superiori a 5 GB da un bucket a un altro, utilizza Operazioni in batch S3 con una funzione AWS Lambda. Per ulteriori informazioni, consulta Copying objects greater than 5 GB with Amazon S3 Batch Operations (Copia di oggetti di dimensioni superiori a 5 GB con Operazioni in batch Amazon S3).
Nota: puoi anche utilizzare l'API di caricamento in più parti per copiare oggetti Amazon S3 di dimensioni superiori a 5 GB. Per ulteriori informazioni, consulta Copia di un oggetto utilizzando il caricamento in più parti.
Risoluzione
Prima di iniziare, assicurati di aver creato un bucket S3 di destinazione in cui copiare gli oggetti.
Crea una funzione Lambda
Completa i seguenti passaggi:
-
Apri la console Lambda.
-
Scegli Crea funzione.
-
Scegli Crea da zero.
-
Per Nome della funzione, inserisci un nome per la funzione, ad esempio S3BatchCopy.
-
Scegli l'elenco a discesa Runtime, quindi scegli Python 3.9.
-
Per Architettura, scegli x86_64, quindi scegli Crea funzione.
-
Nell'editor di codice integrato, inserisci il codice della funzione Lambda.
Esempio di codice della funzione 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}] }
-
Scegli Distribuisci.
Crea un ruolo IAM per la funzione Lambda
Completa i seguenti passaggi:
-
Apri la console AWS Identity and Access Management (AWS IAM).
-
Nel pannello di navigazione seleziona Ruoli, quindi Crea ruolo.
-
In Tipo di entità attendibile, scegli Servizio AWS.
-
Scegli l'elenco a discesa Caso d'uso, quindi scegli Lambda.
-
Scegli Avanti.
-
Scegli la policy AWSLambdaBasicExecutionRole, quindi scegli Avanti.
-
Per Nome ruolo, inserisci un nome, ad esempio LambdaS3BatchRole.
-
Collega la seguente policy:
{ "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" } ] }
-
Scegli Crea ruolo.
Nota: se utilizzi una chiave del Servizio AWS di gestione delle chiavi (AWS KMS) gestita dal cliente per crittografare il bucket, il ruolo IAM deve concedere autorizzazioni aggiuntive. Per ulteriori informazioni, consulta Il mio bucket Amazon S3 dispone di una crittografia predefinita che utilizza una chiave AWS KMS personalizzata. Come posso consentire agli utenti di scaricare e caricare contenuti nel bucket?
Crea una policy delle autorizzazioni per Operazioni in batch
Completa i seguenti passaggi:
-
Apri la console IAM.
-
Nel pannello di navigazione seleziona Ruoli, quindi Crea ruolo.
-
Per Tipo di entità attendibile, scegli Servizio AWS.
-
Scegli l'elenco a discesa Caso d'uso, quindi scegli S3.
-
Scegli Operazioni in batch S3.
-
Scegli Avanti.
-
In Nome ruolo, inserisci un nome, ad esempio S3BatchOperationsRole.
-
Collega la seguente policy:
{ "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" } ] }
-
Scegli Crea ruolo.
Crea un processo Operazioni in batch
Completa i seguenti passaggi:
- Apri la console Amazon S3.
- Nel pannello di navigazione, scegli Operazioni in batch, quindi scegli Crea processo.
- Per Formato manifest, seleziona S3 inventory report (Report di inventario S3) o CSV.
- Per Oggetto manifest, scegli Browse S3 (Sfoglia S3).
- Seleziona il bucket di origine da cui copiare gli oggetti.
- Seleziona gli oggetti nel bucket di origine, quindi seleziona Scegli percorso.
- Scegli Avanti.
- Per Scegli operazione, scegli Copia.
- Per Destinazione della copia, scegli Browse S3 (Sfoglia S3).
- Seleziona il bucket di destinazione in cui copiare gli oggetti, quindi seleziona Scegli percorso.
- Seleziona I acknowledge that existing objects with the same name will be overwritten (Accetto che gli oggetti esistenti con lo stesso nome vengano sovrascritti), quindi scegli Avanti.
- Per Autorizzazioni, scegli l'elenco a discesa Ruoli IAM, quindi seleziona il ruolo IAM S3BatchOperationsRole.
- Scegli Avanti, quindi scegli Crea processo.
Accesso multi-account
Se il bucket S3 di destinazione si trova in un altro account AWS, devi collegare al bucket una policy basata sulle risorse.
Esempio di policy basata sulle risorse:
{ "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/*" } ] }
Per ulteriori informazioni, consulta Come posso copiare oggetti S3 da un altro account AWS?
Informazioni correlate
Come posso risolvere i problemi relativi a Operazioni in batch Amazon S3?
Come posso copiare tutti gli oggetti da un bucket Amazon S3 a un altro bucket?
Come posso trasferire grandi quantità di dati da un bucket Amazon S3 a un altro?
