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