내용으로 건너뛰기

Amazon S3 Batch Operations를 사용하여 5GB보다 큰 객체를 복사하려면 어떻게 해야 합니까?

5분 분량
0

하나의 버킷에서 다른 버킷으로 5GB보다 큰 Amazon Simple Storage Service(Amazon S3) 객체를 복사하고 싶습니다.

간략한 설명

하나의 버킷에서 다른 버킷으로 5GB보다 큰 Amazon S3 객체를 복사하려면 AWS Lambda 함수와 함께 S3 Batch Operations를 사용하십시오. 자세한 내용은 Amazon S3 Batch Operations를 사용하여 5GB 이상의 객체 복사를 참조하십시오.

참고: 또한 멀티파트 업로드 API를 사용하여 5GB보다 큰 Amazon S3 객체를 복사할 수 있습니다. 자세한 내용은 멀티파트 업로드를 사용한 객체 복사를 참조하십시오.

해결 방법

시작하기 전에 객체를 복사할 대상 S3 버킷을 생성했는지 확인하십시오.

Lambda 함수 생성

다음 단계를 완료합니다.

  1. Lambda 콘솔을 엽니다.

  2. Create function(함수 생성)을 선택합니다.

  3. Author from scratch(새로 작성)를 선택합니다.

  4. Function name(함수 이름)에 함수 이름을 입력합니다(예: S3BatchCopy).

  5. Runtime(런타임) 드롭다운 목록을 선택한 다음 Python 3.9를 선택합니다.

  6. Architecture(아키텍처)에서 x86_64를 선택한 다음 Create function(함수 생성)을 선택합니다.

  7. 내장된 코드 편집기에 Lambda 함수 코드를 입력합니다.
    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. Deploy(배포)를 선택합니다.

Lambda 함수에 대한 IAM 역할 생성

다음 단계를 완료합니다.

  1. AWS Identity and Access Management(IAM) 콘솔을 엽니다.

  2. 탐색 창에서 Roles(역할)을 선택한 다음, Create role(역할 생성)을 선택합니다.

  3. Trusted entity type(신뢰할 수 있는 엔티티 유형)에 AWS service(AWS 서비스)를 선택합니다.

  4. Use case(사용 사례) 드롭다운 목록을 선택한 다음 Lambda를 선택합니다.

  5. Next(다음)를 선택합니다.

  6. AWSLambdaBasicExecutionRole 정책을 선택한 후 Next(다음)를 선택합니다.

  7. Role name(역할 이름)에 이름을 입력합니다(예: LambdaS3BatchRole).

  8. 다음 정책을 입력합니다.

    {
        "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. Create role(역할 생성)을 선택합니다.

참고: 고객 관리형 AWS Key Management Service(AWS KMS) 키를 사용하여 버킷을 암호화하는 경우 IAM 역할이 추가 권한을 부여해야 합니다. 자세한 내용은 내 Amazon S3 버킷의 기본 암호화가 사용자 지정 AWS KMS 키를 사용해 설정되어 있습니다. 사용자가 버킷에서 다운로드하고 버킷에 업로드하도록 허용하려면 어떻게 해야 합니까?를 참조하십시오.

Batch Operations 권한 정책 생성

다음 단계를 완료합니다.

  1. IAM 콘솔을 엽니다.

  2. 탐색 창에서 Roles(역할)을 선택한 다음, Create role(역할 생성)을 선택합니다.

  3. Trusted entity type(신뢰할 수 있는 엔티티 유형)에 AWS 서비스를 선택합니다.

  4. Use case(사용 사례) 드롭다운 목록을 선택한 다음 S3를 선택합니다.

  5. S3 Batch Operations를 선택합니다.

  6. Next(다음)를 선택합니다.

  7. Role name(역할 이름)에 이름을 입력합니다(예: S3BatchOperationsRole).

  8. 다음 정책을 입력합니다.

    {
        "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. Create role(역할 생성)을 선택합니다.

Batch Operations 작업 생성

다음 단계를 완료합니다.

  1. Amazon S3 콘솔을 엽니다.
  2. 탐색 창에서 Batch Operations를 선택한 다음, Create job(작업 생성)을 선택합니다.
  3. Manifest format(매니페스트 형식)에 S3 inventory report(S3 인벤토리 보고서) 또는 CSV를 선택합니다.
  4. Manifest object(매니페스트 객체)에 Browse S3(S3 찾아보기)를 선택합니다.
  5. 객체를 복사할 소스 버킷을 선택합니다.
  6. 소스 버킷에서 객체를 선택한 다음 Choose path(경로 선택)를 선택합니다.
  7. Next(다음)를 선택합니다.
  8. Choose operation(작업 선택)에서 Copy(복사)를 선택합니다.
  9. Copy destination(복사 대상)에서 Browse S3(S3 찾아보기)를 선택합니다.
  10. 객체를 복사할 대상 버킷을 선택한 다음 Choose path(경로 선택)를 선택합니다.
  11. 동일한 이름을 가진 기존 객체를 덮어쓰는 것을 확인합니다을 선택하고 Next(다음)를 선택합니다.
  12. Permissions(권한)에서 IAM role(IAM 역할) 드롭다운 목록을 선택한 다음 S3BatchOperationsRole IAM 역할을 선택합니다.
  13. Next(다음)를 선택하고 Create job(작업 생성)을 선택합니다.

교차 계정 액세스

대상 S3 버킷이 다른 AWS 계정에 있는 경우 리소스 기반 정책을 버킷에 연결해야 합니다.
리소스 기반 정책 예시:

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

자세한 내용은 다른 AWS 계정에서 Amazon S3 객체를 복사하려면 어떻게 해야 합니까?를 참조하십시오.

관련 정보

Amazon S3 Batch Operations 문제를 해결하려면 어떻게 해야 합니까?

한 Amazon S3 버킷의 모든 객체를 다른 버킷으로 복사하려면 어떻게 해야 합니까?

Amazon S3 버킷에서 다른 버킷으로 대량의 데이터를 전송하는 가장 좋은 방법은 무엇입니까?

AWS 공식업데이트됨 2년 전