AWS Datasync S3 간 데이터 복사

신동수·2024년 10월 24일
0

AWS

목록 보기
25/26

개요

  • Account 가 분리된 환경에서 다른 계정에 데이터 복사가 필요하여 본 포스팅을 작성하였다. 본 포스팅을 읽기 전 이런 생각이 있을 것이다. AWS S3 CLI 를 통해 복사를 하는 것이 더 빠를 것이라고 생각할 것이다. AWS CLI 를 통해 복사도 가능하지만, 해당 데이터가 엄청 크다면 어떻게 진행할 것인가 고민을 하였다. 그래서 로컬이나 서버에서 AWS CLI 를 통해 진행하는 것보다, Datasync 를 활용하는 것을 생각하였다.

Architecture


A 계정의 S3 버킷의 데이터를 B 계정의 S3 버킷으로 복사하는 시나리오이다.

IAM Role & Policy

# 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 과 같은 추가적인 조건은 없어도 무방하다.

S3 Policy

# 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 계정의 버킷 정책을 위와 같이 추가한다.

Datasync

Location


위와 같이 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 옵션을 사용했지만, 필요가 없다면 생략하여도 무방하다.

Task


Location 생성이 완료 되었다면, 위와 같이 테스크를 확인할 수 있다. 해당 태스크를 실행하여 S3 버킷의 데이터를 복사한다.

결과


총 용량 8.23TiB 를 9시간 동안 모두 이관을 하였고, 네트워크 등 영향을 받지 않고 안정적으로 이관을 할 수 있었다.
좀 더 자세한 내용은 Datasync 의 기록에서 확인할 수 있다.

마무리

이전 IDC 에 있는 NAS 를 Datasync 를 통해 S3 로 복사를 하였는데, S3 간 버킷 복사는 더 간단하여 활용하기 좋을 것이다. 또한, 대용량의 데이터를 안정적으로 넘기기에 적합한 솔루션이라고 생각한다.

참고 : https://docs.aws.amazon.com/ko_kr/datasync/latest/userguide/tutorial_s3-s3-cross-account-transfer.html

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글