AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
Amazon S3 Batch Operations를 사용하여 5GB보다 큰 객체를 복사하려면 어떻게 해야 합니까?
하나의 버킷에서 다른 버킷으로 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 함수 생성
다음 단계를 완료합니다.
-
Lambda 콘솔을 엽니다.
-
Create function(함수 생성)을 선택합니다.
-
Author from scratch(새로 작성)를 선택합니다.
-
Function name(함수 이름)에 함수 이름을 입력합니다(예: S3BatchCopy).
-
Runtime(런타임) 드롭다운 목록을 선택한 다음 Python 3.9를 선택합니다.
-
Architecture(아키텍처)에서 x86_64를 선택한 다음 Create function(함수 생성)을 선택합니다.
-
내장된 코드 편집기에 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}] } -
Deploy(배포)를 선택합니다.
Lambda 함수에 대한 IAM 역할 생성
다음 단계를 완료합니다.
-
탐색 창에서 Roles(역할)을 선택한 다음, Create role(역할 생성)을 선택합니다.
-
Trusted entity type(신뢰할 수 있는 엔티티 유형)에 AWS service(AWS 서비스)를 선택합니다.
-
Use case(사용 사례) 드롭다운 목록을 선택한 다음 Lambda를 선택합니다.
-
Next(다음)를 선택합니다.
-
AWSLambdaBasicExecutionRole 정책을 선택한 후 Next(다음)를 선택합니다.
-
Role name(역할 이름)에 이름을 입력합니다(예: LambdaS3BatchRole).
-
다음 정책을 입력합니다.
{ "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" } ] } -
Create role(역할 생성)을 선택합니다.
참고: 고객 관리형 AWS Key Management Service(AWS KMS) 키를 사용하여 버킷을 암호화하는 경우 IAM 역할이 추가 권한을 부여해야 합니다. 자세한 내용은 내 Amazon S3 버킷의 기본 암호화가 사용자 지정 AWS KMS 키를 사용해 설정되어 있습니다. 사용자가 버킷에서 다운로드하고 버킷에 업로드하도록 허용하려면 어떻게 해야 합니까?를 참조하십시오.
Batch Operations 권한 정책 생성
다음 단계를 완료합니다.
-
IAM 콘솔을 엽니다.
-
탐색 창에서 Roles(역할)을 선택한 다음, Create role(역할 생성)을 선택합니다.
-
Trusted entity type(신뢰할 수 있는 엔티티 유형)에 AWS 서비스를 선택합니다.
-
Use case(사용 사례) 드롭다운 목록을 선택한 다음 S3를 선택합니다.
-
S3 Batch Operations를 선택합니다.
-
Next(다음)를 선택합니다.
-
Role name(역할 이름)에 이름을 입력합니다(예: S3BatchOperationsRole).
-
다음 정책을 입력합니다.
{ "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" } ] } -
Create role(역할 생성)을 선택합니다.
Batch Operations 작업 생성
다음 단계를 완료합니다.
- Amazon S3 콘솔을 엽니다.
- 탐색 창에서 Batch Operations를 선택한 다음, Create job(작업 생성)을 선택합니다.
- Manifest format(매니페스트 형식)에 S3 inventory report(S3 인벤토리 보고서) 또는 CSV를 선택합니다.
- Manifest object(매니페스트 객체)에 Browse S3(S3 찾아보기)를 선택합니다.
- 객체를 복사할 소스 버킷을 선택합니다.
- 소스 버킷에서 객체를 선택한 다음 Choose path(경로 선택)를 선택합니다.
- Next(다음)를 선택합니다.
- Choose operation(작업 선택)에서 Copy(복사)를 선택합니다.
- Copy destination(복사 대상)에서 Browse S3(S3 찾아보기)를 선택합니다.
- 객체를 복사할 대상 버킷을 선택한 다음 Choose path(경로 선택)를 선택합니다.
- 동일한 이름을 가진 기존 객체를 덮어쓰는 것을 확인합니다을 선택하고 Next(다음)를 선택합니다.
- Permissions(권한)에서 IAM role(IAM 역할) 드롭다운 목록을 선택한 다음 S3BatchOperationsRole IAM 역할을 선택합니다.
- 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 문제를 해결하려면 어떻게 해야 합니까?
관련 콘텐츠
질문됨 2년 전
질문됨 2년 전
