AWS S3 교차계정/리전 간 복제 및 배치

랜섬웨어 대응, DR 환경 구축, 보안 분리를 위해 교차계정·리전 간 S3 복제 백업을 설계하는 기업이 빠르게 늘어나고 있습니다. 그러나 실제로 구축을 시도해 보면, “신규 객체는 잘 복제되는데 기존에 쌓여 있던 데이터는 그대로 남아 있는” 문제가 자주 발생합니다.

AWS S3에서는 복제 규칙만으로는 신규 객체부터 복제가 진행되기 때문에, 기존 객체를 모두 옮기려면 Batch Operations와 IAM Role, Bucket Policy, Manifest 구성이 함께 맞물려야 합니다.

이번 글에서는 AWS S3 교차계정·리전 간 복제를 Batch Operations로 구현하는 전체 과정을, 실제 설정 예시(JSON)와 함께 단계별로 정리해 보았습니다.

전반적인 작업 준비 순서

  • 계정 2개 준비 (소스/ 대상)
  • 각 계정에서 리전 활성화- (ex 소스계정 s3가 서울, 대상 계정 s3가 홍콩 일 경우 각 계정에서 서로의 리전이 활성화 되어 있어야 합니다.)
  • 각 계정에서 S3 버킷이 존재 해야합니다.-(소스 계정에서 2개 :원본 버킷, manifest 저장용 버킷, 대상 계정에서 복제본이 저장될 버킷)
  • 모든 버킷의 버전 관리 활성화가 실행되어 있어야 합니다.
  • 소스 계정에서 IAM ROLE 생성 s3-replica-role 등의 이름으로 생성-(식별을 위해 직관적인 name 추천합니다.)
  • 소스계정의 IAM ROLE의 신뢰관계에 1번 항목을 적용합니다.
  • 소스계정의 IAM ROLE에 2번 항목을 적용 합니다.
  • 소스계정의 버킷 중 manifest가 저장될 경로의 버킷 정책에 4번을 적용 합니다.
  • 대상 계정에서 복제될 예정인 버킷을 선택후 버킷의 정책을 3번 을 따라 작성합니다.
  • 이후 콘솔 상에서 복제 규칙을 생성하고 복제 규칙 마지막 단계에서 배치작업을 수행하여 기존 리소스를 복제합니다.

아래의 JSON은 필요 시 <소스버킷명>, <destination 버킷명>, <manifest 파일 저장 버킷명>, 등을 실제 환경에 맞게 적용하여 사용하시면 되겠습니다.

1. Source 계정의 IAM Role: Trust Relationship (사용시 주석 제거 필수)

{
  "Version": "2012-10-17",
  "Statement": [

    // 이 역할을 사용할 수 있는 주체(Principal)를 정의
    // → S3와 Batch Operations 서비스가 이 Role을 사용할 수 있도록 허용
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "s3.amazonaws.com",                  // S3 서비스 (복제 작업용)
          "batchoperations.s3.amazonaws.com"   // S3 Batch Operations 서비스
        ]
      },
      "Action": "sts:AssumeRole"               // 이 역할을 맡을 수 있게 함 (역할 위임)
    }

  ]
}

이 Trust Policy는 복제 작업 시 S3 및 Batch Operations 서비스가

지정한 IAM Role을 사용할 수 있게 허용하는 핵심 설정입니다.

2. Source 계정의 IAM Role: Permissions (사용시 주석 제거 필수)

{
  "Version": "2012-10-17",
  "Statement": [

    // [소스 버킷 접근 권한]
    // 복제를 위한 객체 및 버전 정보, 태그, 보존정책, LegalHold 등을 읽기 위한 권한
    {
      "Sid": "SourceAccess",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",                     // 버킷 내 객체 리스트 조회
        "s3:InitiateReplication",            // 복제 작업 시작
        "s3:GetReplicationConfiguration",    // 복제 설정 조회
        "s3:GetObjectVersionForReplication", // 객체 버전 조회
        "s3:GetObjectVersionAcl",            // 객체 버전의 ACL 정보
        "s3:GetObjectVersionTagging",        // 객체 버전의 태그 조회
        "s3:GetObjectRetention",             // 보존 정책 조회
        "s3:GetObjectLegalHold",             // 법적 보존 상태 조회
        "s3:GetObject"                       // 객체 자체 읽기
      ],
      "Resource": [
        "arn:aws:s3:::<소스버킷1>",
        "arn:aws:s3:::<소스버킷1>/*",
        "arn:aws:s3:::<소스버킷2>",
        "arn:aws:s3:::<소스버킷2>/*"
      ]
    },

    // [복제 대상 버킷에 복사 권한]
    // 대상 버킷으로 객체를 복사하고 태그/삭제마커 복사 및 소유권 이전을 수행
    {
      "Sid": "ReplicationActions",
      "Effect": "Allow",
      "Action": [
        "s3:ReplicateObject",                // 객체 복제
        "s3:ReplicateDelete",                // 삭제 마커 복제
        "s3:ReplicateTags",                  // 태그 복제
        "s3:GetObjectVersionTagging",        // 객체 태그 정보 확인
        "s3:ObjectOwnerOverrideToBucketOwner", // 소유권 대상 계정으로 전환
        "s3:InitiateReplication",            // 복제 작업 시작
        "s3:PutObject"                       // 복제된 객체 대상 버킷에 저장
      ],
      "Resource": [
        "arn:aws:s3:::<소스버킷1>/*",
        "arn:aws:s3:::<소스버킷2>/*",
        "arn:aws:s3:::<대상버킷1>/*",
        "arn:aws:s3:::<대상버킷2>/*"
      ]
    },

    // [인벤토리 설정 권한]
    // Batch 작업을 위한 매니페스트 생성을 위해 필요한 권한
    {
      "Sid": "InventoryPermission",
      "Effect": "Allow",
      "Action": "s3:PutInventoryConfiguration", // 인벤토리 설정 작성
      "Resource": [
        "arn:aws:s3:::<소스버킷1>",
        "arn:aws:s3:::<소스버킷2>"
      ]
    },

    // [매니페스트 파일 접근 권한]
    // 복제 작업용 객체 목록(csv 등)을 읽기 위한 권한
    {
      "Sid": "ManifestAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",                     // 매니페스트 파일 다운로드
        "s3:ListBucket"                     // 매니페스트 버킷 내 파일 탐색
      ],
      "Resource": [
        "arn:aws:s3:::<매니페스트버킷>",
        "arn:aws:s3:::<매니페스트버킷>/*"
      ]
    },

    // [작업 결과 저장 및 위치 정보 확인 권한]
    // Batch 작업 결과 리포트를 해당 버킷에 저장
    {
      "Sid": "ReportBucketAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",                     // 리포트 파일 업로드
        "s3:GetBucketLocation"             // 버킷 리전 정보 확인
      ],
      "Resource": [
        "arn:aws:s3:::<매니페스트버킷>",
        "arn:aws:s3:::<매니페스트버킷>/*"
      ]
    }
  ]
}

이 역할은 다음과 같은 3가지 버킷을 기준으로 권한을 구성합니다

소스 버킷: 복제할 객체가 있는 버킷 (조회 및 복제 설정)

매니페스트 버킷: 복제할 객체 목록이 포함된 매니페스트 파일이 저장되는 버킷

대상 버킷: 복제 대상 (쓰기, 태그, 소유권 전환 등

+작업 대상 버킷이 여러개일 경우 모두 작성해주어야 합니다

3. Destination 버킷 정책 (사용시 주석 제거 필수)

{
  "Version": "2012-10-17",
  "Statement": [

    // 복제된 객체를 쓰기, 삭제, 태그 복사를 허용
    {
      "Sid": "AllowReplicationWriteAccess",
      "Effect": "Allow",
      "Principal": {
        // 소스 계정의 IAM 복제 역할
        "AWS": "arn:aws:iam::<소스계정ID>:role/<복제IAMRole명>"
      },
      "Action": [
        "s3:ReplicateObject",    // 객체 복제 허용
        "s3:ReplicateDelete",    // 삭제 마커 복제 허용
        "s3:ReplicateTags",      // 태그 복사 허용
        "s3:PutObject"           // 객체 쓰기 허용 (실제로 객체 저장을 위해 필요)
      ],
      "Resource": "arn:aws:s3:::<대상버킷명>/*"
    },

    // 복제 대상 버킷의 버전관리 설정 읽기 및 수정 권한 부여
    {
      "Sid": "AllowVersioningControl",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<소스계정ID>:role/<복제IAMRole명>"
      },
      "Action": [
        "s3:GetBucketVersioning",   // 버전 관리 상태 조회
        "s3:PutBucketVersioning"    // 버전 관리 설정 변경
      ],
      "Resource": "arn:aws:s3:::<대상버킷명>"
    },

    // 객체의 소유권을 복제 역할이 아닌 대상 버킷 계정으로 덮어쓰기 허용
    {
      "Sid": "AllowOwnershipOverride",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<소스계정ID>:role/<복제IAMRole명>"
      },
      "Action": "s3:ObjectOwnerOverrideToBucketOwner",
      "Resource": "arn:aws:s3:::<대상버킷명>/*"
    }

  ]
}

이 정책은 교차 계정 복제를 위한 필수 구성요소입니다.

각 권한은 다음 목적에 맞게 필요합니다

  • Replicate*, PutObject: 복제된 데이터를 쓰기 위함
  • Get/PutBucketVersioning: 버전 관리가 설정되어 있어야 복제가 작동
  • ObjectOwnerOverrideToBucketOwner: 객체 소유권을 대상 계정으로 변경

4. Manifest 저장 버킷 정책 (사용시 주석 제거 필수)

{
  "Version": "2012-10-17",
  "Statement": [

    // 복제 작업을 위한 Manifest 파일을 읽고 쓰기 위한 권한 부여
    {
      "Sid": "Statement1",
      "Effect": "Allow",
      "Principal": {
        // 복제 작업을 수행하는 IAM 역할 (보통 소스 계정의 복제 역할)
        "AWS": "<IAM Role ARN>"
      },
      "Action": [
        "s3:PutObject",         // Manifest 파일 업로드 (복제 작업 등록 시 필요)
        "s3:GetObject",         // Manifest 파일 다운로드 (복제 작업 수행 시 필요)
        "s3:GetObjectVersion"   // 특정 버전의 Manifest 파일 조회
      ],
      "Resource": [
        "arn:aws:s3:::<manifest 파일 저장 버킷명>",       // 버킷 자체
        "arn:aws:s3:::<manifest 파일 저장 버킷명>/*"     // 버킷 내 모든 객체
      ]
    }

  ]
}

이 정책은 보통 Batch 복제를 위한 Manifest 파일을 별도 버킷에 보관할 때 사용됩니다.

Manifest 파일은 복제할 객체 목록을 포함한 .csv 또는 .json 파일이며, 이 파일을 통해 복제 작업이 실행됩니다.

콘솔 작업 (복제 생성 및 배치)

1. 소스 버킷을 선택 후 관리 에서 복제 규칙 생성을 선택합니다.

  • 아래 복제규칙 이름을 설정하고
  • 즉시 실행 할 예정이기에 활성화 상태로 선택
  • 소스 버킷 항목의 규칙 범위는 버킷의 모든 객체에 적용을 선택합니다.
  • (필터를 걸어서 희망하는 객체만 가져올 수도 있지만 백업 목적이기에 모든 객체를 적용 합니다.)

2. 아래로 내려서 대상에서 다른 계정의 버킷 지정을 선택합니다.

  • 대상 버킷이 있는 계정 ID 숫자 12자리를 입력합니다.
  • 정확한 버킷 이름을 버킷 이름 항목에 작성합니다.
  • IAM 역할은 기존에 생성하고 규칙을 부여했던 IAM ROLE 로 적용합니다.

3. 기타 항목에 대해선 별도의 선택을 하지 않고 저장하여 복제 규칙을 생성 해줍니다.

4. 복제 규칙 생성시 기본 값으로 기존 객체를 복제하시겠습니까?라는 대화창이 나옵니다.

  • 예 기존 객체를 복제합니다를 체크 후 제출
  • (아니오를 선택할 경우 앞으로 추가되는 객체만 복제됩니다.)

5. 배치 작업 생성 작업 페이지로 넘어갑니다.

  • 준비가 되면 작업 실행을 선택 하고
  • 완료보고서 생성 도 선택
  • 보고서 범위는 모든 테스크로 실시 합니다.
  • 완료 보고서 대상은 기존에 manifest 저장용으로 생성한 s3 버킷을 지정해 줍니다.
  • IAM 역할은 기존 생성한 IAM ROLE을 선택 (다 포함하여 생성 했었습니다.)

  • 그럼 자동으로 배치가 돌아가며 결과에 대한 보고서는 manifest 버킷에 생성됩니다.
  • Manifest에선 배치 실패한 경우 report로 실패 이유에 대한 추적이 가능합니다.

참고사항

위 정책에서 <소스버킷명>, <대상버킷명>, <manifest 파일 저장 버킷명>, <소스계정ID>, <복제IAMRole명> 값은 실제 환경에 맞게 치환해야 합니다.

대상 버킷과 매니페스트 버킷 모두 버전 관리(Versioning) 가 활성화되어 있어야 복제 작업이 가능합니다.

IAM Role과 정책은 소스 계정에서 생성 및 할당되며, 대상 및 매니페스트 버킷은 별도 계정일 경우 정확한 권한 위임이 필수입니다.

참고 링크

해당 작업을 수행하시면서 어려움이나 작업 지원이 필요하신 경우 NDS 클라우드기술팀으로 문의부탁드립니다.

SA 오승우