AWS
                
              AWS 계정 간 S3 데이터 동기화 (Cross-Account S3 Sync)
                SecuOf
                 2025. 5. 1. 21:27
              
              
            
            AWS 계정 간 S3 데이터 동기화 (Cross-Account S3 Sync)
AWS에서는 서로 다른 계정(A → B) 간에 S3 데이터를 복사(Sync)하려면 몇 가지 IAM 및 S3 정책 구성이 필요합니다.
이 포스트에서는 A 계정의 S3 버킷에서 B 계정의 S3 버킷으로 데이터를 동기화(sync) 하는 방법을 정리합니다.
DataSync 서비스를 사용하는 방법도 있으나, 아래의 방법이 가장 간단하고 효율적입니다.

✅ 전제 조건
- A 계정: 소스 S3 버킷 보유 (dev-source-bucket)
- B 계정: 대상 S3 버킷 보유 (prod-target-bucket)
- 동기화는 B 계정의 EC2 인스턴스에서 AWS CLI로 실행
- EC2 인스턴스는 IAM Role(crossaccount-sync-role)을 사용
✅ 1. A 계정 – S3 버킷 정책 설정
A 계정의 S3 버킷(dev-source-bucket)에 다음 버킷 정책을 추가하여 B 계정 EC2 Role에게 객체 접근을 허용해야 합니다.
A 계정의 S3 버킷 정책
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCrossAccountSyncRole",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<B_ACCOUNT_ID>:role/crossaccount-sync-role"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::dev-source-bucket",
        "arn:aws:s3:::dev-source-bucket/*"
      ]
    }
  ]
}🔐 GetObjectTagging은 AWS CLI s3 sync 시 객체 태그 복사를 시도할 경우 필요합니다.
✅ 2. B 계정 – EC2 IAM Role 정책 구성
B 계정의 EC2 인스턴스에 연결된 IAM Role(crossaccount-sync-role)에는 다음과 같은 정책이 필요합니다.
B 계정 IAM 정책
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowReadFromSourceBucket",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::dev-source-bucket",
        "arn:aws:s3:::dev-source-bucket/*"
      ]
    },
    {
      "Sid": "AllowWriteToTargetBucket",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::prod-target-bucket",
        "arn:aws:s3:::prod-target-bucket/*"
      ]
    }
  ]
}✅ 3. EC2 인스턴스에서 동기화 명령 실행
IAM Role이 올바르게 설정되었다면, B 계정의 EC2 인스턴스에서 다음 명령을 실행하여 동기화를 수행할 수 있습니다.
aws s3 sync s3://dev-source-bucket s3://prod-target-bucket \
  --source-region ap-northeast-2 \
  --region ap-northeast-2📊 구조도 (텍스트 도식화)
[A 계정: dev-source-bucket]
         |
         | (s3:GetObject, ListBucket)
         v
[B 계정 EC2: IAM Role = crossaccount-sync-role]
         |
         | (s3:PutObject, ListBucket)
         v
[B 계정: prod-target-bucket]✅ 보안 팁
- A 계정 S3 버킷의 접근 권한은 정확한 Role ARN으로 제한할 것
- 동기화 주체가 EC2 인스턴스일 경우, Access Key 대신 IAM Role을 통해 인증할 것
- s3:GetObjectTagging은 AWS CLI 최신 버전에서 필요할 수 있으니 포함 추천
✅ 참고
- aws s3 sync는 내부적으로- ListObjectsV2,- GetObject,- PutObject등을 호출합니다.
- AWS CLI 버전에 따라 권한 요구 사항이 다를 수 있으므로 최신 CLI 사용 권장