AWS CLI를 사용하여 S3 버킷에서 다른 계정 및 리전으로 데이터 복사 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS CLI를 사용하여 S3 버킷에서 다른 계정 및 리전으로 데이터 복사

작성자: Appasaheb Bagali(AWS), Purushotham G K(AWS)

환경: 프로덕션

기술: 스토리지 및 백업, CloudNative

AWS 서비스: AWS CLI, AWS 자격 증명 및 액세스 관리, 아마존 S3

요약

이 패턴은 AWS 소스 계정의 Amazon Simple Storage Service(S3) 버킷에서 동일한 AWS 리전이나 다른 리전에 있는 다른 AWS 계정의 대상 S3 버킷으로 데이터를 마이그레이션하는 방법을 설명합니다.

소스 S3 버킷은 연결된 리소스 정책을 사용하여 AWS Identity 및 Access Management(IAM) 액세스를 허용합니다. 대상 계정의 사용자는 소스 버킷에 대한 권한이 있는 PutObjectGetObject의 역할을 맡아야 합니다. 마지막으로 copysync 명령을 실행하여 원본 S3 버킷에서 대상 S3 버킷으로 데이터를 전송합니다.

계정은 S3 버킷에 업로드한 객체를 소유합니다. 계정 및 리전 간에 객체를 복사하는 경우 대상 계정에 복사한 객체의 소유권을 부여합니다. 액세스 제어 목록(ACL)bucket-owner-full-control로 변경하여 객체의 소유권을 변경할 수 있습니다. 그러나 여러 객체에 대해 ACL을 관리하기가 어려울 수 있으므로 대상 계정에 프로그래밍 방식의 교차 계정 권한을 부여하는 것이 좋습니다.

경고: 이 시나리오에서는 IAM 사용자에게 프로그래밍 액세스 및 장기 자격 증명이 필요하며, 이는 보안 위험을 초래합니다. 이 위험을 줄이려면 이러한 사용자에게 작업을 수행하는 데 필요한 권한만 제공하고 더 이상 필요하지 않을 경우 이러한 사용자를 제거하는 것이 좋습니다. 필요한 경우 액세스 키를 업데이트할 수 있습니다. 자세한 내용은 IAM 사용 설명서액세스 키 업데이트를 참조하세요.

이 패턴에는 일회성 마이그레이션이 포함됩니다. 원본 버킷에서 대상 버킷으로 새 객체를 지속적으로 자동 마이그레이션해야 하는 시나리오의 경우 S3 Batch Replication을 사용하여 S3 버킷에서 다른 계정 및 지역으로 데이터 복사 패턴에 설명된 대로 S3 Batch Replication을 대신 사용할 수 있습니다.

사전 조건 및 제한 사항

  • 동일한 AWS 리전 또는 서로 다른 AWS 리전의 활성 AWS 계정 2개.

  • 소스 계정의 기존 S3 버킷입니다. 

  • 소스 또는 대상 Amazon S3 버킷에 기본 암호화가 활성화되어 있는 경우 AWS Key Management Service(AWS KMS) 키 권한을 수정해야 합니다. 자세한 내용은 이 주제에 대한 AWS re:Post 문서를 참조하세요.

  • 교차 계정 권한에 대해 잘 알고 있어야 합니다.

아키텍처

Amazon S3 데이터를 다른 계정 또는 리전으로 복사

도구

모범 사례

에픽

작업설명필요한 기술

IAM 사용자를 생성하고 액세스 키를 받습니다.

  1. AWS Management Console에 로그인하고 프로그래밍 방식으로 액세스할 수 있는 IAM 사용자를 생성합니다. 자세한 단계는 IAM 설명서의 IAM 사용자 생성을 참조하세요. 이 사용자에 대한 정책은 추가할 필요가 없습니다.

  2. 이 사용자의 액세스 키와 비밀 키를 생성합니다. 지침은 AWS 설명서의 AWS 계정 및 액세스 키를 참조하세요.

AWS DevOps

자격 증명 기반 IAM 정책을 생성합니다.

다음 권한을 사용하여 S3MigrationPolicy라는 이름이 지정된 IAM ID 기반 정책을 생성합니다. 자세한 내용은 IAM 설명서의 IAM 정책 생성을 참조하세요.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::awsexamplesourcebucket", "arn:aws:s3:::awsexamplesourcebucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectTagging", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::awsexampledestinationbucket", "arn:aws:s3:::awsexampledestinationbucket/*" ] } ] }

참고: 사용 사례에 따라 원본 및 대상 버킷 이름을 수정합니다.

이 ID 기반 정책을 통해 이 역할을 수임하는 사용자는 원본 버킷과 대상 버킷에 액세스할 수 있습니다.

AWS DevOps

IAM 역할을 생성합니다.

다음 신뢰 정책을 사용하여 S3MigrationRole이라는 이름이 지정된 IAM 역할을 생성한 후 이전에 생성한 S3MigrationPolicy를 연결합니다. 자세한 단계는 IAM 설명서의 역할을 생성하여 IAM 사용자에게 권한 위임을 참조하세요.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<destination_account>:user/<user_name>" }, "Action": "sts:AssumeRole", "Condition": {} } ] }

참고: 사용 사례에 따라 신뢰 정책에서 대상 IAM 역할 또는 사용자 이름의 Amazon 리소스 이름 (ARN) 을 수정하십시오.

이 신뢰 정책은 새로 생성한 IAM 사용자가 S3MigrationRole을 가정하도록 허용합니다.

AWS DevOps
작업설명필요한 기술

S3 버킷 정책을 생성하고 연결합니다.

소스 계정의 AWS Management Console에 로그인하고 Amazon S3 콘솔을 엽니다. S3 버킷을 선택한 다음 권한을 선택합니다. 버킷 정책에서 편집을 선택한 다음, 다음 버킷 정책에 붙여 넣습니다. 저장을 선택합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": {"AWS": "arn:aws:iam::<destination_account>:role/<RoleName>"}, "Action": ["s3:ListBucket", "s3:GetObject", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionTagging" ], "Resource": [ "arn:aws:s3:::awsexamplesourcebucket/*", "arn:aws:s3:::awsexamplesourcebucket" ] } ] }

참고: 대상 계정의 AWS 계정 ID를 포함하고 요구 사항에 따라 버킷 정책 템플릿을 구성해야 합니다.

이 리소스 기반 정책은 대상 역할 S3MigrationRole이 소스 계정의 S3 객체에 액세스할 수 있도록 허용합니다.

클라우드 관리자
작업설명필요한 기술

대상 S3 버킷을 생성합니다.

대상 계정의 AWS Management Console에 로그인하고 Amazon S3 콘솔을 연 다음 버킷 생성을 선택합니다. 요구 사항에 따라 S3 버킷을 생성합니다. 자세한 내용은 Amazon S3 설명서의 버킷 생성을 참조하세요. 

클라우드 관리자
작업설명필요한 기술

새로 생성한 사용자 보안 인증 정보로 AWS CLI를 구성합니다.

  1. AWS CLI의 최신 릴리스를 설치합니다. 지침은 AWS CLI 설명서에서 최신 버전의 AWS CLI 설치 또는 업데이트를 참조하세요.

  2. 생성한 사용자의 AWS 액세스 키로 $ aws configure를 실행하고 CLI를 업데이트합니다. 자세한 내용은 AWS CLI 설명서의 구성 및 보안 인증 파일 설정을 참조하세요.

AWS DevOps

S3 마이그레이션 역할을 수임합니다.

  1. AWS CLI를 사용하여 S3MigrationRole을 가정해 보세요.

    aws sts assume-role \ --role-arn "arn:aws:iam::<destination_account>:role/S3MigrationRole" \ --role-session-name AWSCLI-Session

    이 명령은 여러 정보를 출력합니다. 보안 인증 정보 블록 내에는 AccessKeyId, SecretAccessKeySessionToken이 필요합니다. 이 예제에서는 환경 변수 RoleAccessKeyID, RoleSecretKey, 및 RoleSessionToken를 사용합니다. 참고로 만료 필드의 타임스탬프는 UTC 표준 시간대로 표시됩니다. 타임스탬프는 IAM 역할의 임시 보안 인증이 만료되는 시기를 나타냅니다. 임시 보안 인증이 만료되면 sts:AssumeRole API를 다시 직접적으로 호출해야 합니다.

  2. IAM 역할을 맡을 환경 변수 3개를 생성합니다. 이러한 환경 변수는 다음과 같은 출력으로 채워집니다.

    # Linux export AWS_ACCESS_KEY_ID=RoleAccessKeyID export AWS_SECRET_ACCESS_KEY=RoleSecretKey export AWS_SESSION_TOKEN=RoleSessionToken # Windows set AWS_ACCESS_KEY_ID=RoleAccessKeyID set AWS_SECRET_ACCESS_KEY=RoleSecretKey set AWS_SESSION_TOKEN=RoleSessionToken
  3. 다음 명령을 실행하여 IAM 역할을 가정했는지 검증합니다.

    aws sts get-caller-identity

자세한 정보는 AWS 지식 센터를 참조하세요.

AWS 관리자

소스 S3 버킷의 데이터를 대상 S3 버킷으로 복사 및 동기화합니다.

S3MigrationRole 역할을 맡았으면 복사(cp) 또는 동기화(sync) 명령을 사용하여 데이터를 복사할 수 있습니다.

복사(자세한 내용은 AWS CLI 명령 참조 참조):

aws s3 cp s3:// DOC-EXAMPLE-BUCKET-SOURCE / \ s3:// DOC-EXAMPLE-BUCKET-TARGET / \ --recursive --source-region SOURCE-REGION-NAME --region DESTINATION-REGION-NAME

동기화(자세한 내용은 AWS CLI 명령 참조 참조):

aws s3 sync s3:// DOC-EXAMPLE-BUCKET-SOURCE / \ s3:// DOC-EXAMPLE-BUCKET-TARGET / \ --source-region SOURCE-REGION-NAME --region DESTINATION-REGION-NAME
클라우드 관리자

문제 해결

문제Solution

ListObjects 작업을 호출할 때 다음과 같은 오류가 발생했습니다(AccessDenied). 액세스 거부

  • S3MigrationRole 역할을 맡았는지 확인하세요.

  • aws sts get-caller-identity를 실행하여 사용된 역할을 확인합니다. 출력에 S3MigrationRole에 대한 ARN이 표시되지 않는 경우 역할을 다시 수임하고 다시 시도하세요.

관련 리소스