Incremental Batch Transfer from AWS RDS to BigQuery
1. Architecture
아래의 그림처럼 먼저 RDS에서 S3로 staging files 을 떨군뒤 -> BigQuery 로 가져오는 형태입니다.
RDS -> S3: AWS Data Pipeline 을 사용하며, 만약 Redshift 사용시 S3거치지 않고 넣을수도 있습니다.
2. AWS Data Pipeline
2.1 IAM Permission for Users or Groups
User 또는 Groups 에 다음의 권한이 있어야지 Data Pipeline 개발이 가능 합니다.
AWSDataPipeline_FullAccess
2.2 IAM Roles for Data Pipeline
Data Pipeline Role 은 다음 2가지가 필요 합니다.
- Data Pipeline Role 생성
- IAM -> Role -> Create Role
- Data Pipeline 선택 -> Data Pipeline 선택
- Name:
DataPipelineRole
- EC2 Role for Data Pipeline 생성
- IAM -> Role -> Create Role
- EC2 Role for Data Pipeline 선택
- Name:
DataPipelineForEC2Role
2.3 Data Pipeline
AWS Data Pipeline -> Create Pipeline 선택 합니다.
- Basic Information
- Name: RDS to S3 Daily
- Build using a template:
Incremental copy of RDS MySQL Table to S3
- Parameters
- Last modified column name:
created_at
- RDS MySQL password:
RDS 패스워드
- RDS MySQL table name: 가져오려는
테이블 이름
- Output S3 folder:
S3 저장 위치
- RDS MySQL username:
RDS Username
- EC2 instance type: transfer가 시작할때 사용하는
EC2 Instance
- RDS Instance ID: RDS에서
DB identifier
사용하면 됨
- Last modified column name:
- Security/Access
- IAM Roles에서 생성한 default Roles 두개를 선택합니다.
DataPipelineRole
그리고DataPipelineForEC2Role
선택
2.4 Add more Tables
현재 테이블 1개를 S3로 가져오는 것을 설정했습니다.
하지만 대부분의 케이스는 여러개의 테이블을 가져오는 것 입니다.
테이블을 더 추가하기 위해서 Edit Pipeline
을 선택합니다.
Add -> SQLDataNode 추가
합니다.
RDS에서 가져오는 것이기 때문에 SQLDataNode를 선택하는 것 입니다.
새로 생성된 DefaultSqlDataNode1은 Schedule (Every 1 hour) 노드 아래에 생성이 됩니다.
수정할 부분은, RDS에 접속한뒤 테이블 데이터를 가져와야 하기 때문에 RdsDatabase 아래에 새로 생성한 노드를 놔야 합니다.
그래프 상에서 마우스 드래그로는 수정이 안되고..
- DefaultSQLDataNode1 노드를 선택
Add an optional field
버튼을 클릭Database
추가- Database 옵션에서
rds_mysql
선택
- Name: Table2 로 변경합니다.
Add an optional field
->Select Query
추가SourceRDSTable 의 Select Query 부분을 복사
해서Table2의 Select Query에 붙여넣기
합니다.- 옵션으로
{myRDSTableLastModifiedCol}
부분이 현재 created_at
select * from #{table}
where #{myRDSTableLastModifiedCol} >= '#{format(@scheduledStartTime, 'YYYY-MM-dd HH-mm-ss')}' and
#{myRDSTableLastModifiedCol} <= '#{format(@scheduledEndTime, 'YYYY-MM-dd HH-mm-ss')}'
#{table}
:Name
에서 지정한Table2
를 의미합니다. 따라서 정확한 테이블 명이 되야 합니다.@scheduledStartTime
그리고@scheduledEndTime
: Schedule 필들에서 가져온 값#{}
: 그외 parameters 에서 지정된 값들을 의미 합니다.
- Add -> CopyActivity 를 추가합니다.
새로 생성된 CopyActivity는 Schedule 노드 아래에 붙는데.. 이동 시켜줘야 합니다.
- 새로 생성된 CopyActivity 선택 ->
Input
->Table2
선택 Name
:CopyTable2
변경Add an optional field
->Runs on
->EC2Instance
선택Output
:Create new: DataNode
선택
새로 만들어진 DataNode 를 선택후..
Type
:S3DataNode
변경Add an optional field
:File Path
추가
File Path는 다음과 같음.
#{myOutputS3Loc}/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}_table2