A 계정의 S3 버킷의 데이터를 B 계정의 S3 버킷으로 복사하는 시나리오이다.
# B 계정의 Role 의 신뢰관계
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAWSDataSync",
"Effect": "Allow",
"Principal": {
"Service": "datasync.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<B Account>"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:datasync:ap-northeast-2:<B Account>:*"
}
}
}
]
}
# B 계정의 Role 에서 사용할 Policy
{
"Statement": [
{
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": [
"<B Account>"
]
}
},
"Effect": "Allow",
"Resource": "*",
"Sid": "AWSDataSyncS3BucketPermissions"
},
{
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:GetObjectVersion",
"s3:GetObjectVersionTagging",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:PutObjectTagging"
],
"Condition": {
"StringEquals": {
"aws:ResourceAccount": [
"<B Account>"
]
}
},
"Effect": "Allow",
"Resource": "*",
"Sid": "AWSDataSyncS3ObjectPermissions"
}
],
"Version": "2012-10-17"
}
위 IAM Role 의 신뢰관계와 Policy 는 공식 문서에서 참고한 내용이며, Condition 과 같은 추가적인 조건은 없어도 무방하다.
# A 계정의 소스 버컷에 대한 Policy
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "DataSyncCreateS3LocationAndTaskAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<B Account>/<datasync-role>"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": [
"arn:aws:s3:::<A Account Bucket>",
"arn:aws:s3:::<A Account Bucket>/*"
]
},
{
"Sid": "DataSyncCreateS3Location",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<B Account>:role/<datasync-role>"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<A Account Bucket>"
}
]
}
A 계정의 버킷을 B 계정에 있는 Role 을 사용하여 데이터를 복사하기 위해서는 A 계정의 버킷 정책을 위와 같이 추가한다.
위와 같이 B 계정에서 S3 버킷은 선택하며, IAM 역할을 이전에 생성하였던 Role 을 선택한다.
그런데 A 계정에 있는 버킷의 정책에 추가를 하여도 콘솔에서는 Access denied 가 뜬다. 이 부분은 콘솔에서 작업할 수 없고 CLI 를 통해 사용해야 한다.
아래는 B 계정에서 진행하였으며 아래와 같은 결과를 낸다면 콘솔에서 Location 이 추가되는 것을 확인할 수 있다.
# 작성자는 CloudShell 을 통해 진행
[cloudshell-user@ip-10-130-2-107 ~]$ aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::<A Account Bucket> --subdirectory <선택사항> --s3-config '{"BucketAccessRoleArn":"arn:aws:iam::<B Account Role>:role/<datasync-role>"}'
{
"LocationArn": "arn:aws:datasync:ap-northeast-2:<B Account Role>:location/loc-abcdef01234567890"
}
작성자는 특정 Prefix 가 있어서 --subdirectory 옵션을 사용했지만, 필요가 없다면 생략하여도 무방하다.
Location 생성이 완료 되었다면, 위와 같이 테스크를 확인할 수 있다. 해당 태스크를 실행하여 S3 버킷의 데이터를 복사한다.
총 용량 8.23TiB 를 9시간 동안 모두 이관을 하였고, 네트워크 등 영향을 받지 않고 안정적으로 이관을 할 수 있었다.
좀 더 자세한 내용은 Datasync 의 기록에서 확인할 수 있다.
이전 IDC 에 있는 NAS 를 Datasync 를 통해 S3 로 복사를 하였는데, S3 간 버킷 복사는 더 간단하여 활용하기 좋을 것이다. 또한, 대용량의 데이터를 안정적으로 넘기기에 적합한 솔루션이라고 생각한다.