본문 바로가기
AWS/운영

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

by ssyeon 2026. 1. 25.

 

이 가이드에서는 S3 버킷을 다른 계정으로 마이그레이션을 하는 방법을 안내합니다.

소스 계정을 A계정이라 지칭하고 도착 계정을 B계정이라 지칭하겠습니다.

 

                            A계정                                                                                                                   B계정

 

 

A계정에는 마이그레이션 대상 S3 버킷에 정책을 넣을 예정이며, B 계정에는 IAM 역할을 생성해서 사용자가 접근 할 수 있도록 하며 IAM 사용자를 생성해 cli 접근을 시도합니다.

이후 S3 sync 명령어를 통해 A계정에 있는 S3 버킷의 내용을 B 계정 S3 버킷으로 이동합니다.

 

A계정 S3 버킷 내용을 B계정으로 마이그레이션 하는 것이기 때문에 B계정에도 미리 S3 버킷을 생성해 두어야 합니다.

 

 


구조

 

A 계정 IAM User → B 계정 Role Assume → B Role 권한으로 A S3 읽고 + B S3에 쓴다

 

[로컬 PC]
   ↓ (A 계정 IAM User 자격증명)
[A 계정 IAM User]
   ↓ sts:AssumeRole
[B 계정 IAM Role]
   ↓ (Role 권한)
A S3 (Read)  →  B S3 (Write)

 


순서

 

B계정

- IAM 역할 권한 변경

- IAM 사용자 생성

 

A계정

- S3 비킷 권한 변경


B 계정] IAM 역할 설정

 

IAM Role을 생성해주고 권한 정책들을 넣어줍니다 

 

 

 

 

 

AllowAssumeRole-S3CopyRole 정책 설정 합니다. 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<B계정 ID>:role/<B IAM 역할 이름>"
        }
    ]
}

 

 

 

 

 

S3MigrationRole 라는 이름으로 정책을 생성합니다. 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadFromSourceBucketInAccountA",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<A계정 S3 이름>"
            ]
        },
        {
            "Sid": "ReadObjectsFromSourceBucketInAccountA",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3::: <A계정 S3 이름>/*"
            ]
        },
        {
            "Sid": "WriteToDestBucketInAccountB",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3::: <B계정 S3 이름> "
            ]
        },
        {
            "Sid": "WriteObjectsToDestBucketInAccountB",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3::: <B계정 S3 이름>/*"
            ]
        }
    ]
}

 

 

 

IAM 역할에 총 4개의 권한이 들어가 있습니다

 

 

 

신뢰관계에 아래 권한을 추가해줍니다. 

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowUserOnly",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam:: <B계정 ID>:role/<B IAM 역할 이름>"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

 

 


B 계정] 사용자 생성

AWS cli 접근을 위해 사용자를 만들어줍니다

 

 

보안 자격 증명에서 액세스 키를 생성해줍니다.

해당 액세스 키를 사용해 aws cli 연결해서 사용하게 됩니다.

 

 

이 사용자에 2가지 권한을 부여해줍니다.

  1. S3 복사가 가능하도록 하는 권한 [AllowAssumeRole-S3CopyRole]
  2. IAM 접근 권한 [IAM]

 

 

AllowAssumeRole-S3CopyRole 정책을 생성합니다. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::<B계정 ID>:role/<B IAM 역할 이름>"
        }
    ]
}

 

 

 

 

IAM이름으로 정책을 생성해줍니다. 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "IamReadForTroubleshooting",
            "Effect": "Allow",
            "Action": [
                "iam:GetUser",
                "iam:ListUserPolicies",
                "iam:GetUserPolicy",
                "iam:ListAttachedUserPolicies",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListRolePolicies"
            ],
            "Resource": "*"
        }
    ]
}

 

 

B계정 사용자에 이렇게 총 2개의 권한이 들어가 있습니다

 

 


 

 

A 계정]  

이동할 버킷을 선택해서 권한으로 이동합니다. 

버킷 정책으로 가서 정책을 수정합니다

 

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowReadFromBRole",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<B계정 ID>:role/<B IAM 역할 이름>"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::<A계정 S3 버킷이름>/*",
                "arn:aws:s3:::<A계정 S3 버킷이름>"
            ]
        }
    ]
}

 

 

 


 

AWS CLI

 

AWS CLI 가 설치되어 있다는 기준으로 진행됩니다

AWS CLI 설치 확인합니다. 

 

 

AWS B계정으로 연결

아래 명령어 입력 시 aws access key id, aws secret access key 등등을 넣을 수 있습니다.

위에서 만든 B계정 사용자 엑세스 키 내용을 입력해줍니다.

 

 

B계정으로 잘 들어갔는지 확인합니다.

 

 

 

# AssumeRole 실행
$creds = aws sts assume-role `
  --role-arn arn:aws:iam::<B계정 ID>:role/<B IAM 역할 이름> `
  --role-session-name my-session `
  --query Credentials `
  --output json | ConvertFrom-Json

# 환경 변수 설정
$env:AWS_ACCESS_KEY_ID = $creds.AccessKeyId
$env:AWS_SECRET_ACCESS_KEY = $creds.SecretAccessKey
$env:AWS_SESSION_TOKEN = $creds.SessionToken

 

 

 

AssumeRole 실행이랑 환경변수 설정을 완료하면 아래 사진처럼 user -> role으로 ARN이 변경된 것을 확인할 수 있습니다. 

 

 

이제 A계정 S3 내용을 B계정 S3로 마이그레이션을 합니다.

아래 사진은 cp 명령어를 통해 복사했지만 sync 명령어를 이용해서 마이그레이션 하는것을 더 추천합니다. 

sync 명령어를 사용해서 마이그레이션을 하면 중복으로 복사하는것을 방지할 수 있습니다. 

 

aws s3 sync s3://<A계정 S3버킷 이름>/ s3://<B계정 S3버킷 이름>/ --region ap-northeast-2 --acl bucket-owner-full-control

 

 

 

 

 

 

A/B계정 S3 버킷 내용 확인 명령어 입니다. 

A/B계정 S3 버킷 내용 확인 명령어로 B 계정에 잘 마이그레이션이 되었는지도 확인할 수 있습니다.

 

aws s3 ls s3://<버킷이름>/

 

 

 

 

참고

https://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/copy-data-from-an-s3-bucket-to-another-account-and-region-by-using-the-aws-cli.html

 

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

사용 사례에 따라 신뢰 정책에 있는 대상 IAM 역할 또는 사용자 이름의 Amazon 리소스 이름 ARN)을 수정합니다.

docs.aws.amazon.com

 

반응형

댓글