해당 기사에서는 Python SDK인 Boto3를 이용하여 RDS의 테이블을 읽은뒤에 DynamoDB로 마이그레이션 하는 방법에 대해 알려드립니다.
많은 고객님들께서 MySQL 과 같은 관계형 데이터베이스에서 DynamoDB 로 마이그레이션 하고 자 합니다. 왜냐하면, 완전 관리형, 고성능, 높은 확장성과 유연성을 갖춘 NoSQL 데이터베이스 서비스이기 때문입니다. DynamoDB의 경우, 트래픽 및 비즈니스 요구 사항에 따라 용량을 유연하게 증가 및 감소시킬 수 있기 때문에 서비스에 필요한 총 비용을 기존의 서버 기반의 RDBMS보다 더 쉽게 최적화 하는 것이 가능합니다. 해당 기사에서는 RDS Mysql 데이터 베이스 내의 테이블간의 연관관계가 없을때를 가정하여 DynamoDB로 마이그레이션 하는 방법을 안내해드립니다.
전제 조건
- pymysql 모듈이 설치 되어 있어야 합니다.
- pip install pymysql 커맨드를 이용하여 설치가 가능합니다.
- Python IDE(Pycharm, Visual Studio..etc)가 설치되어있어야 합니다.
- RDS mysql 데이터베이스가 생성되어있어야 합니다.
- 해당 기사에서는 아래의 샘플 테이블을 사용합니다
User 테이블
id | name | password |
---|
1 | sample_name1 | 1234 |
2 | sample_name2 | 1234 |
3 | sample_name3 | 1234 |
Product 테이블
id | name | price | quantity |
---|
1 | sample_product1 | 1000 | 10 |
2 | sample_product2 | 1000 | 15 |
3 | sample_product3 | 1000 | 10 |
1단계 : IAM 사용자 생성
- IAM 페이지에 접속합니다.
- [액세스 관리],[사용자],[사용자 생성]
- [사용자 이름]에 이름을 입력하고 [직접 정책 연결]을 클릭하여 아래의 권한을 넣습니다.
- AmazonDynamoDBFullAccess,AmazonRDSFullAccess
- 위의 IAM 사용자를 이용하여 자격증명을 수행합니다. [1]
단계2. 환경에 따라 코드를 수정한뒤 마이그레이션을 실행 합니다.
- 환경에 맞추어 아래의 <> 처리된 코드를 변경합니다.
- 해당 코드는 DynamoDB 테이블을 생성한뒤 배치처리를 적용하여 마이그레이션 하는 에제코드입니다.[2]
import pymysql
import boto3
# RDS 데이터베이스 연결 정보
host = '<엔드포인트>'
user = '<데이터베이스 접속 아이디>'
password = '<비밀번호>'
db_name = '<데이터베이스 이름>'
# dynamodb 리소스 생성
dynamodb = boto3.resource('dynamodb')
# RDS에 연결
conn = pymysql.connect(host=host, user=user, password=password, db=db_name)
cursor = conn.cursor()
query = "SHOW TABLES"
cursor.execute(query)
tables=cursor.fetchall()
for table in tables:
table=table[0]
query = "SHOW COLUMNS FROM "+table
cursor.execute(query)
column_infos = cursor.fetchall()
row_name=[]
row_type=[]
if column_infos:
for row in column_infos:
row_name.append(row[0])
row_type.append(row[1])
for i,type in enumerate(row_type):
if type=="int":
row_type[i]="N"
else:
row_type[i]="S"
table_name=table
table = dynamodb.create_table(
TableName=table_name,
KeySchema=[
{'AttributeName': row_name[0], 'KeyType': 'HASH'}
],
AttributeDefinitions=[
{'AttributeName': row_name[0], 'AttributeType': row_type[0]}
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
table.wait_until_exists()
query = "SELECT * FROM " + table_name
cursor.execute(query)
results = cursor.fetchall()
items_to_put=[]
for row in results:
items_dict={}
row=list(row)
for i,value in enumerate(row):
items_dict[row_name[i]]=value
items_to_put.append(items_dict)
with dynamodb.Table(table_name).batch_writer() as batch:
for item in items_to_put:
batch.put_item(Item=item)
print("{} 테이블의 마이그레이션이 완료되었습니다.".format(table_name))
# 연결 종료
cursor.close()
conn.close()
결과
- 정상적이게 코드가 실행되는 경우 아래와 같이 완료되었다는 메시지를 확인할수있습니다.
- DynamoDB 콘솔 창에서 데이터가 제대로 들어갔는지 확인이 가능합니다.
참고
[1] 구성 설정 지정 및 보기
https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods
[2] Boto3 1.28.62 documentation: DynamoDB
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html