보통 제품의 여러 환경으로 나누어 배포된다. 검증된 데이터를 프로덕션 환경으로 옮기거나 다른 리젠의 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)
'DataBase' 카테고리의 다른 글
Hibernate L2 Cache - Region 별 저장 및 통계 정보를 이용하기 (0) | 2022.01.25 |
---|---|
[DataBase] Order by에서 null 값 처리 (0) | 2022.01.06 |
[Spring] DynamoDB Enhanced Client 사용 기 (feat. AWS SDK V2) (0) | 2021.12.23 |
[Python] DynamoDB 및 Mysql 접근법 (0) | 2021.12.21 |
[DynamoDB] Partition Key 설계 (0) | 2021.12.21 |
Comment