Come posso utilizzare Operazioni in batch Amazon S3 per copiare oggetti di dimensioni superiori a 5 GB?

6 minuti di lettura
0

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:

  1. Apri la console Lambda.

  2. Scegli Crea funzione.

  3. Scegli Crea da zero.

  4. Per Nome della funzione, inserisci un nome per la funzione, ad esempio S3BatchCopy.

  5. Scegli l'elenco a discesa Runtime, quindi scegli Python 3.9.

  6. Per Architettura, scegli x86_64, quindi scegli Crea funzione.

  7. 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}]
        }
  8. Scegli Distribuisci.

Crea un ruolo IAM per la funzione Lambda

Completa i seguenti passaggi:

  1. Apri la console AWS Identity and Access Management (AWS IAM).

  2. Nel pannello di navigazione seleziona Ruoli, quindi Crea ruolo.

  3. In Tipo di entità attendibile, scegli Servizio AWS.

  4. Scegli l'elenco a discesa Caso d'uso, quindi scegli Lambda.

  5. Scegli Avanti.

  6. Scegli la policy AWSLambdaBasicExecutionRole, quindi scegli Avanti.

  7. Per Nome ruolo, inserisci un nome, ad esempio LambdaS3BatchRole.

  8. 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"
            }
        ]
    }
  9. 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:

  1. Apri la console IAM.

  2. Nel pannello di navigazione seleziona Ruoli, quindi Crea ruolo.

  3. Per Tipo di entità attendibile, scegli Servizio AWS.

  4. Scegli l'elenco a discesa Caso d'uso, quindi scegli S3.

  5. Scegli Operazioni in batch S3.

  6. Scegli Avanti.

  7. In Nome ruolo, inserisci un nome, ad esempio S3BatchOperationsRole.

  8. 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"
            }
        ]
    }
  9. Scegli Crea ruolo.

Crea un processo Operazioni in batch

Completa i seguenti passaggi:

  1. Apri la console Amazon S3.
  2. Nel pannello di navigazione, scegli Operazioni in batch, quindi scegli Crea processo.
  3. Per Formato manifest, seleziona S3 inventory report (Report di inventario S3) o CSV.
  4. Per Oggetto manifest, scegli Browse S3 (Sfoglia S3).
  5. Seleziona il bucket di origine da cui copiare gli oggetti.
  6. Seleziona gli oggetti nel bucket di origine, quindi seleziona Scegli percorso.
  7. Scegli Avanti.
  8. Per Scegli operazione, scegli Copia.
  9. Per Destinazione della copia, scegli Browse S3 (Sfoglia S3).
  10. Seleziona il bucket di destinazione in cui copiare gli oggetti, quindi seleziona Scegli percorso.
  11. 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.
  12. Per Autorizzazioni, scegli l'elenco a discesa Ruoli IAM, quindi seleziona il ruolo IAM S3BatchOperationsRole.
  13. 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?

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 mesi fa