AWS DataSync — 온라인 데이터의 안전하고 효율적인 전송 및 마이그레이션 서비스

Saltware Co., ltd
Saltware
Published in
19 min readSep 22, 2023

온프레미스와 AWS 스토리지 서비스 사이에서 데이터 이동 자동화 및 가속화하는 안전한 온라인 서비스, AWS DataSync를 알아봅니다.

DataSync란 무엇인가?

AWS DataSync는 데이터 마이그레이션을 간소화하고 온프레미스 스토리지, 엣지 로케이션, 타 클라우드 공급자 및 AWS 스토리지 서비스 간에 파일 또는 객체 데이터를 빠르고 쉽고 안전하게 전송할 수 있도록 지원하는 온라인 데이터 이동 및 검색 서비스입니다.

Data Sync는 네트워크 파일 시스템(NFS) 파일서버, 서버 메시지 블록(SMB) 파일서버, Hadoop 분산 파일 시스템(HDFS), Amazon Simple Storage Service(S3), Amazon Elastic File System(Amazon EFS), Amazon FSx, Google Cloud Storage 등 다양한 서비스에서 동작합니다.

DataSync 작동 방식

첫 번째로는 온프레미스와 AWS 간 전송입니다.

온프레미스의 NFS, SMB 스토리지 서버와 Amazon EFS, AmazonS3, Amazon FSx등(이하 EFS, S3, FSx로 표기 단순화) 간의 데이터 전송이 가능합니다. 해당 방법을 통해 온프레미스 스토리지의 대용량 데이터를 AWS로 전송할 수 있습니다.

자체 관리형 온프레미스 스토리지 시스템 및 간의 파일 DataSync 전송에 대한 개괄적인 개요를 보여줍니다.
온프레미스와 AWS 간 전송 작동 방식

두 번째로는 AWS 스토리지 간 데이터 전송입니다.

스토리지 서비스에 존재하는 데이터들을 전송할 수 있습니다. 전송을 시작하면 DataSync는 Source 및 대상 스토리지 시스템을 검사하여 동기화할 항목을 결정합니다. 메타데이터를 스캔하여 두 시스템 간의 차이점을 식별함으로써 이를 수행합니다.

동일한 AWS 계정 파일 DataSync 전송에 대한 종합적 개요를 보여주는 다이어그램입니다.
AWS 스토리지 간 전송 작동 방식

에이전트는 온프레미스의 스토리지를 스캔하고 이를 Datasync Service로 전송합니다. 이후 Dest로 지정한 스토리지에 전송받은 데이터를 옮김으로써 데이터 마이그레이션이 이루어지며 DataSync로 업데이트되는 파일은 증분 됩니다.

DataSync의 다섯 가지 이점

DataSync의 다섯 가지 이점에 대해 소개합니다. 빠른 데이터 전송, 간편한 사용, 데이터 암호화 및 검증, 비용 효율적, 모니터링 및 로깅

빠른 데이터 전송 : 세분화된 제어 기능을 통해 최적화된 대역폭을 사용합니다. 전송 속도를 최대 10Gbps까지 절할 수 있습니다.

간편한 사용 : GUI 환경으로 누구나 손쉽게 사용이 가능합니다.

데이터 암호화 및 검증 : DataSync 에이전트와 서비스 간의 모든 데이터는 TLS 보안 전송을 사용하여 암호화됩니다. 또한 데이터 무결성을 보장하며, 검사를 통해 일관성을 검증할 수 있습니다.

비용 효율적 : 서비스에 의해 복사된 데이터에 대한 기가 바이트 단위의 고정 요금만 지불합니다. 다른 방식의 라이선스 구매 방식보다 TCO가 낮으며, 상용 전송 도구를 구매하는 것보다 비용이 낮습니다.

모니터링 및 로깅 : DataSync를 사용하면 기본적으로 CloudWatch에 에이전트 지표, 작업 지표를 확인 할 수 있습니다. 이를 통해 대략적인 모니터링이 가능하며, 생성 시 CloudWatch Log group에서 로그를 확인할 수 있습니다.

DataSync Agent

DataSync Agent는 Source 스토리지와 AWS 스토리지 간 데이터 전송을 위한 서버로 온프레미스 하이퍼바이저 또는 EC2 에이전트에서 시작할 수 있습니다.

DataSync Agent의 4가지 종류를 소개해 드립니다.

■ VMware ESXi

■ KVM

■ Microsoft Hyper-V

■ Amazon EC2

DataSync Agent를 EC2 인스턴스로 배포할 때는 최소 4GiB 이상을 보장해야 하며, 16GiB 사이즈의 타입을 권장합니다.

각 사용 환경의 권장 인스턴스 유형

  • 최대 2천만 개의 파일을 전송하는 작업 : m5.2xlarge 혹은 유사한 instance type
  • 2천만 개 이상의 파일을 전송하는 작업 : m5.4xlarge 혹은 유사한 instance type

AWS Snowcone 기기에서 실행 중일 시 이 권장 사항의 예외 2개의 CPU 코어와 4GiB의 메모리를 제공하는 snc1.medium 을 사용하는 것이 좋습니다.

SSH를 사용하여 EC2 에이전트에 연결하려면 다음 암호화 알고리즘을 사용합니다.

  • SSH 암호 : aes128-cr
  • 키 교환 : diffie-hellman-group14-sha1

Demo

NFS 서버(Source)의 데이터를 S3(Dest)로 마이그레이션하는 방법에 대한 데모입니다.

1. Amazon S3생성 (Dest 스토리지)

[S3] → [버킷] → [버킷 만들기] 선택하여 버킷을 생성합니다. 버킷은 S3 데이터를 담는 스토리지입니다.

Amazon S3 버킷을 생성합니다.

버킷의 이름은 고유해야 하며, 버킷설정은 default 설정으로 생성을 완료합니다.

2. NFS 서버 생성 (Source 서버)

Source로 사용할 NFS 서버를 생성합니다.

[EC2] → [인스턴스] → [인스턴스 시작]을 통해 인스턴스를 생성합니다.

NFS 서버 생성을 진행합니다.

OS는 AmazonLinux2로 생성합니다.

DataSync Agent에서 Source 서버로 접근을 위해서는 public IP가 필요합니다. 이를 위해 EC2에도 public IP를 할당해 줍니다.

네트워크 설정을 진행하며 Amazon EC2에 public IP를 할당합니다.

NFS 서버 활성화를 위해 보안그룹에 inbound 2049를 추가합니다.

또한 DataSync Agent와의 통신을 위한 TCP 443, 1024–1064에 대한 인바운드도 허용해야 합니다.

[고급 세부 정보]의 [사용자 데이터]에 아래 스크립트를 입력합니다.

#!/bin/bash
sudo yum update -y
sudo mkdir /share
sudo mkdir /share/tmp
sudo chmod -R 755 /share/tmp/
sudo chown nfsnobody:nfsnobody /share/tmp/
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server
sudo systemctl enable nfs-lock
sudo systemctl enable nfs-idmap
sudo systemctl start rpcbind
sudo systemctl start nfs-server
sudo systemctl start nfs-lock
sudo systemctl start nfs-idmap
sudo su -
sudo echo "/share/tmp * (rw,sync,no_root_squash,no_all_squash)" >> /etc/exports
sudo echo "/share/tmp *(rw,sync,no_root_squash,no_all_squash)" >> /etc/exports
sudo systemctl restart nfs-server
sudo exportfs
echo "8xnbw4pkoy9fznbwg1hv" >> /share/tmp/8xnbw4pkoy9fznbwg1hv.txt
echo "qum6rtl9j389fxa88c0v" >> /share/tmp/qum6rtl9j389fxa88c0v.txt
echo "n4jk5fixh0l7axg0ymes" >> /share/tmp/n4jk5fixh0l7axg0ymes.txt
echo "74buwwfa0dbofvnza496" >> /share/tmp/74buwwfa0dbofvnza496.txt
echo "in7ii71t65j7nc4qk1iq" >> /share/tmp/in7ii71t65j7nc4qk1iq.txt
echo "wvjvz3ac2mtujcnk6vk0" >> /share/tmp/wvjvz3ac2mtujcnk6vk0.txt
echo "0b7yh3dekidwmc6phka1" >> /share/tmp/0b7yh3dekidwmc6phka1.txt
echo "chgrmbd9e96adiwjv25w" >> /share/tmp/chgrmbd9e96adiwjv25w.txt
echo "kdowxgs4wrzsgiar9qtf" >> /share/tmp/kdowxgs4wrzsgiar9qtf.txt
echo "flt80cwl00avswzcex8a" >> /share/tmp/flt80cwl00avswzcex8a.txt
echo "fa9u9wetnhos8xq2jxa7" >> /share/tmp/fa9u9wetnhos8xq2jxa7.txt
echo "v0688e0tagpz4cchsug2" >> /share/tmp/v0688e0tagpz4cchsug2.txt
echo "engpgebvk3ds5rjcuzmc" >> /share/tmp/engpgebvk3ds5rjcuzmc.txt
echo "s2iybtjgc9gwyepg710f" >> /share/tmp/s2iybtjgc9gwyepg710f.txt
echo "ni9h7f3suz1dpbpqe48m" >> /share/tmp/ni9h7f3suz1dpbpqe48m.txt
echo "m6y1ha6gzt3jrgxdb4n7" >> /share/tmp/m6y1ha6gzt3jrgxdb4n7.txt
echo "j6u8eoif8rz5vrkcaion" >> /share/tmp/j6u8eoif8rz5vrkcaion.txt
echo "eoc06hogcvintqs7x547" >> /share/tmp/eoc06hogcvintqs7x547.txt
echo "gwblqbn6yllxvk155qrw" >> /share/tmp/gwblqbn6yllxvk155qrw.txt
echo "vuf1b1vyewd4iidbe5xc" >> /share/tmp/vuf1b1vyewd4iidbe5xc.txt
echo "gnj3j15lk1lk23jktnkbk" >> /share/tmp/2nj4l123klj5lkj4kl3.txt
상단 표기된 스크립트를 입력합니다.

3. DataSync Agent 생성

3–1. Agent 인스턴스 생성

[EC2] → [인스턴스 생성] → [애플리케이션 및 OS 이미지 — datasync 입력] → [커뮤니티 AMI]에서 해당 AMI를 선택합니다.

Amazon Machine Image(AMI) 선택 페이지입니다.

인스턴스 유형의 경우, 에이전트는 최소 4GiB, 권장 16GiB가 필요합니다. 최소 사이즈인 t3.medium으로 생성합니다.

Datasync Agent에도 NFS 서버와 통신을 위한 PublicIP가 필요하므로 Public IP를 할당해 줍니다.

통신을 위해서 HTTP 포트 80에 대한 인바운드 액세스를 허용합니다.

나머지 설정은 default로 두고 생성합니다.

3–2. 에이전트 등록

생성이 완료됐으면 DataSync에 에이전트를 등록해 줍니다.

[Data transfer] → [에이전트] → [에이전트 생성]을 선택합니다.

DataSync Agent 생성 및 배포를 진행합니다.

[에이전트 배포] → [하이퍼바이저 — Amazon EC2] → [정품 인증 키 — http://(앞서 생성한 에이전트의 public ip) 입력] → [키 가져오기]

정상적으로 에이전트의 키를 가져오면 아래와 같이 확인이 됩니다.

에이전트에서 정품 인증키를 성공적으로 검색 되었습니다.

이후 [에이전트 생성]을 통해 에이전트를 등록합니다.

4. 로케이션(위치) 생성

로케이션은 Source 서버의 위치, Dest 서버의 위치 등을 설정하며, 해당 데모에서는 Source 서버는 2번의 NFS 서버, Dest 서버는 1번의 S3로 설정합니다.

4–1. Source 로케이션 생성

[Data transfer] → [위치] → [위치 생성] 선택

위치 유형 — 네트워크 파일 시스템(NFS)

에이전트 — 3번의 에이전트

NFS 서버 → 2번 NFS서버의 Public IP

탑재 경로 — /share/tmp 순서대로 입력합니다.

[위치 생성]을 통해 생성을 완료합니다.

4–2. Dest 로케이션 생성

[Data transfer] → [위치] → [위치 생성] 선택

위치 유형 — Amazon S3

S3 버킷 — 1번의 버킷 선택

S3 Storage Class — 저장 타입에 따라 선택, 데모에서는 Standard로 생성

폴더 — 원하는 디렉터리 이름 지정, 데모에서는 /datasync로 생성

IAM 역할 — 자동 생성

IAM 역할의 경우에는 1번의 버킷에 다음과 같은 권한이 할당됩니다.

s3:GetBucketLocation

s3:ListBucket

s3:ListBucketMultipartUploads

s3:AbortMultipartUpload

s3:DeleteObject

s3:GetObject

s3:ListMultipartUploadParts

s3:PutObjectTagging

s3:GetObjectTagging

s3:PutObject

5. Task 생성

마이그레이션 작업을 위한 Task 생성

[Data transfer] → [태스크] → [태스크 생성]을 선택

[소스 위치 구성] → [기존 위치 선택] → [기존 위치 — 4–1의 로케이션 선택]

[대상 위치 구성] → [기존 위치 선택] → [기존 위치 — 4–2의 로케이션 선택]

[설정 구성]의 경우에는 원하는 대역폭, 일관성 확인, 데이터 이동 설정, 빈도 등을 설정합니다.

데모에서는 default 설정으로 진행하며 [태스크 로깅]에서 로그 그룹을 지정하여, 발생하는 로그를 확인할 수 있습니다.

모든 설정이 완료됐으면 [다음]을 선택하여 태스크를 생성합니다.

6. 마이그레이션

모든 설정이 완료됐으면 태스크를 통해 마이그레이션을 시작합니다.

[Data transfer] → [태스크] → [5번 태스크 체크] → [작업] → [시작] 을 선택하여 마이그레이션을 시작합니다.

진행 상황은 [Data transfer] → [기록]에서 확인 할 수 있으며, 만약 실패한 경우 실패 이유도 출력되므로 해당 에러를 보고 트러블 슈팅이 가능합니다.

해당 Task가 성공적으로 실행되면 다음과 같이 Dest의 경로로 마이그레이션이 완료됩니다.

데모 중 발생한 에러

DataSync를 사용하며 발생할 수 있는 에러 종류를 설명해드립니다. 다음내용이 문제를 해결하는데 도움이 되시길 바랍니다.

1. NFS 서버 에러

NFS 서버의 보안 그룹, 방화벽, NFS 설정이 잘못되어 있는 경우 발생할 수 있는 에러입니다.

에러 메시지는 아래와 비슷하며 NFS 서버의 보안그룹에 2049,443,1024–1064에 대한 인바운드 및 아웃바운드가 있는지 확인합니다. 만약 NFSv3를 사용한다면 111, 635에 대한 인바운드 및 아웃바운드도 허용하시길 바랍니다.

Task failed to access location loc-00aba390926b7c204: x40016: Failed to connect to an NFS server on host 1.1.1.1. Ensure that your DataSync agent has a route to your NFS server and can make a TCP connection to port 2049. Please also ensure that the NFS service is running and listening on port 2049. Additionally, if this is a NFSv3 mountpoint, you will also need to expose ports 111 and 635. After resolving any networking issues, retry your task.

2. Agent Memory 에러

DataSync 에이전트의 경우에는 최소 4GiB, 권장 16GiB의 메모리를 필요로 합니다. 만약 메모리가 4GiB보다 작은 nano, micro, small 사이즈를 지정한 경우에는 “cannot allocate memory” 에러를 확인할 수 있습니다.

이 경우에는 에이전트의 사이즈를 최소 medium으로 올리시길 바라며, 권장 사이즈인 m5.2xlarge 또는 m5.4xlarge 사이즈를 사용하시는 것을 권장 드립니다.

3. 에이전트 등록 시 발생하는 에러

2번의 에이전트 등록 단계에서 값을 입력 후 [키 가져오기]를 선택하는 경우 다음과 같이 에러 페이지가 출력될 수 있습니다.

이 경우에는 에이전트 주소 (http://에이전트 서버의 public IP)를 잘못 입력한 경우, 에이전트 인스턴스의 보안그룹에 http 80에 대한 방화벽, 보안그룹이 설정되어 있지 않은 경우, 에이전트 인스턴스의 데몬이 완전히 올라오지 않은 경우 발생할 수 있습니다. 에이전트 인스턴스의 보안그룹, 방화벽에 80이 허용되어 있는지 확인해 보시길 바랍니다.

4. 전송하려는 파일에 권한이 충족하지 않은 경우

Task가 정상적으로 실행이 되었으나, Dest 스토리지에 전송된 데이터가 없을 수 있습니다. 이는 Source 서버의 파일의 권한이 없는 경우 발생할 수 있습니다.

기본적으로 644인 경우에는 전송이 가능하며, other에 read 권한이 없는 경우에는 전송이 되지 않습니다.

---x------ 1 root      root         3 Aug  9 08:42 perm1.txt
---x--x--- 1 root root 3 Aug 9 08:42 perm2.txt
---x--x--x 1 root root 3 Aug 9 08:42 perm3.txt
--w------- 1 root root 3 Aug 9 08:42 perm4.txt
--w--w---- 1 root root 3 Aug 9 08:42 perm5.txt
--w--w--w- 1 root root 3 Aug 9 08:42 perm6.txt
-r-------- 1 root root 3 Aug 9 08:42 perm7.txt
-r--r----- 1 root root 3 Aug 9 08:42 perm8.txt
-r--r--r-- 1 root root 3 Aug 9 08:42 perm9.txt --> 해당 파일만 전송 성공
---------- 1 root root 3 Aug 9 08:42 perm10.txt

권한으로 인해 전송되지 않은 파일의 경우에는 CloudWatch Log group의 로그 스트림에서 확인 할 수 있습니다.

[ERROR] Failed to open source file /perm2.txt: Source location responded with: Permission denied

5. 탑재 경로가 잘못된 경우

Source 서버에 데이터가 존재하는 위치가 잘못된 경우에도 에러가 발생할 수 있습니다.

에러 메시지는 아래와 비슷하며 로케이션을 생성할 때 경로가 올바르게 설정되어 있는지 확인해 보시길 바랍니다.

Could not mount subdirectory /shar on host 1.1.1.1. Please verify that the subdirectory exists and is properly exported in /etc/exports

호출 API 목록

DataSync를 실행하며 발생한 CloudTrail을 통해 발생한 주요 API 목록입니다.

1. CreateAgent : 3–2번의 에이전트를 등록하는 경우 발생합니다.

2. CreateLocationNfs : NFS 유형의 로케이션을 생성하는 경우 발생합니다.

3. CreateLocationS3 : S3 유형의 로케이션 생성을 생성하는 경우 발생합니다.

4. CreateTask : 테스크를 생성하는 경우 발생합니다.

5. StartTaskExecution : 테스크를 실행하는 경우 발생합니다.

마무리

오늘은 DataSync에 대한 대략적인 사용 방법과 데모에 대해서 알아보았습니다. 다양한 환경 지원, CloudWatch를 통한 로깅 및 모니터링, 비교적 저렴한 전송 비용 (기가 당 $0.0125)을 가진 마이그레이션 솔루션입니다.

다양한 환경을 지원한다는 점에서 기존의 온프레미스 환경에서 AWS로 마이그레이션을 하는 경우에는 유용하게 사용할 수 있으며, 해당 서비스가 마이그레이션에 큰 도움이 되길 바랍니다.

감사합니다. 🙂

▸ 참조 ◂

■ AWS DataSync 공식 안내 페이지
https://aws.amazon.com/ko/datasync/

■ AWS DataSync 기능
https://aws.amazon.com/ko/datasync/features/

--

--