클라우드에서의 새로운 경험: ACM내용 과 DataSync를 활용한 데이터 이전

안녕하세요, 오랜만에 인사드립니다!
최근에는 SAP 공부에 집중하며 한동안 글을 올리지 못했는데요, 이 기간 동안 많은 것을 배우고 성장할 수 있었습니다(현제도 진행 중입니다.)
오늘은 새로운 지식을 쌓는 과정에서 또 다른 도전을 맞이했던 경험, 바로 AWS 클라우드 환경에서 ACM(AWS Certificate Manager) 경험과 DataSync를 활용하여 데이터를 이전하는 프로젝트에 대해 이야기해 보고자 합니다.

ACM

기존 A 계정에서 B 계정으로 데이터를 이전하는 과정에서 ACM을 새롭게 생성하였습니다. 그러나 Route 53을 통해 도메인 이전을 완료한 후 ACM 인증을 요청했음에도 불구하고, 1시간이 지나도록 인증이 완료되지 않는 문제에 직면했습니다.

#해결 과정

먼저 서버에 있는 NS를 확인하였습니다.

확인 후 실제 Route53에 있는 NS 값과 다르다는 것을 알게 되었습니다.

도메인의 이름 서버(NS) 값을 Route 53에 등록된 NS 값과 일치하도록 변경해주었습니다.

이 조치 이후 ACM 인증이 정상적으로 완료되었으며, 발행되는데 약 2시간이 소요되었습니다.

DataSync

A 계정에 있는 버킷의 데이터를 B 계정으로 복사해야 했습니다. 본래는 리플리케이션 기능을 활용하려 했으나, 이 과정이 정상적으로 진행되지 않았습니다. 그래서 DataSync를 이용해 데이터를 이전하기로 결정했습니다.

#복사 과정

먼저 DataSync A에 대한 IAM 역할 생성 합니다.

  • 계정 B에서 S3 버킷에 대한 쓰기DataSync 권한을 부여하는 IAM 역할이 필요합니다.
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
                "s3:PutObject",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionTagging",
                "s3:PutObjectTagging",
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetObjectAcl",
                "s3:GetObjectTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:GetReplicationConfiguration",
                "s3:ListBucket",
                "s3:GetObjectRetention",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::account-b-bucket"
    },
    {
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObject",
        "s3:GetObjectTagging",
        "s3:PutObjectTagging"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::account-b-bucket/*"
    }
  ]
}

추가로 신뢰 관계는 아래와 같습니다.

다음으로 계정 B에서 S3 버킷의 ACL을 비활성화합니다

  • 비활성화 안 하면 소스 버킷의 권한이 들어와서 이미지를 다운로드할 때, 권한이 없다고 나옵니다.

(이부분에대하여 트러블슈팅 추가내용 있습니다.)

다음으로 계정 B에서 S3 버킷 정책 업데이트 합니다.

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "DataSyncCreateS3LocationAndTaskAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-a-id:role/name-of-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:::account-b-bucket",
        "arn:aws:s3:::account-b-bucket/*"
      ]
    },
    {
      "Sid": "DataSyncCreateS3Location",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-a-id:role/name-of-your-role"
      },
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::account-b-bucket"
    }
  ]
}

다음으로 S3 버킷의DataSync 대상 위치 생성 합니다.

  • S3 버킷의 위치를 생성한 후DataSync 작업을 실행할 수 있습니다. 하지만DataSync 콘솔에서는 다른 계정에서 위치를 만들 수 없습니다. 작업을 실행하려면AWS CLI를 먼저 사용하여 위치를 만들어야 합니다.
  • CLI를 사용하여DataSync 위치를 만들려면 우선 터미널을 엽니다.
  • CLI 프로필이 계정 A를 사용하도록 구성되어 있는지 확인 필요합니다.

리눅스

aws datasync create-location-s3 \
  --s3-bucket-arn arn:aws:s3:::account-b-bucket \
  --s3-config '{"BucketAccessRoleArn":"arn:aws:iam::account-a-id:role/name-of-datasync-role"}'

윈도우

aws datasync create-location-s3 --s3-bucket-arn arn:aws:s3:::account-b-bucket --s3-config "{\"BucketAccessRoleArn\":\"arn:aws:iam::account-a-id:role/name-of-datasync-role\"}" --region ap-northeast-2

성공 화면은 아래와 같습니다.

다음으로 AWS 관리 콘솔에서 계정 A로 다시 전환 후 DataSync 콘솔 -> 왼쪽 탐색 메뉴에서 ‘위치’를 선택 -> CLI를 통해 방금 생성한 계정 B의 S3 버킷 위치를 확인

다음으로 DataSync 태스크 생성 및 시작 하며 순서는 아래와 같습니다.

  • 테스크 생성

1.

2.

3. 모든 데이터 옮길지 설정하며, 클라우트워치 로그를 선택

4. 완료 후 위치가 하나 더 생긴거 확인

트러블 슈팅

(1)

  • 대상 위치 작업 시 아래와 같은 Error 확인

An error occurred (InvalidRequestException) when calling the CreateLocationS3 operation: DataSync bucket access test failed: could not perform s3:HeadBucket on bucket h..-wp-bucket. Access denied. Ensure bucket access role has s3:ListBucket permission.

  • 대상 버킷을 퍼블릭으로 설정 후 해결 하였습니다.

(2)

  • 이전 후 이미지가 권한이 없다면서 다운로드가 안됨을 확인
  • 아래 부분들을 다시 원복 하였습니다. (차단 활성화 및 ALC 사용 안 함으로 원복)
  • 원복이 안되면 ACL(액세스 제어 목록)에 추가로 설정된 것이 있는지 보고 그 부분을 체크 풀어줍니다.

3. 이미지 다운로드 시 정상적으로 다운로드 확인

이번 포스팅이 여러분에게 유용한 정보를 제공했기를 바랍니다
감사합니다 🙂

참고링크
https://btcd.tistory.com/1699
https://repost.aws/questions/QUPD3ZX7p3T3OQkk19QN-iEw/datasync-between-s3-buckets-failing-ensure-bucket-access-role-has-s3-listbucket-permission
https://docs.aws.amazon.com/datasync/latest/userguide/tutorial_s3-s3-cross-account-transfer.html#s3-s3-cross-account-required-permissions-dest-account

위로 스크롤