Ir para o conteúdo

Como uso as operações em lote do Amazon S3 para copiar objetos maiores que 5 GB?

6 minuto de leitura
0

Quero copiar objetos do Amazon Simple Storage Service (Amazon S3) maiores que 5 GB de um bucket para outro.

Breve descrição

Para copiar objetos do Amazon S3 maiores que 5 GB de um bucket para outro, use as operações em lote do S3 com uma função do AWS Lambda. Para obter mais informações, consulte Copiar objetos maiores que 5 GB com as operações em lote do Amazon S3.

Observação: também é possível usar a API de upload de várias partes para copiar objetos do Amazon S3 maiores que 5 GB. Para obter mais informações, consulte Copiar um objeto usando upload multiparte.

Resolução

Antes de começar, certifique-se de ter criado um bucket do S3 de destino para copiar os objetos.

Criar uma função do Lambda

Conclua as seguintes etapas:

  1. Abra o console do Lambda.

  2. Escolha Criar função.

  3. Escolha Criar do zero.

  4. Em Nome da função, insira um nome para sua função, por exemplo, S3BatchCopy.

  5. Escolha a lista suspensa Runtime e, em seguida, escolha Python 3.9.

  6. Em Arquitetura, escolha x86_64 e, em seguida, escolha Criar função.

  7. No editor de código integrado, insira seu código de função do Lambda.
    Exemplo de código de função do 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. Escolha Implantar.

Criar um perfil do IAM para a função do Lambda

Conclua as seguintes etapas:

  1. Abra o console do AWS Identity and Access Management (AWS IAM).

  2. No painel de navegação, escolha Perfis e depois Criar perfil.

  3. Em Tipo de entidade confiável, selecione Serviço da AWS.

  4. Escolha a lista suspensa Caso de uso e, em seguida, escolha Lambda.

  5. Escolha Avançar.

  6. Escolha a política AWSLambdaBasicExecutionRole e, em seguida, escolha Avançar.

  7. Em Nome do perfil, insira um nome, por exemplo, LambdaS3BatchRole.

  8. Anexe a política a seguir:

    {
        "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. Selecione Criar perfil.

Observação: se você usar uma chave do AWS Key Management Service (AWS KMS) gerenciada pelo cliente para criptografar seu bucket, o perfil do IAM deverá conceder permissões adicionais. Para obter mais informações, consulte Meu bucket do Amazon S3 tem criptografia padrão usando uma chave personalizada do AWS KMS. Como permitir que os usuários façam download pelo bucket e upload para o bucket?

Crie uma política de permissões de operações em lote

Conclua as seguintes etapas:

  1. Abra o console do IAM.

  2. No painel de navegação, escolha Perfis e depois Criar perfil.

  3. Em Tipo de entidade confiável, selecione Serviço da AWS.

  4. Escolha a lista suspensa Caso de uso e, em seguida, escolha S3.

  5. Use as Operações em Lote do Amazon S3.

  6. Escolha Avançar.

  7. Em Nome do perfil, insira um nome, por exemplo, S3BatchOperationsRole.

  8. Anexe a política a seguir:

    {
        "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. Selecione Criar perfil.

Criar um trabalho de operações em lote

Conclua as seguintes etapas:

  1. Abra o console do Amazon S3.
  2. No painel de navegação, escolha Operações em lote e, em seguida, escolha Criar tarefa.
  3. Para o formato de manifesto, selecione relatório de inventário do S3 ou CSV.
  4. Em Objeto de manifesto, escolha Browse S3.
  5. Selecione o bucket de origem para copiar os objetos.
  6. Selecione os objetos no bucket de origem e selecione Escolher caminho.
  7. Escolha Avançar.
  8. Em Escolher operação, escolha Copiar.
  9. Em Destino da cópia, escolha Procurar S3.
  10. Selecione o bucket de destino para copiar os objetos e, em seguida, selecione Escolher caminho.
  11. Selecione Eu reconheço que objetos existentes com o mesmo nome serão sobrescritos e escolha Avançar.
  12. Em Permissões, escolha a lista suspensa de perfis do IAM e, em seguida, selecione seu perfil S3BatchOperationsRole do IAM.
  13. Selecione Avançar e, em seguida, selecione Criar tarefa.

Acesso entre contas

Se o bucket do S3 de destino estiver em outra conta da AWS, você deverá anexar uma política baseada em recursos ao bucket.
Exemplo de política baseada em 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 obter instruções, consulte Como copiar objetos do Amazon S3 de outra conta da AWS?

Informações relacionadas

Como soluciono problemas das Operações em Lote do Amazon S3?

Como copio todos os objetos de um bucket do Amazon S3 para outro bucket?

Qual a melhor maneira de transferir grandes quantidades de dados de um bucket do Amazon S3 para outro?

AWS OFICIALAtualizada há 9 meses