S3 데이터를 RDS(Aurora MySQL) 클러스터로 로드하기

회사 업무를 하다가 S3의 csv 데이터를 Aurora MySQL로 로드할 일이 생겼다.

이 과정이 생각보다 복잡해서 해당 내용을 글로써 정리해보려고 한다. 

 

인프라 세팅

  • S3 데이터를 RDS로 받기 위해서는 제일 먼저 VPC 등 클라우드 인프라 환경을 세팅해줘야 한다.

1. VPC 생성

1-2. vpc cidr 편집

2. 서브넷 생성(최소2개)

2-1. 첫 번째 서브넷

2-2. 두 번째 서브넷

3. 보안그룹 생성 후 VPC 연결

4.  S3버킷 만들고 가지고 있는 csv 파일 업로드하기

4-1. S3 버킷 생성하기

4-2. CSV 파일 업로드 

업로드 버튼 클릭 후, CSV 파일 선택, 저장

5. S3에 대한 액세스 권한 부여

  • Aurora MySQL이 S3와 데이터를 주고받으려면 S3 버킷에서 데이터를 로드하기 전에 Aurora MySQL DB 클러스터에서 S3에 액세스할 권한을 부여해야 한다.
  • 액세스 궈한을 부여하기 위해서 1) IAM 정책을 생성하고, 2) 생성된 IAM 정책을 새로운 IAM Role과 연결한다.

5-1. 해당 권한을 부여하기 위해 먼저 IAM 정책을 생성한다.

5-1-1. 4번에서 생성한 S3 버킷 선택

5-2. IAM 정책을 생성한 것을 IAM Role(역할)과 연결해야 한다. 

5-2-1. 이전에 생성한 정책 연결

5-2-2. 이름 입력 및 엔터티 확인 후 역할 생성

 

IAM Role이 생성되면 ARN 주소 복사해놓기 > 6-1번 과정에서 사용됨

6. RDS 파라미터 그룹 생성

RDS > Parameter groups > create parameter groups

  •  

6-1. 파라미터 그룹에서 4번에서 생성한 IAM Role을 부여한다. 

7. Aurora MySQL 생성

RDS > Databases > Create database

  • Aurora 생성시 Engine Options로 MySQL, PostgreSQL, MariaDB등을 선택할 수 있다.
  • Aurora MySQL의 경우
    • Serverless는 S3에서 데이터 Load가 불가능하다.
    • DB Cluster만 S3에서 데이터를 직접 Load 가능하다.

7-1. 6번에서 생성한 DB 클러스터 이름을 DB 클러스터 식별자에 입력한다. 

7-2. 인스턴스 구성하기

  • 데이터의 크기에 맞게 인스턴스 크기를 정하면 된다.

7-3. 1번에서 생성한 VPC 연결, 3번에서 생성한 보안그룹 선택

7-4. 모니터링 활성화

7-5 추가구성

  • DB 클러스터 파라미터 그룹에 6번에서 생성한 DB 클러스터 그룹을 선택한다. 

데이터 로드하기 

1. 로컬 cmd 또는 EC2에서 MySQL 실행

$ sudo systemctl start mysql

2. MySQL 접속

mysql -h [RDS 엔드포인트] -P 3306 -u [유저이름] -p
# ex) mysql -h zldb-instance-1.cvsgfdfg.us-east-1.rds.amazonaws.com -P 3306 -u admin -p

3. Amazon Aurora MySQL에서 데이터 로드 권한 부여

  • "LOAD DATA FROM S3" 또는 "LOAD XML FROM S3" 문을 사용하여 S3 버킷에 저장된 파일에서 데이터를 로드할 수 있다.
  • "LOAD DATA FROM S3" 또는 "LOAD XML FROM S3" 문을 실행하는 데이터베이스 사용자에게는 둘 중 한 명령문을 실행할 수 있도록 특별한 역할이나 권한이 부여되어야 한다. 

3-1. 새로운 유저 생성

CREATE USER 'testsaveload'@'%' IDENTIFIED BY 'somepassword';
show grants for 'testsaveload'@'%';

3-2. 데이터 로드 권한 부여

GRANT AWS_SELECT_S3_ACCESS TO 'testsaveload'@'%'
GRANT AWS_LOAD_S3_ACCESS TO 'testsaveload'@'%';

4. LOAD DATA를 사용해 S3에 있는 CSV 파일을 가지고 온다. 

LOAD DATA FROM S3 's3 엔드포인트' INTO TABLE 테이블이름
FIELDS TERMINATED BY ',' (csv는 각 로우별 데이터 구분자가 쉼표이므로 쉼표 작성)
LINES TERMINATED BY '\r\n' (MySQL은 개행처리를 '\r\n' 으로함)

#######################################
ex) 
LOAD DATA FROM S3 's3-us-east-1://test-bucket/test.csv'INTO TABLE temperature
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'

사실 데이터를 로드할 때 트러블 슈팅이 좀 있었는데 그것을 한번 공유해보자면

1. 필자는 Aurora MySQL이라 당연히 MySQL Workbench에서도 LOAD DATA FROM S3 명령어가 실행이 될 줄 알았다.

2. 허나 LOAD DATA FROM S3 명령어를 사용하면 다음과 같이 S3 부분에 빨간줄이 쳐지면서 명령어가 실행이 되지 않았다.

3. 그 이유는 LOAD DATA는 MySQL 기본 문법은 맞다. Aurora에서 S3와 Aurora 데이터를 쉽게 연동시킬 수 있게 LOAD DATA FROM S3라는 오로라 확장 문법을 만들었다.

4. 따라서 MySQL Workbench에서는 SQL 문법이 아니고, Aurora 확장 문법인 LOAD DATA FROM S3를 사용할 수 없다.