[DynamoDB] AWS Lambda을 이용하여 DynamoDB Table간 실시간 동기화하기

보통 제품의 여러 환경으로 나누어 배포된다. 검증된 데이터를 프로덕션 환경으로 옮기거나 다른 리젠의 DynamoDB 테이블로 옮기위 위해서는 오늘 소개하는 방법을 사용 할 수 있다.

◆ 실시간 동기화 흐름

DynamoDB Stream 은 DynamoDB에서 일어나는 일련의 행동들을 캡쳐하고 24시간동안 로그에 저장한다. 또한 이 기능은 DynamoDB을 RCU 비용만 발생한다. 또한 트리거 기능을 제공하여 삽입, 업데이트, 삭제 발생시 target 테이블을 업데이트 가능하다. 이를 이용하여 AWS Lambda을 사용하여 다른 테이블들을 업데이트 할 수 있다.

Lambda 권한 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor3",
            "Effect": "Allow",
            "Action": [               
							  "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:**region:accountID**:table/BarkTable/stream/*"
        },
				{
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
	              "dynamodb:BatchWriteItem",
                "dynamodb:PutItem",
                "dynamodb:PartiQLUpdate",
            ],
            "Resource": "arn:aws:dynamodb:**region:accountID**:table/"
        },
    ]
}

Source table에 대해서는 stream에 대한 읽기 권한을 주고, Target table에 대해서는 업데이트와 쓰기 권한을 준다.

Lambda 함수

import json
import boto3
import os

def lambda_handler(event, context):
    
    target_ddb_name = os.environ['TARGET_DYNAMODB_NAME']
    
    dynamodb = boto3.client('dynamodb')
    
    records = event['Records']
    for record in records:
        event_name = record['eventName']
        
        if event_name == 'REMOVE':
            response = dynamodb.delete_item(TableName=target_ddb_name,Key=record['dynamodb']['Keys'])
        else:
            response = dynamodb.put_item(TableName=target_ddb_name,Item=record['dynamodb']['NewImage'])

    return response

"event" key에 담긴 data를 target table에 넣는 함수이다. 여기서 주의할 점은 삭제에 대해서는 Key로 접근해야 된다는점 이다. boto3 client 생성 시 AWS 로그인 정보를 사용하지 않았다. 만약 다른 리젠, 혹은 다른 계정으로 업데이트 원하면 boto3에 로그인 정보를 추가하면 된다. 샘플코드를 참고하기 바란다.

DynamoDB Stream 활성화 및 트리거 설정

DynamoDB 설정에 가면 내보내기 및 스트림 탭에 보면 스트림을 활성화 할 수 있다. 활성화 한 후 위에서 트리거에 금방 작성한 lambda function을 선택하고 활성화 하면 실시간으로 업데이트 되는것을 CloudWatch을 통하여 확인할 수 있다.

 

 

Tutorial: Process New Items with DynamoDB Streams and Lambda - Amazon DynamoDB

DynamoDB Streams: How To Sync Data Conveniently In Real-Time (hevodata.com)

cross-account-amazon-dynamodb-replication/ReplayFromStream.py at main · aws-samples/cross-account-amazon-dynamodb-replication · GitHub