AWS 다른 계정으로 S3 Data Migration 하는 방법
S3 데이터를 AWS 다른계정으로 이관해야 할 일이 생겨서 관련 포스팅을 진행하고자 한다.
A -> B 계정으로 S3 이관을 진행한다고 가정할 때, 이루어지는 과정은 다음과 같다.
1. A계정 S3 Bucket Policy 변경
1-1) 기존에 Bucket Policy가 이미 설정되있는 경우
Bucket Policy에 cloudfront같은 설정이 포함되어있을 수 있다.
기존에 작성된 내용에서 "Statement"의 마지막 부분에 다음의 내용을 추가해준다.
여기서의 {B계정에 IAM 권한 설정한 사용자이름}에 관한 부분은 2~3번 내용을 먼저 참고한 뒤에 작성하면 된다!
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{B계정의 계정ID 띄어쓰기 없이 12자}:user/{B계정에 IAM 권한 설정한 사용자이름}"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{A계정의 Bucket이름}/*",
"arn:aws:s3:::{A계정의 Bucket이름}"
]
}
1-2) 기존에 Bucket Policy가 설정되지 않은 경우
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{B계정의 계정ID 띄어쓰기 없이 12자}:user/{B계정에 IAM 권한 설정한 사용자이름}"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{A계정의 Bucket이름}/*",
"arn:aws:s3:::{A계정의 Bucket이름}"
]
}
]
}
1-3) 공식문서 예제 참고용
{
"Version": "2012-10-17",
"Id": "Policy1611277539797",
"Statement": \[
{
"Sid": "Stmt1611277535086",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:user/Jane"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/\*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
},
{
"Sid": "Stmt1611277877767",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:user/Jane"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
}
\]
}
2. B계정의 IAM 권한 설정
IAM > 정책 > 정책 생성 > JSON 항목으로 이동하여 다음의 내용을 입력한다.
2-1. 검색하여 작성한 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{A계정의 Bucket이름}",
"arn:aws:s3:::{A계정의 Bucket이름}/*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::{B계정의 복사시킬 Bucket이름}",
"arn:aws:s3:::{B계정의 복사시킬 Bucket이름}/*"
]
}
]
}
2-2.AWS 공식문서 예시
{
"Version": "2012-10-17",
"Statement": \[
{
"Effect": "Allow",
"Action": \[
"s3:ListBucket",
"s3:GetObject"
\],
"Resource": \[
"arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/\*"
\]
},
{
"Effect": "Allow",
"Action": \[
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
\],
"Resource": \[
"arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/\*"
\]
}
\]
}
3. B계정의 사용자 설정 및 권한 설정
직접 정책 연결 선택 뒤 2번에서 생성한 권한을 연결해준다. 4번에서 곧 얘기할 AWS-CLI가 잘 접속됬는지 확인하고 싶다면 "AmazonS3FullAccess" 권한도 넣어주자.
4. 3번에서 생성해준 B계정의 사용자로 AWS-CLI 접속
aws configure
AWS ACCESS KEY ID : {파일로 내려받은 ACCESS KEY ID입력하기}
AWS Secret Access Key : {파일로 내려받은 SECRET ACCESS KEY 입력하기}
Default region name : ap-northeast-2
만약 amazons3FullAccess 권한이 부여된 상태라면 다음 명령어를 통해 B계정의 사용자로 잘 aws-cli 접속하였는지 확인하자.
aws s3 ls
B계정의 Bucket 이름이 출력되면 성공적이다.
5. Migration 명령 수행
aws s3 sync s3://{A계정 복사하려는 Bucket이름}/{기타 자신이 원하는 경로} s3://{B계정 복사시킬 Bucket이름}/{기타 자신이 원하는 경로}
Reference
https://interconnection.tistory.com/119
https://velog.io/@unihit/계정간-S3-데이터-이전-방법
https://repost.aws/ko/knowledge-center/copy-s3-objects-account