안녕하세요, 오랜만에 인사드립니다!
최근에는 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. 이미지 다운로드 시 정상적으로 다운로드 확인

이번 포스팅이 여러분에게 유용한 정보를 제공했기를 바랍니다
감사합니다 🙂
[ivory-search id=”988″ title=”Default Search Form”]