회사 업무를 하다가 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를 사용할 수 없다.
'Cloud&Infra > AWS' 카테고리의 다른 글
AWS SageMaker Neo와 AWS IoT Greengrass V2를 활용한 라즈베리파이 ML 모델 배포 가이드 (1) | 2024.10.27 |
---|---|
Amazon Cognito 자격 증명 풀로 S3 파일 접근하기 (1) | 2024.03.13 |
AWS QLDB와 Node.js 연결: 단계별 실습 (1) | 2023.05.14 |
AWS QLDB: 무엇이고 왜 필요한가?(블록체인과의 차이점) (1) | 2023.05.13 |
AWS Command Line Interface(CLI) 기본개념 및 설치방법 (1) | 2023.05.11 |