AWS Glue를 통해 on-prem 데이터베이스에서 Snowflake로 ETL 수행하기

Hyuna J
Snowflake Korea
Published in
7 min readDec 7, 2023

이번 시간에는 많이 사용하시는 AWS Glue 서비스를 통해 AWS 외부에 존재하는 on-prem 데이터베이스의 데이터를 Snowflake로 바로 로딩시켜주는 job을 생성하고 수행해보겠습니다.

(아래 과정은 glue에 적합한 IAM role이 이미 설정되어 있다는 전제 아래에 진행됩니다. 저는 glue_admin이라는 role에 작업에 필요한 policy들을 미리 맵핑해두었습니다.)
glue가 AWS 외부 리소스에 접근하기 위해서는 glue가 NAT를 바라보고 있는 private subnet에서 수행될 수 있도록 subnet 사전 생성 작업이 필요합니다. 이미 그런 private subnet을 가지고 있는 계정이라면 아래 부분은 생략해주셔도 됩니다.

VPC network 구성

손쉬운 VPC 기본 세팅을 위해 VPC wizard를 활용하겠습니다.
1. VPC 첫 화면에서 [Create VPC] 버튼을 클릭합니다.

해당 과정을 통해 VPC와 VPC에 연결된 Internet GW가 생성되었습니다.
Public subnet은 인터넷과 통신 가능하도록 외부 IP에 대해서는 Internet GW를 바라보는 Route Table이 맵핑되고 private subnet을 위한 NAT GW까지 생성되었습니다.
Private subnet은 NAT GW를 통해서만 인터넷과 통신 가능하도록 외부 IP에 대해서 NAT GW를 바라보도록 Route Table이 자동 생성, 맵핑되었습니다.

Glue 네트워크 설정

첫번째 단계로 Glue가 다른 구성요소들과 통신할 수 있도록 모든 TCP 포트에 대해 자체 참조 인바운드 규칙을 사용하여 보안 그룹을 지정합니다. 이 실습 과정에서는 이 보안 그룹을 Glue-security-group 이라고 합니다. 보안 그룹은 지정된 VPC/서브넷의 AWS Glue 탄력적 네트워크 인터페이스에 연결됩니다.

  1. VPC>Security>Security groups 메뉴로 접근해서 아래와 같은 정보를 입력한 뒤 [Create security group] 버튼을 누릅니다.

2. 생성된 security group 이름을 클릭 한 뒤 Inbound rules 탭에서 [Edit inbound rules] 버튼을 클릭합니다.
그리고 아래와 같이 내용을 입력합니다.
그 중 Source에는 생성된 security group의 이름을 입력합니다. 스스로를 참조하는 참조 인바운드 규칙을 생성해주어 VPC/서브넷 내 ENI 간의 자유로운 통신을 활성화하고 지정되지 않은 다른 소스로부터 들어오는 네트워크 액세스를 방지해주는 과정입니다.

Glue Connection 생성

두번째 단계로는 Glue에서 소스와 타겟 리소스들을 향한 connection을 설정합니다.
먼저 소스로 연결될 on-prem을 위한 연결을 진행합니다.

1. [Connections] 메뉴로 들어가서 [Create Connection]을 선택합니다.
Data Sources에서 JDBC를 선택하고 [Next] 버튼을 누릅니다.
- JDBC URL : on-prem 데이터베이스 환경에 맞도록 jdbc url을 적습니다.
- Username / Password : 데이터베이스 유저 네임과 비밀번호를 적습니다.
- VPC : 이 전에 생성한 VPC의 이름을 선택합니다.
- Subnet : 이 전에 생성한 private subnet의 이름을 선택합니다.
- Security groups : 전 단계에서 생성한 glue-security-group을 선택합니다.

2. Connection Properties에서 이 연결의 이름을 지정합니다.
Name : Jdbc connection
[Next] 버튼을 누릅니다.

3. review 후 [Create connection] 버튼을 클릭합니다.

이제 타겟으로 연결될 snowflake를 위한 연결을 진행합니다.

1. [Connections] 메뉴로 들어가서 Create Connection을 선택합니다.
Data Sources에서 Snowflake를 선택하고 Next 버튼을 누릅니다.
Snowflake URL : 여러분들의 snowflake 환경 URL을 입력합니다
유저 접속 정보를 입력하기 위해 AWS Secrets Manager를 클릭합니다.

2. [Store a new secret] 버튼을 클릭합니다.
[Other type of secret]을 클릭하고 아래와 같이 Snowflake 접속 정보를 적습니다.
[Next] 버튼을 클릭합니다.

3. Secret name에 snowflake라고 적고 [Next] 버튼을 클릭합니다.

4. [Next] 버튼을 한번 더 눌러 review 화면을 보고 [Store] 버튼을 클릭합니다.

5. 다시 작성하던 Connection 단계로 돌아옵니다.
AWS Secret 부분에서 방금 생성한 ‘snowflake’이 생긴 것을 확인할 수 있습니다. 이를 선택하고 Network options 버튼을 눌러 아래 정보를 업데이트 후 [Next] 버튼을 누릅니다.
- VPC : 이 전에 생성한 VPC의 이름을 선택합니다.
- Subnet : 이 전에 생성한 private subnet의 이름을 선택합니다.
- Security groups : 전 단계에서 생성한 glue-security-group을 선택합니다.

6. Connection Properties에서 이 연결의 이름을 지정합니다.
Name : Snowflake connection
[Next] 버튼을 누릅니다.

7. review 후 [Create connection] 버튼을 클릭합니다.

Glue Job 생성/실행

이제 드디어 이 모든 것들을 연결할 수 있게 되었습니다.
1. Glue 메뉴에서 ETL jobs > Visual ETL을 클릭하고 화면에서 [Visual ETL] 버튼을 클릭합니다.

2. Source > Oracle SQL을, Target > Snowflake를 선택합니다.

3. 화면에 생성된 Oracle 박스를 선택하여 아래 정보를 업데이트 합니다.

4. 오른쪽에 Data preview 버튼을 눌러 데이터가 잘 보이는지 확인합니다.

5. 화면에 생성된 Snowflake 박스를 선택하여 아래 정보를 업데이트 합니다

6. Job details에서 Glue에 적합하게 미리 생성해둔 IAM Role을 선택합니다.

7. 작업에 대한 이름을 적고 save 버튼을 클릭합니다.

8. 실제 작업을 수행해보겠습니다. Run 버튼을 클릭합니다.

9. Run 메뉴에서 수행되고 있는 job의 현황을 조회할 수 있습니다.

10. job이 성공적으로 끝났다고 확인이 되면 snowflake로 가서 실제 데이터가 잘 로딩되었는지를 확인해볼 수 있습니다.

--

--

Hyuna J
Snowflake Korea

Interested in working with DATA | Sales Engineer at Snowflake. Previously at AWS and Oracle