BLOG
많은 웹 개발자는 관계형 데이터베이스를 사용하여 웹 애플리케이션에 데이터를 저장하고 관리합니다. 웹 개발을 위한 서버리스 접근 방식으로 마이그레이션하면 사용 가능한 옵션들이 더 있습니다. 이를 통해서는 워크로드의 규모, 성능 및 비용 효율성을 개선할 수 있습니다. 오늘 블로그 글에서는 다양한 서버리스 데이터베이스 서비스 사용 사례와 웹 애플리케이션에 유용한 공통 패턴을 알려드리겠습니다.
서버리스 웹 애플리케이션과 함께 Amazon RDS 사용하기
AWS Lambda 함수에서 직접 Amazon RDS에 액세스할 수 있습니다. Amazon Aurora와 같은 RDS 데이터베이스는 고객 VPC 내에 구성됩니다. Lambda 함수는 동일한 VPC에 대한 액세스 권한으로 구성되어야 합니다.
처리량이 많은 서버리스 응용 프로그램의 디자인 시에는 특별한 고려사항이 요구됩니다. 인기 있는 웹 응용 프로그램은 예측할 수 없이 빠르게 변화하는 트래픽 변화를 경험합니다. AWS Lambda 및 Amazon API Gateway와 같은 서버리스 서비스는 이러한 트래픽 증가를 만족할 수 있게 자동으로 확장되도록 설계되었습니다.
그러나 관계형 데이터베이스는 연결 기반이므로 웹 서버와 같이 수명이 긴 몇 가지 클라이언트와 함께 작동하도록 설계되었습니다. 대조적으로 Lambda 함수는 일시적이고 수명이 짧기 때문에 데이터베이스 연결이 많고 짧습니다. Lambda가 수백 또는 수천 개의 인스턴스로 확장되면 연결 요청으로 다운 스트림 관계형 데이터베이스에 부담될 수 있습니다. 이것은 일반적으로 중간 정도의 사용량이 많은 응용 프로그램에서만 발생하는 문제입니다. 일일 SQL 보고서 실행과 같은 작은 작업에 Lambda 함수를 사용하는 경우에는 이러한 동작이 발생하지 않습니다.
아마존 RDS 프록시 서비스는 대규모 사례를 해결하기 위해 만들어졌습니다. Lambda 서비스와 다운 스트림 RDS 데이터베이스 간의 연결을 풀링합니다. 이는 Lambda 함수가 프록시를 통해 연결을 재사용할 수 있음을 의미합니다. 결과적으로 개별 Lambda 함수의 연결 요청이 관계형 데이터베이스에 부담을 주지는 않으며 대부분의 경우 코드 변경이 필요하지 않습니다. Lambda 함수에서 데이터베이스 엔드 포인트를 프록시 엔드 포인트로 교체하기만 하면 됩니다.
따라서 대용량 웹 애플리케이션에서 관계형 데이터베이스를 사용해야 하는 경우 최소한의 변경만으로 RDS Proxy를 사용할 수 있습니다.
Amazon DynamoDB를 고성능 운영 데이터베이스로 사용하기
Amazon DynamoDB 는 모든 규모에서 한 자릿수 밀리 초 응답 시간으로 작동하는 고성능 키-값 및 문서 데이터베이스입니다. 이것은 많은 서버리스 워크로드, 특히 웹 애플리케이션에 적합한 NoSQL 데이터베이스입니다. 사용량이 적은 워크로드와 높은 워크로드에 대해 동일하게 잘 작동합니다. 관계형 데이터베이스와 달리 잘 설계된 DynamoDB 테이블의 성능은 사용량이 많거나 데이터 스토리지가 많아도 영향을 받지 않습니다.
웹 애플리케이션의 경우 DynamoDB 테이블은 일반적인 사용자 구성 및 애플리케이션 데이터를 저장하는 데 적합합니다. Amazon Cognito와 통합하면 현재 사용자 컨텍스트에 대한 행 수준 액세스를 제한할 수 있습니다. 따라서 많은 사용자를 위해 데이터를 호스팅하는 다중 테넌트 웹 응용 프로그램에 자주 선택됩니다.
DynamoDB 테이블은 지리 공간 쿼리 외에도 키 기반 정보 조회에 유용합니다. DynamoDB는 연결 기반이 아니므로 Lambda 함수가 최대 수백 또는 수천 개의 동시 실행으로 확장되는 경우에도 이 통합이 작동합니다. 최소한의 코드로 Lambda에서 직접 쿼리할 수 있습니다.
const AWS = require(‘aws-sdk’)
AWS.config.region = process.env.AWS_REGION
const documentClient = new AWS.DynamoDB.DocumentClient()
// Construct params
const params = {
TableName: ‘myDDBtable’,
Item: {
partitionKey: ‘user-123’,
sortKey: Date.now(),
name: ‘Alice’,
cartItems: 3
}
}
// Store in DynamoDB
const result = await documentClient.put(params).promise()
DynamoDB의 고급 패턴을 사용하면 관계형 스키마에 있는 기능을 구축할 수 있습니다. 예를 들어 일대 다 테이블, 다 대다 테이블 및 ACID 트랜잭션을 모두 단일 DynamoDB 테이블에서 모델링할 수 있습니다.
DynamoDB와 RDS 결합
DynamoDB는 대량의 트래픽에 대해 높은 성능을 유지하지만 스키마를 설계하기 전에 애플리케이션의 데이터 액세스 패턴을 이해해야 합니다. 임시 쿼리를 수행해야 하거나 다운 스트림 응용 프로그램 사용자가 SQL 기반 도구를 사용하여 데이터베이스와 상호 작용해야 하는 경우가 있습니다.
이 경우 아키텍처에서 DynamoDB와 RDS를 모두 결합하면 탄력적이고 유연한 솔루션을 제공할 수 있습니다. 예를 들어 대용량 트랜잭션 웹 애플리케이션의 경우 DynamoDB를 사용하여 프런트 엔드 애플리케이션에서 데이터를 수집할 수 있습니다. 임시 SQL 기반 분석의 경우 Amazon Aurora를 사용할 수도 있습니다.
DynamoDB의 스트림을 사용하면 람다 함수를 사용해 DynamoDB의 테이블에 대한 업데이트를 처리할 수 있습니다. 간단한 경우에 이 함수는 RDS의 테이블을 업데이트하여 두 데이터베이스를 동기화 된 상태로 유지할 수 있습니다. 예를 들어 판매 트랜잭션이 DynamoDB에 저장되면 Lambda 함수는 판매 정보를 Aurora의 트랜잭션 테이블에 게시할 수 있습니다.
Lambda 함수와 RDS 데이터베이스는 모두 고객의 VPC에서 작동하지만 DynamoDB는 VPC 외부에 있습니다. DynamoDB Streams는 VPC에 액세스하도록 구성된 Lambda 함수를 호출 할 수 있습니다. 이 모델에서 RDS 사용자는 DynamoDB에서 관리하는 운영 데이터에 영향을 주지 않고 임시 SQL 쿼리를 실행할 수 있습니다.
DynamoDB와 RDS 간의 대용량 ETL 프로세스
DynamoDB에서 많은 수의 트랜잭션을 캡쳐하는 대용량 워크로드의 경우 Lambda는 여전히 빠르게 확장되고 RDS 연결 풀을 고갈시킬 수 있습니다. 이러한 흐름을 처리하기 위해 DynamoDB와 RDS 간의 데이터 복제를 지원하는 Amazon Kinesis Data Firehose를 도입할 수 있습니다.
- DynamoDB의 신규 및 업데이트된 항목은 DynamoDB 스트림으로 전송됩니다. 스트림은 Lambda 함수를 처리하는 스트림을 호출하여 레코드 배치를 Kinesis Data Firehose로 보냅니다.
- Kinesis는 수신 메시지를 버퍼링하고 Lambda 함수를 사용하여 데이터 변환을 수행합니다. 그 다음 아마존 S3 에 사이즈가 버퍼링 (1-128 MB) 또는 간격 (60~900초)로 기록합니다.
- Kinesis Data Firehose 변환은 필요에 따라 레코드를 처리하기 위해 사용자 지정 Lambda 함수를 사용합니다.
- Amazon S3는 이러한 변환된 레코드 배치를 위한 내구성있는 저장소입니다. 객체가 작성되면 S3는 Lambda 함수를 호출합니다.
- Lambda 함수는 S3에서 객체를 로드한 다음 RDS에 연결하고 데이터를 가져옵니다.
이 접근 방식은 높은 트랜잭션 볼륨을 지원하므로 RDS로 로드하기 전에 테이블 항목을 변환할 수 있습니다. RDS 동시 연결 풀은 업스트림 일괄 처리 및 버퍼링으로 최적화되어 동시 Lambda 함수 및 RDS 연결 수를 줄입니다.
결론
웹 개발자는 일반적으로 응용 프로그램을 구축할 때 관계형 데이터베이스를 사용합니다. 서버리스 아키텍처로 마이그레이션 할 때 웹 개발자는 RDS와 같은 데이터베이스를 계속 사용하거나 사용 가능한 다른 옵션을 활용할 수 있습니다. RDS Proxy를 사용하면 개발자가 데이터베이스 연결을 풀링하고 임시 기능이 있는 연결 기반 데이터베이스를 사용할 수 있습니다.
DynamoDB는 지연 시간이 짧은 고성능 NoSQL 지원을 제공하므로 트래픽이 급증하는 웹 애플리케이션에 이상적입니다. 그러나 두 서비스를 모두 사용하여 RDS의 임시 SQL 쿼리의 유연성과 함께 DynamoDB의 처리량을 활용할 수도 있습니다.
트래픽 볼륨이 매우 높은 경우 Kinesis Data Firehose를 도입하여 DynamoDB와 RDS간에 데이터를 일괄 처리하고 변환할 수 있습니다. 이 경우 분석 데이터베이스에서 운영 데이터베이스를 분리합니다. 이 솔루션은 여러 서버리스 서비스를 사용하여 자동으로 확장을 처리합니다.
웹 개발자를위한 AWS 서버리스 데이터베이스 솔루션에 대해 자세히 알아보려면 https://aws.amazon.com/products/databases/를 방문하세요.
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.