Amazon Web Services 한국 블로그

DynamoDB 신규 기능 – 스트림 및 Lambda 데이터 트리거 + 리전간 복제

Amazon DynamoDB에 여러 가지 새로운 소식이 있습니다. 먼저 DynamoDB 스트림 기능이 추가되었으며, AWS Lambda를 통해 스트림 데이터 활용이 가능합니다. 두 번째는 하나의 DynamoDB 테이블에서 다른 테이블로 복제가 가능하고, 리전(Regions)을 넘어서도 가능해졌습니다.

지금 부터 자세히 살펴 보겠습니다.

DynamoDB Streams
지난 가을에 re:Invent 행사 며칠 전 DynamoDB 스트림에 대한 미리 보기 기능을 출시했습니다. 많은 사용자들이 DynamoDB 테이블의 변경을 추적하기를 원하셨기 때문이었습니다.

이 기능은 오늘부터 정식으로 사용할 수 있으며, 바로 DynamoDB 테이블에 기능을 활성화하면 모든 변경 사항(put, update, delete)를 24시간 언제든지 stream record로서 실시간으로 스트리밍으로 받을 수 있습니다. 여러 개의 스트림 레코드는 빠르고 효율적인 처리를 위해 샤드(shard)에 그룹으로 만들어서 하나의 단위로 변환됩니다.

테이블 변경 순서의 상대적인 위치는 하나의 고유키로 만들어서 샤드안에 저장됩니다. 이를 통해 항목 변화를 정확히 추적할 수 있도록 샤드 내에 스트림 레코드를 쉽게 처리할 수 있게 됩니다.

“Interactive Intelligence는 Amazon DynamoDB의 리전간 복제 기능을 처음 테스트 해보고 매우 놀라웠습니다. PureCloud 플랫폼이 이 기능을 처음 도입을 해보고, 빠르고 쉽게 AWS 리전간 데이터가 쉽게 복제되어서 운영 및 기술 지원 비용을 확실히 감소할 수 있게 되었습니다.”
Mike Szilagyi, PureCloud Service Technology 부사장
Interactive Intelligence

프로그램 코드를 사용해서 샤드에서 레코드를 추출한 후, 변환 받은 다음 필요한 기능을 수행할 수 있습니다. 각 레코드는 미리 생성된 테이블 쓰기 용량 내에서 두 번 정도에 변환 받을 수 있습니다.

스트림 기능을 활성화하려면, 테이블을 만들 때 CreateTable를 호출하여 스트림에 대한 파라미터를 넣어 만들 수 있습니다. 기존 테이블에서도 UpdateTable에서 비슷한 파라미터를 넣으시면 됩니다. 각각의 경우, 표준 스펙에 스트림을 시작할지 말지에 대한 플래그(flag)와 보기 형식(저장 및 반환 항목키 만, 새로운 이미지, 예전 이미지 혹은 둘 다)를 포함해야 합니다.

좀 더 자세한 사항은 신규 기능에 대한 DynamoDB Streams Developer Guide를 참고하시기 바랍니다.

추가 비용 없이 여러분의 테이블에 스트리밍 기능을 바로 만드실 수 있으며, 스트림에서 데이터를 읽을 때만 과금이 되는데 GetRecords를 통한 호출 시 1MB까지 데이터를 꺼내 올 수 있습니다. 좀 더 자세한 것은 요금 정책을 참고하시면 됩니다.

DynamoDB 스트림 + Lambda = 데이터베이스 트리거
AWS Lambda는 (현재 Node.js와 자바)를 통해 만든 프로그래밍 코드를 클라우드 내에서 실행하는 신개념의 클라우드 함수입니다.  장애나 확장성에 대한 고려 없이도 100 밀리초 단위로 실행한 시간 만큼만 과금을 하는 경제적인 모델을 가진 서비스입니다.

오늘 DynamoDB 스트림 기능을 정식 출시함으로서 테이블이 더 커지거나 쿼리가 많아질 때, 확장성을 고려하지 않고도 기존의 프로그래밍 코드보다 훨씬 적은 노력만으로 (Lambda를 이용하여) 스트림 레코드를 처리할 수 있습니다.

즉,  이 두 가지를 조합해서 간단한 NoSQL 스타일의 데이터베이스 트리거를 만들 수 있습니다. 예전에 관계형 DB의 트리거는 엔진 내에서 구현되었고, 때문에 엔진에서 정의된 동작만 수행할 수 있는 제한이 있었습니다. Lambda를 이용하면, 데이터 추가, 삭제 및 테이블 항목 변경이 일어날 때 마다 관련되는 동작을 원하는 대로 구현할 수 있습니다. 신규 혹은 과거 이미지의 변경 사항을 분석하고, 데이터 양식을 변경하거나 특정 비지니스 로직을 동기 혹은 비동기로 강제하는 것도 가능합니다. 여러분이 좀 더 애플리케이션 개발에 중요한 부분에 집중하도록 Lambda를 통해 호스팅과 확장 문제를 관리하게 만들어 둘 수도 있습니다.

Lambda 코드를 설정해서 스트림 변경을 확인하는 것도 간단합니다. 새 테이블을 통해 하는 방법을 간단히 살펴 보겠습니다. 먼저 Lambda를 위한 IAM 역할을 만들고, 관리 콘솔에서 Create Lambda function을 실행해 봅니다. 예제들 중 dynamodb-process-stream를 선택해 보겠습니다.

먼저 Lambda 함수 예제 코드와 이벤트 소스를 설정합니다.콘솔 화면에 이벤트 소스로 user_table이라는 테이블을 연결해서, 100개까지의 스트림 레코드를 받아서 새로운 레코드로 처리하는 기능을 수행해 보겠습니다.

예제에는 현재 상태를 테스트해 보는 목적의 코드가 있으며, 간단한 이름을 정한 후 (ProcessUserTableRecords) DynamoDB에 접근할 수 있는 IAM 역할을 선택합니다.

이제 이벤트 소스를 활성화 해보겠습니다. (Lambda 코드를 테스트해 본 후에 실제 동작 하도록 하는 게 좋습니다.)

Create function을 눌러서 이벤트 소스로서 테이블 업데이트 스트림을 처리하는 함수를 만듭니다. Lambda 콘솔의 Event sources탭에서 상태와 다른 이벤트 소스도 보실 수 있습니다.

자, 이제 설정이 다 끝났고 여기서 테이블의 업데이트 스트림을 연결 한 후, 레코드를 처리해 봅시다. 이를 위해 DynamoDB 콘솔로 옮겨가서 데이터를 몇 개 추가해서 스트림에 변화가 생기도록 해 보겠습니다.

Lambda 콘솔에 들어와 보면, 기대했던 동작이 일어났는지 확인해 볼 수 있습니다. 모니터링 탭을 클릭해 보면 오류 없이 Lambda 함수가 두 번 실행된 것을 알 수 있습니다.

일단 잘 동작한 것으로 보고 CloudWatch 로그를 좀 더 자세히 보겠습니다.

만약 제가 실제 애플리케이션을 만들었다면, 기본 예제에 더 많은 기능을 추가해서 만들어 볼 수 있었을 것입니다.

DynamoDB와 Lambda를 결합한 구현 방식에 대해서는 Using DynamoDB Streams and AWS Lambda 문서를 참고하시기 바랍니다. DynamoDB Trigger에는 추가 요금이 없고 Lambda 함수 실행에 대한 과금만 이루어 지며 자세한 것은 Lambda 요금 정보를 참고하시기 바랍니다.

이러한 조합을 통해 여러분의 애플리케이션이 더 간단하고 강력하며 반응성이 높은 기능을 추가할 수 있기를 기대해 봅니다.

리전(Region)간 DynamoDB 복제 기능
DynamoDB 스트림 기능과 아울러 AWS 리전 간 데이터를 쉽게 복제할 수 있는 기능을 소개해드립니다. 이 애플리케이션은 작년에 저희가 배포한 DynamoDB Cross Region Replication library를 통해 구현한 것입니다. (앞으로도 이 라이브러리를 여러분의 앱에 사용하셔도 됩니다.)

이를 통해 DynamoDB를 여러개의 리전으로 중복으로 복제할 수 있는데, 이는 재난 복구나 여러 지역에서 낮은 지연을 통해 접근이 필요한 여러가지 이유가 있을 수 있습니다. 보시다시피 아주 간단하게 리플리카를 만들어서 운영할 수 있게 됩니다.

이 앱은 AWS Elastic Beanstalk에서도 실행할 수 있고, Amazon EC2 Container Service를 사용할 수 있으며, AWS CloudFormation 템플릿으로도 구현 가능합니다. DynamoDB 콘솔에서 초기화 할 수 있으며 CloudFormation을 통해 스택이나 콘테이너를 생성하기 위한 템플릿 정보를 입력할 수 있습니다.

스택(Stack, 템플릿을 통해 만들어지는 AWS 자원에 대한 이름)을 입력하고 Next를 눌러 파라미터를 입력할 수 있습니다. (대부분 기본값을 그대로 두시면 됩니다.)

메타테이터 테이블은 복제에 필요한 정보를 포함합니다. 이는 어떤 테이블을 복제할 것인지 어디에 저장할 것인지를 설정합니다. 복제용 앱을 띄운 후, 온라인 설정 화면에 접속하술 수 있습니다. (CloudFormation 템플릿이 URL을 만들어 줍니다.)

이 기능 또한, 추가 요금이 없습니다. 이 기능을 활용하기 위한 기본적인 DynamoDB 리소스(미리 설정된 입출력 한도, 복제 테이블의 저장 용량, 리전간 데이터 전송 비용, 스트림으로 데이터 읽기 및 애플리케이션을 제어하는데 필요한 EC2 인스턴스 및 SQS 서비스 이용 비용 등)에 대해서만 과금이 됩니다. 더 자세한 것은 DynamoDB 요금페이지를 참고하시기 바랍니다.

리전 간 복제에 대한 더 자세한 정보는 Cross Region Replication를 참고하시기 바랍니다.

Jeff;

이 글은 DynamoDB Update – Triggers (Streams + Lambda) + Cross-Region Replication App의 한국어 번역입니다.