Search

AWS Aurora MySQL + S3 (SELECT INTO OUTFILE S3) 데이터 추출

카테고리
Dev-Ops
태그
AWS
MySQL
게시일
2024/06/28
수정일
2024/07/12 04:04
시리즈
AWS-Study
1 more property

TL; DR;

Aurora MySQL에서 특정 데이터를 추출하여 확인하는 방법을 찾아보니 mysqldump 말고 SELECT 해서 나온 데이터를 파일로 추출하는 방법을 선택함
Aurora MySQL 버전별로 세팅이 달랐는데, 이런 세팅들을 하나씩 찾아보며 S3에 파일을 덤프할 수 있음을 알아냄
이번 포스트에서는 Aurora MySQL (version 3) 에서 S3로 파일을 덤프하기 위한 방법에 대해 알아봄

1. Intro

Aurora MySQL에 특정 유저의 데이터를 추출하여 대고객 메시지를 보내야 하는 요구사항을 받아, 부랴부랴 DB 내에 있는 유저 데이터(Token 등)을 확인했습니다. EC2 Instance에서 mysql-client로 접속하여 데이터를 추출하는 것은 당연하게도 단순 SELECT를 했을 때 SSH 콘솔창이 너무 많이 올라가 추출하는데 어려움이 있었습니다. 이를 해결하기 위해 데이터를 파일로 받아보는 방법을 사용하고자 했지만, SELECT INTO OUTFILE 명령어가 권한 이슈로 실행이 되지 않더군요. 찾아보니 SELECT INTO OUTFILE S3라는 기능이 Aurora MySQL에서 지원한다는 걸 확인하고 이 방법을 사용해보려 이것저것 찾아보았습니다.
이번 포스트에서는 Aurora MySQL version 3에서 S3로 DB 데이터를 추출하는 방법에 대해 알아보려고 합니다.
먼저 Aurora MySQL은 다음과 같이 cluster 형태로 설정돼 있어서, 해당 포스트의 환경은 DB 클러스터 환경의 설정이 들어가는 점 참고 부탁드립니다.

2. Aurora MySQL 세팅

Aurora MySQL에서는 내부적으로 SELECT INTO OUTFILE S3 기능을 사용할 수 있습니다. 버전 3와 버전 2의 설정값과 명령어가약간의 차이가 있습니다. 이번 탭에서는 계정의 권한 설정 방법을 나타냅니다. 저는 버전 3이기 때문에 version 3 명령어로 설정하였습니다.

Aurora MySQL Amazon S3 - Privileges

mysql-client를 이용하여 MySQL로 접근하게 되면, S3로 데이터를 export할 수 있도록 privilege를 설정해줄 수 있습니다. 특정 계정에 권한을 부여하는 명령어는 다음과 같습니다.

Aurora MySQL - version 3

GRANT AWS_SELECT_S3_ACCESS TO 'USERNAME'@'DOMAIN-OR-IP-ADDRESS'
SQL
복사

Aurora MySQL - version 2

GRANT SELECT INTO S3 ON *.* TO 'USERNAME'@'DOMAIN-OR-IP-ADDRESS'
SQL
복사

IAM Role

Aurora MySQL 에서 S3로 데이터를 생성하고 저장하기 위해서는 당연하게도 권한이 필요합니다. Aurora MySQL 인스턴스에서 S3로 접근 권한을 부여하기 위해 IAM 설정을 하는 방법은 두 가지가 있지만, 세세한 부분도 작성하고 싶어 수동으로 IAM Role을 설정하는 방법을 나열해보겠습니다.
RDS에 부여할 권한이기 때문에 다음과 같이 AWS Service를 선택할 때 RDS로 선택합니다.
Add permissions에는 S3 권한을 추가합니다. 만약 특정 s3 bucket의 특정 directory에만 권한을 추가하고 싶다면, 수동으로 설정해주도록 합니다.
다음으로 이름을 지정해주고 Trust policy가 RDS에 잘 설정됐는지 확인하고 생성해주도록 합니다. 저는 Role 이름을 RDSAuroraS3Role 이라고 명명해주었습니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "rds.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }
JSON
복사
생성한 role을 RDS를 관리하는 Management Console에서 다음과 같이 선택하여 Add role을 눌러줍니다.
아래와 같이 RDSAuroraS3Role이 추가되고 Active 될 때까지 기다려줍니다.

3. Parameter groups 세팅

DB 클러스터 설정에서 Database Options를 보게 되면, Paramter Group은 기본 설정값으로 돼 있습니다. 하지만 이런 default 값은 수정이 불가능하여 별도의 옵션을 생성하여 설정값을 수정해주어야 합니다.

Create parameter group & Update

Parameter group을 다음과 같이 생성해주는데, 특히 Type은 DB Cluster Parameter Group을 선택하였습니다. ( RDS가 아니고 Cluster라서… )
생성이 완료됐으면, 이제 aws_default_s3_role 을 설정해주어야 합니다. 이 설정 값은 방금전 생성한 Parameter Group에서 설정이 가능합니다.
Aurora MySQL version 3 : aws_default_s3_role Aurora MySQL version 2 : aurora_select_into_s3_role
아래와 같이 aws_default_s3_role의 Value를 IAM Role의 ARN 값으로 넣어 설정해줍니다.
이후 Databases > [원하는 DB 클러스터 선택] > Modify를 선택 > Database options의 DB cluster parameter group을 수정 해줍니다.
즉시 반영을 하고자 하면 Apply immediately를 선택하여 반영해줍니다.

Cluster instance status

클러스터 내에 있는 Instance가 아직 DB cluster parameter group이 반영되지 않아, reboot 돼야 반영된다고 나타나면 리부트를 해주거나 DB parameter group을 생성하여 즉시 반영하게 되면 반영되게 됩니다.
Reboot의 경우 인스턴스가 여러 개일 경우에는 이슈가 없을 수 있으나, 해당 작업 때문에 재시작하는 것은 바람직하지 않을 것 같습니다. 때문에 DB paramter group을 별도로 생성하고 이를 반영하기 위해 수정(즉시 반영)하는 방법으로 인스턴스 Configuration을 수정해주는 방법을 채택하였습니다.

4. VPC endpoint

다음으로 Aurora MySQL에서 S3로 접근하기 위해서는 VPC endpoint 설정이 돼 있어야 합니다.

Create endpoint

s3 서비스를 선택하고, 원하는 이름을 설정해줍니다. 단, 이때 Type은 Gateway로 설정하고 적절한 라우팅 테이블을 연결해주도록 합니다. VPC endpoint가 잘 설정됐다면, Available 상태가 될 때까지 대기합니다.

5. SELECT INTO OUTFILE S3

위와 같이 세팅이 완료됐다면, 이제 MySQL 콘솔에서 SELECT 한 데이터를 추출해볼 수 있습니다.
SELECT user, host FROM mysql.user INTO OUTFILE S3 's3-ap-northeast-2://[BUCKET_NAME]/[BUCKET_PATH]'
SQL
복사

References