Passer au contenu

Comment utiliser Amazon S3 Batch Operations pour copier des objets d’une taille supérieure à 5 Go ?

Lecture de 6 minute(s)
0

Je souhaite copier des objets Amazon Simple Storage Service (Amazon S3) d'une taille supérieure à 5 Go d'un compartiment à un autre.

Brève description

Pour copier des objets Amazon S3 de plus de 5 Go d'un compartiment à un autre, utilisez S3 Batch Operations avec une fonction AWS Lambda. Pour plus d'informations, consultez la section Copier des objets de plus de 5 Go avec Amazon S3 Batch Operations.

Remarque : Vous pouvez également utiliser l'API de chargement partitionné pour copier des objets Amazon S3 d'une taille supérieure à 5 Go. Pour plus d'informations, consultez la section Copie d'un objet à l'aide d'un chargement partitionné.

Résolution

Avant de commencer, assurez-vous d'avoir créé un compartiment S3 de destination vers lequel copier les objets.

Créer une fonction Lambda

Procédez comme suit :

  1. Ouvrez la console Lambda.

  2. Sélectionnez Create function (Créer une fonction).

  3. Sélectionnez Créer à partir de zéro.

  4. Pour Nom de la fonction, entrez un nom pour votre fonction, par exemple S3BatchCopy.

  5. Sélectionnez la liste déroulante Exécution, puis choisissez Python 3.9.

  6. Dans Architecture, choisissez x86_64, puis Créer une fonction.

  7. Dans l'éditeur de code intégré, saisissez le code de votre fonction Lambda.
    Exemple de code de fonction 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. Sélectionnez Déployer.

Créer un rôle IAM pour votre fonction Lambda

Procédez comme suit :

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

  2. Dans le volet de navigation, sélectionnez Rôles, puis Créer un rôle.

  3. Pour Type d’entité approuvée, choisissez Service AWS.

  4. Choisissez la liste déroulante Cas d'utilisation, puis sélectionnez Lambda.

  5. Sélectionnez Suivant.

  6. Choisissez la politique AWSLambdaBasicExecutionRole, puis sélectionnez Suivant.

  7. Pour Nom du rôle, entrez un nom, par exemple LambdaS3BatchRole.

  8. Saisissez la politique suivante :

    {
        "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. Sélectionnez Créer un rôle.

Remarque : Si vous utilisez une clé AWS Key Management Service (AWS KMS) gérée par le client pour chiffrer votre compartiment, le rôle IAM doit accorder des autorisations supplémentaires. Pour en savoir plus, consultez la section Mon compartiment Amazon S3 est chiffré par défaut à l’aide d’une clé AWS KMS personnalisée. Comment puis-je autoriser les utilisateurs à effectuer des téléchargements depuis et vers le compartiment ?

Créer une politique d'autorisations Batch Operations

Procédez comme suit :

  1. Ouvrez la console IAM.

  2. Dans le volet de navigation, sélectionnez Rôles, puis Créer un rôle.

  3. Pour Type d’entité approuvée, choisissez le service AWS.

  4. Choisissez la liste déroulante Cas d'utilisation, puis S3.

  5. Choisissez S3 Batch Operations.

  6. Sélectionnez Suivant.

  7. Pour Nom du rôle, entrez un nom, par exemple S3BatchOperationsRole.

  8. Saisissez la politique suivante :

    {
        "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. Sélectionnez Créer un rôle.

Créer une tâche Batch Operations

Procédez comme suit :

  1. Ouvrez la console Amazon S3.
  2. Dans le volet de navigation, choisissez Opérations par lots, puis Créer une tâche.
  3. Pour Format du manifeste, sélectionnez Rapport d'inventaire S3 ou CSV.
  4. Pour Objet de manifeste, choisissez Parcourir S3.
  5. Sélectionnez le compartiment source à partir duquel copier les objets.
  6. Sélectionnez les objets du compartiment source, puis choisissez Choisir un chemin.
  7. Sélectionnez Suivant.
  8. Pour Choisir une opération, choisissez Copier.
  9. Pour Copier la destination, choisissez Parcourir S3.
  10. Sélectionnez le compartiment de destination vers lequel copier les objets, puis choisissez Choisir un chemin.
  11. Sélectionnez Je reconnais que les objets existants portant le même nom seront remplacés, puis choisissez Suivant.
  12. Pour Autorisations, choisissez la liste déroulante Rôle IAM, puis sélectionnez votre rôle IAM S3BatchOperationsRole.
  13. Choisissez Suivant, puis choisissez Créer une tâche.

Accès intercompte

Si le compartiment S3 de destination se trouve dans un autre compte AWS, vous devez y associer une politique basée sur les ressources au compartiment.
Exemple de stratégie basée sur les ressources :

{
    "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/*"
        }
    ]
}

Pour plus d’informations, consultez la section Comment puis-je copier des objets S3 depuis un autre compte AWS ?

Informations connexes

Comment résoudre les problèmes liés aux opérations par lots d'Amazon S3 ?

Comment copier tous les objets d’un compartiment Amazon S3 vers un autre compartiment ?

Quel est le meilleur moyen de transférer de grandes quantités de données d'un compartiment Amazon S3 à un autre ?

AWS OFFICIELA mis à jour il y a un an