imhamburger 님의 블로그

RDS to DynamoDB 마이그레이션 리서치 본문

끄적끄적

RDS to DynamoDB 마이그레이션 리서치

imhamburger 2025. 10. 26. 22:59

이번에 Mysql 에서 DynamoDB로 마이그레이션해야하는 작업을 수행했다.

서치를 해보니...

 

마이그레이션 방법

1. AWS DMS 서비스 사용
2. EMR, Amazon Kinesis, Lambda 사용

 

나는 인프라를 늘리지 않고 사용중인 걸 활용하고 싶어서 Lambda를 사용해야겠다 라고 생각했다.

AWS Lambda에서 DynamoDB 테이블에 데이터를 삽입하려면, 먼저 DynamoDB 테이블을 생성하고, Lambda 함수의 IAM 역할에 DynamoDB 접근 권한을 부여해야 한다.

그 후, Lambda 함수 코드에서 AWS SDK(예: Boto3)를 사용하여 put_item 메소드를 호출하면 테이블에 항목을 삽입할 수 있다.

 

 

방법2: Lambda 사용

아래는 AWS 페이지에서 본 코드예시이다.

import boto3

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('TableName') # 생성한 테이블 이름으로 변경
    
    # 이벤트에서 데이터를 가져와 테이블에 삽입
    response = table.put_item(
        Item={
            'partitionKey': event['partitionKey'],
            'attribute1': event['attribute1'],
            'attribute2': event['attribute2']
        }
    )
    
    return {
        'statusCode': 200,
        'body': 'Item inserted successfully!'
    }

 

→ 현재 NPS 데이터는 실시간이 아니라서 일괄처리로 진행중이라 복잡하게 설계할 필요는 없을듯하다.

마이그레이션을 위한 Lambda 함수를 생성하고 Lambda가 DynamoDB에 접근할 수 있는 권한 추가 필요하다. 

권한을 주지않을 시 아래와 같은 에러코드가 발생한다.

    "errorMessage": "An error occurred (AccessDeniedException) when calling the Scan operation: User: arn:aws:sts::938150553933:assumed-role/mysql-to-dynamodb-migration-role-plzwdr8e/mysql-to-dynamodb-migration is not authorized to perform: dynamodb:Scan on resource: arn:aws:table/test_migration_mysql because no identity-based policy allows the dynamodb:Scan action",
      "errorType": "ClientError",
      "requestId": "199a6e2d-0727-494a-9",
      "stackTrace": [
        "  File \"/var/task/lambda_function.py\", line 27, in lambda_handler\n    companyID, companyName = db_access.get_data()\n",
        "  File \"/var/task/lambda_function.py\", line 11, in get_data\n    res = self.table.scan()\n",
        "  File \"/var/runtime/boto3/resources/factory.py\", line 581, in do_action\n    response = action(self, *args, **kwargs)\n",
        "  File \"/var/runtime/boto3/resources/action.py\", line 88, in __call__\n    response = getattr(parent.meta.client, operation_name)(*args, **params)\n",
        "  File \"/var/runtime/botocore/client.py\", line 602, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
        "  File \"/var/runtime/botocore/context.py\", line 123, in wrapper\n    return func(*args, **kwargs)\n",
        "  File \"/var/runtime/botocore/client.py\", line 1078, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
      ]
    }

 

dynamoDB는 일반 mysql처럼, 아이피, 디비 유저명, 디비 비밀번호를 입력해서 접근하는 방식이 아닌, AWS에서 지원해주는 SDK를 통해서만 접근이 가능하다. (코드로 사용하기 위해선 aws SDK방법 뿐)
(aws의 웹페이지 혹은 지원해주는 프로그램을 통해서도 데이터에 접근할 수도 있다.)

aws의 SDK를 통해서 dynamoDB에 접근하기 위해선, IAM의 인증 키가 필요하다.

 

IAM 인증키를 받았다면 정상적으로 접근할 수 있을 것이다!

 

나는 Lambda로 실행하기 전 로컬에서 테스트를 먼저 해보았다.

 

테스트코드

import boto3
import pymysql
import json

conn = pymysql.connect(
    host='',
    user='',
    password='',
    db='',
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor 
)

cursor = conn.cursor()
query = "SELECT * FROM NPSListOddMonths LIMIT 5;"
cursor.execute(query)
rows = cursor.fetchall()


cursor.close()
conn.close()


# DynamoDB 연결
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('test_migration_mysql')


# DynamoDB에 업로드
with table.batch_writer() as batch:
    for row in rows:
        item = {
            'companyID': int(row['companyID']),
            'registrationDate': str(row["registrationDate"]),
            'companyName': str(row['companyName']),
            'employerIdNumber': int(row['employerIdNumber'])
        }
        batch.put_item(Item=item)
    print("success")

 

 

테스트 결과

 

주의!!

DynamoDB의 BatchWriteItem작업은 단일 배치 내에서 동일한 항목에 대한 여러 작업을 허용하지 않는다. 배치의 각 항목은 기본 키(해당되는 경우 파티션 키 및 정렬 키)를 기준으로 고유해야 한다.

 

안그럼 아래와 같은 에러가 발생한다.

DynamoDB BatchWriteItem: Provided list of item keys contains duplicates

 

 

참고한 문서

 

MySQL에서 다운타임 거의 없이 DynamoDB로 마이그레이션하기 | Amazon Web Services

많은 고객들이 MySQL 과 같은 관계형 데이터베이스에서 Amazon DynamoDB으로 마이그레이션 하고자 합니다. 왜냐하면, 완전 관리형, 고성능, 높은 확장성과 유연성을 갖춘 NoSQL 데이터베이스 서비스이

aws.amazon.com

 

 

[AWS] Lambda에서 aws DynamoDB 사용하기

음성으로 일기를 기록하고, 이 일기의 감정을 분석하는 서비스를 만들고 있습니다. 음성을 텍스트로 변환하거나, 텍스트에서 감정을 추출할 때는 불가피하게 오랜 시간이 걸립니다🥲 따라서

velog.io

 

Python과 Boto3를 사용한 Amazon DynamoDB 프로그래밍 - Amazon DynamoDB

Python과 Boto3를 사용한 Amazon DynamoDB 프로그래밍 이 안내서는 Python을 통해 Amazon DynamoDB를 사용하려는 프로그래머에게 지침을 제공합니다. 다양한 추상화 계층, 구성 관리, 오류 처리, 재시도 정책

docs.aws.amazon.com