AWS의 managed 서비스인 glue를 이용해 데이터 ETL을 해보는 실습을 진행해보겠습니다.
0. 아키텍처
*버지니아 북부(us-east-1)을 기준으로 진행합니다.
1. Glue와 Redshift
1) Glue
aws glue는 완전 관리형 ETL 작업의 자동화를 제공하며, pyspark 기반의 대규모 데이터 처리에 적합한 서비스입니다.
*ETL(Extract, Transform, Load)의 약자로 데이터를 추출하고 변환한 뒤 로드하는 작업을 의미합니다.
Glue의 대표 리소스인 Crawler와 Data Catalog
2) RedShift
Redshift는 AWS에서 제공하는 완전 관리형 데이터 웨어하우스 서비스로, 대규모 데이터를 빠르게 분석할 수 있습니다. 여러 소스의 데이터를 통합하고 대량의 데이터를 빠르게 쿼리할 수 있는 기능을 제공합니다.
2. VPC 생성
1) VPC 생성
먼저 VPC를 생성합니다.
aws 콘솔 VPC > VPC 생성 > VPC 등
10번 대역폭을 사용 중이신 분들은 172, 192번으로 바꾸셔도 무방합니다.
퍼블릭 서브넷이 필요하므로 가용 영역은 최소로 1개만 지정합니다. NAT 게이트웨이도 이번 실습에는 필요없습니다.
이렇게 지정한 뒤 VPC 생성을 누릅니다.
2) 엔드포인트 생성
VPC 콘솔에서 엔드포인트를 클릭해서 엔드포인트를 생성합니다.
이름은 저는 "glue-test1-s3", 서비스 범주는 "AWS 서비스", 그리고 서비스에 s3를 검색해 "gateway 유형"의 s3를 선택해 줍니다.
아래로 내려 VPC는 생성해준 glue-test1-vpc를 선택합니다. 그리고 라우팅 테이블은 생성한 Public, Private 라우팅 테이블을 선택합니다.
그리고 엔드포인트 생성을 클릭합니다.
그리고 VPC로 돌아가서 glue-test1-vpc에서 리소스 맵을 보시면 네트워크 연결 부분에 glue-test1-s3가 생성된 것을 확인할 수 있습니다.
3) 보안그룹 생성
이제 보안그룹을 생성하러 갑니다.
이름은 "glue-test1-sg", 설명은 동일하게 넣어줍니다. 그리고 VPC는 glue-test1-vpc를 선택합니다.
인바운드 규칙 편집을 눌러 유형 "모든 트래픽", 소스 "Anywhere-IPv4"를 선택합니다.
실습이니 모두 허용으로 하겠습니다.
3. S3 생성
이제 S3를 만들어 줍니다.
이름은 자신만의 이름으로 하시면 됩니다. 그리고 쭉 내려서 버킷 생성을 클릭합니다.
이제 버킷 안에 폴더를 만들어 줍니다.
사진 속 생성된 버킷에서 "폴더 만들기"를 클릭합니다.
폴더 이름은 "input-data"로 합니다. 그리고 다른 설정은 놔두고 폴더 생성을 클릭합니다.
이제 생성한 폴더로 들어가 아래의 파일을 다운 받아 업로드 해주면 됩니다.
다운 받고 업로드 버튼을 클릭해서 올리시면 됩니다.
이런 내용의 파일입니다. 여기서 주의 하실 것이 있습니다. 원본 파일엔 컬럼 이름에 띄어쓰기가 있는데 "Type"이 DB의 예약어이기 때문에 나중에 에러가 발생합니다. 그래서 띄어쓰기 대신 "_" 언더바를 넣어주면 문제가 해결됩니다. 위의 파일은 사진처럼 전부 수정했기 때문에 문제 없이 작동하므로 따로 수정해주실 필요는 없습니다.
그래도 원본 링크는 따로 남기겠습니다. 가급적이면 위의 파일을 다운 받아서 사용하시는걸 추천드립니다.
이제 S3에 필요한 파일도 업로드 했습니다. Redshift를 만들겠습니다.
4. Redshift 클러스터 생성
Redshift를 생성할 건데 serverless가 아닌 일반으로 만들겁니다.
사진을 잘 보고 클러스터 생성을 눌러주세요.
클러스터 식별자는 이름인데 그냥 기본 설정으로 놔두겠습니다. 변경하고 싶으시면 변경하셔도 됩니다.
클러스터 크기 선택은 "직접 선택"으로 지정하시고, 저는 실습이니 가장 작은 용량인 "dc2.large"를 선택했습니다. 노드 수는 2 -> 1로 줄였습니다.
이 부분이 조금 중요한데 관리자 사용자 이름과 관리자 사용자 암호는 잊어버리시면 안됩니다. "Password123!"으로 지정했지만 그대로 하셔도 되고 변경하셔도 되는데 잊어버리지 않으셔야 합니다.
key type은 "AWS managed key"로 지정합니다.(필수 선택입니다)
클러스터 권한이란 클러스터가 어떤 AWS 서비스에 접근할 수 있는지 권한을 지정해주는 겁니다. IAM 역할 연결을 누르고 AWSServiceRoleForRedshift를 선택합니다.
아래로 내려 네트워크 및 보안을 엽니다.
vpc는 glue-test1-vpc를 선택하고 보안그룹은 기본 보안 그룹이 아닌 glue-test1-sg으로 선택합니다. 그리고 클러스터 서브넷 그룹이 없을텐데 "새 서브넷 그룹 생성"을 누릅니다.
이름은 그냥 기본 값으로 놔두겠습니다. VPC는 glue-test-vpc를 선택합니다. 그리고 "이 VPC의 서브넷 모두 추가"를 클릭하면 서브넷 2개가 선택됩니다.
클러스터 서브넷 그룹 생성을 누릅니다. 새로운 창으로 변경되지 않으니 한 번만 누르면 됩니다. 2번 누르면 2번 생성됩니다.
다시 네트워크 및 보안으로 돌아옵니다.
새로고침을 눌러서 방금 생성한 클러스터 서브넷 그룹을 선택하고 아래에 있는 퍼블릭 액세스 가능 켜기를 누릅니다.
탄력적 IP 주소 부분은 "없음"으로 하시면 됩니다.
마지막 데이터베이스 구성에서 데이터베이스 이름을 "glue-dev"로 지정합니다. 포트는 기본 포트로 놔둡니다. (이미 사용하신다면 숫자를 변경해주세요)
이제 아래로 내려 "클러스터 생성"을 누르면 됩니다. 완료까지 몇 분 걸리니 편하게 기다려줍시다.
5. IAM 역할 생성
이제 새로운 탭을 생성하시고 콘솔에서 IAM으로 들어갑니다.
액세스 관리 > 역할 > 역할 생성을 클릭합니다.
AWS 서비스를 선택하고 사용 사례에 Glue를 입력해 사진처럼 선택해줍니다.
AmazonS3FullAccess, AWSGlueServiceRole, AmazonRedshiftFullAccess를 각각 검색해 위 사진처럼 선택합니다.
다음을 클릭합니다.
이름은 Glue-IAM-Role-test으로 합니다. 다른 이름으로 하셔도 무방합니다.
방금 선택한 3가지 정책이 있어야 합니다.
태그는 선택사항입니다. 하셔도 되고 안하셔도 문제 없습니다.
이제 역할 생성을 누릅니다.
6. 데이터베이스 연결 확인
콘솔에서 Amazon Redshift > 쿼리 편집기 v2 > 새로운 창으로 이동
접속하면 생성한 클러스터랑 자동으로 연결될텐데, 만일 연결되지 않는다면 connection을 누르고 아래 사진처럼 입력하면 됩니다.
임시 자격 증명을 선택하고 클러스터 만들때 사용한 이름인 glue-dev, awsuser를 입력합니다.
처음 접속하면 사진처럼 나올겁니다. redshift-cluster-1은 클러스터이고요 glue-dev는 데이터베이스 이름, public은 스키마 입니다. 스키마 아래에 테이블이 있습니다.
위 사진처럼 된다면 데이터베이스 연결 확인이 잘 되었습니다.
7. Glue Connectors 생성
connector를 생성해주어야 합니다. 사진을 잘 확인하시고 Data catalog > Connections를 클릭하셔서 들어오시고 아래에 있는 Connections 부분에서 Create connection을 클릭해주세요.
이렇게 아이콘들이 나올 겁니다. Amazon Redshift를 선택하고 다음을 누릅니다.
이제 생성했던 redshift 클러스터를 선택하고 Password에 클러스터 데이터베이스 입력란에 적었던 패스워드를 입력합니다.
이름은 "Redshift connection-test1"으로 하겠습니다. 다른 이름으로 하셔도 무방합니다.
다음 단계는 그냥 넘기시고 create를 누릅니다.
Connections가 잘 생성되었으면 Test connection 한 번 눌러줍니다.
IAM role은 이전에 생성했던 것으로 선택하고 confirm 클릭
이러면 redshift와의 연결이 성공적으로 되었습니다.
8. Crawlers 생성
이제 크롤러를 생성해줄 차례입니다. Glue에서 크롤러란 S3 같은 저장소에 있는 데이터를 "긁어와서" Glue의 Database에 저장합니다. 그래서 이름이 크롤러입니다.
create creawler를 클릭합니다.
이름은 S3-glue-crawler-test로 합니다. 다른 이름으로 하셔도 됩니다.
아직 Glue tables이 없으니 Not yet을 선택하고 아래 Add a data source를 클릭합니다.
저희가 가져올 데이터는 S3에 저장했으니 data source는 s3로 지정하고 클러스터와의 연결을 network connection으로 설정합니다. 그리고 s3 path에서 input-data 아래에 있는 sales-records.csv를 선택합니다.
다음 단계로 넘어갑니다.
next 클릭
target database는 필수입니다. 왜냐하면 S3에서 데이터를 긁어온 뒤 저장할 장소가 필요하거든요. 여기서 target database는 저장할 장소를 의미합니다.
"Add database"를 클릭합니다.
이름은 s3-data로 합니다. s3에서 긁어온 데이터가 저장된다는 뜻입니다.
create database를 누르면 이제 target database가 생성되고 다시 크롤러 생성 탭으로 돌아갑니다.
새로고침 누르면 s3-data를 선택할 수 있습니다. 그리고 아래에 Crawler schedule 부분에 on demand로 지정합니다. 왜냐하면 원할때만 크롤링 해야하기 때문에 예약을 걸어놓으면 곤란합니다.
이제 크롤러가 생성되었는데 선택을 누르고 Run을 눌러줍니다.
Run을 누르면 Status가 Running으로 변경되는데 조금 시간이 걸립니다. S3에 있는 데이터 기준으로 글 작성하면서 실습을 같이하는 중인데 3분 정도 걸립니다.
이제 완료되면 Stopping으로 변경되고 맨 오른쪽에 있는 Table changes form last run이 1 created가 되면 성공입니다.
하나의 테이블을 복사했다는 뜻입니다.
Data catalog > Tables를 클릭하면 sales_recoreds_csv가 들어 있어야 합니다.
중요)
클릭하고 아래 Schema를 보면 다음과 같이 Data type이 나오게 되는데 여기가 중요합니다.
왜냐하면 사진 속에서 보이는 Data type을 기준으로 후에 Redshift에 옮길 데이터 타입과 동일하게 맞춰주어야 하기 때문입니다.
자, 이제 크롤러를 통해 S3 -> Glue Database로 데이터 이동이 끝났습니다. 다시 Redshift로 돌아가서 테이블을 생성해 줄 겁니다.
9. Redshift에 table 생성
하는 이유)
glue를 이용해 데이터 ETL을 하려면 Redshift에도 같은 메타데이터를 가진 테이블이 존재해야 합니다.
내용은 없어도 스키마는 같아야 한다는 뜻입니다. 그래서 Redshift의 데이터베이스에 테이블을 생성해 줄 겁니다.
CREATE TABLE public.sales_data (
region VARCHAR(255),
country VARCHAR(255),
item_type VARCHAR(255),
sales_channel VARCHAR(255),
order_priority VARCHAR(255),
order_date VARCHAR(255),
order_id BIGINT,
ship_date VARCHAR(255),
units_sold BIGINT,
unit_price DOUBLE PRECISION,
unit_cost DOUBLE PRECISION,
total_revenue DOUBLE PRECISION,
total_cost DOUBLE PRECISION,
total_profit DOUBLE PRECISION
);
data type이 String이지만 redshift에선 VARCHAR로 하는 것이 좋습니다.
새로고침 버튼 눌러서 Tables에 sales_data가 생성되었는지 확인합니다.
10. Glue ETL > Visual ETL
이제 다시 Glue로 돌아갑니다.
사진 속 노란 버튼을 클릭합니다.
Add nodes > Sources > Amazon S3 선택
생성된 Amazon S3 노드를 클릭하시고, 오른쪽 properties 부분에서 S3 source type은 S3 location으로 지정하고 S3 URL을 Browse S3를 눌러서 s3://glue-test1-240924/input-data/sales-records.csv로 지정합니다.
그리고 Data format은 CSV로 선택해 줍니다.
S3 노드 아래에 있는 Data preview 부분에 IAM role은 Glye-IAM-Role-test를 선택하고 노란색 "Start session"을 눌러줍니다
(이 부분을 안하면 권한이 없어서 job Save가 되지 않습니다)
다시 Add nodes를 누르고 Target에서 Amazon Redshift를 선택
Redshift 노드를 클릭하면 화면 같이 나오게 되는데 오른쪽 properties 부분을 수정해 주어야 합니다.
Node parents는 Amazon S3를 선택하면 두 노드가 연결됩니다.
그리고 Redshift access type은 recommended를 선택하고 Redshift connection은 connection-test1을 선택, Schema는 public, Table은 방금 만들었던 sales_data 테이블을 선택합니다.
이제 위에 있는 Job details를 클릭해서 이름을 s3-glue-redshift, Glue version은 가장 최신 선택하시면 됩니다. 저는 4.0으로 했습니다.
그리고 오른쪽 위에 있는 Save를 누르고 Successfully updated job이 되는지 확인합니다.
만일 이 부분이 안된다면, IAM Role을 설정하지 않아서 그런겁니다. Glue-IAM-Role-test를 설정해줍시다.
Save 버튼 옆에 있는 주황색 Run을 클릭합니다.
그 다음 "Runs" 항목으로 들어가면 실행 중인 log를 볼 수 있습니다.
새로고침 하면서 좀 기다리면 Succeeded로 변경되었습니다.
11. 데이터 전송 확인
이제 다시 redshift의 에디터 창으로 돌아갑니다.
SELECT * FROM public.sales_data LIMIT 10;
위의 명령어를 SQL 에디터에 넣고 실행한 후 아래 사진처럼 CSV 파일의 내용이 출력되면 성공입니다.
지금까지 Glue를 이용해 S3에 적재된 데이터를 Redshift로 옮기는 과정을 실습했습니다.
Glue에는 visual ETL 기능을 이용해 서로 스키마의 데이터 타입이 달라도 data type을 변경해서 보내줄 수도 있지만 실습이기에 그냥 테이블의 스키마를 통일해주었습니다.
이제 사용한 리소스를 제거하시면 됩니다.
*SKT 데보션 오픈랩 2기에서 학습한 내용을 정리하여 포스팅하였습니다
'[Cloud] > [AWS]' 카테고리의 다른 글
[AWS] ECS(EC2, Fargate), Cloudformation을 이용한 웹 APP 배포 (1) | 2024.09.08 |
---|---|
[AWS] iam instance profile 확인 명령어 (0) | 2024.09.08 |
[AWS] SNS와 Cloudwatch를 이용한 모니터링과 오토스케일링 (0) | 2024.09.07 |
[AWS] 서버리스 3-tier 어플리케이션 (1) | 2024.09.04 |
[AWS] ALB를 이용한 EC2 부하 분산 (0) | 2024.09.04 |