이 가이드에서는 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가지 권한을 부여해줍니다.
- S3 복사가 가능하도록 하는 권한 [AllowAssumeRole-S3CopyRole]
- 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://<버킷이름>/

참고
AWS CLI를 사용하여 S3 버킷에서 다른 계정 및 리전으로 데이터 복사 - 권장 가이드
사용 사례에 따라 신뢰 정책에 있는 대상 IAM 역할 또는 사용자 이름의 Amazon 리소스 이름 ARN)을 수정합니다.
docs.aws.amazon.com
'AWS > 운영' 카테고리의 다른 글
| ADOT(AWS Distro for OpenTelemetry)설명 및 배포 가이드 (0) | 2025.11.25 |
|---|---|
| 폐쇄망 환경에서 운영 문서를 위한 AWS 자산 목록 추출 방법 (0) | 2025.09.21 |
| 가비아 도메인을 AWS ACM에 등록하기 (0) | 2024.05.22 |
댓글