기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
DynamoDB TTL을 사용하여 Amazon S3에 항목 자동으로 보관
작성자: Tabby Ward(AWS)
요약
이 패턴은 Amazon DynamoDB 테이블에서 오래된 데이터를 제거하고 여러 플릿의 서버를 관리할 필요 없이 Amazon Web Services(AWS)의 Amazon Simple Storage Service(S3) 버킷에 보관하는 단계를 제공합니다.
이 패턴은 Amazon DynamoDB Time to Live(TTL)를 사용하여 오래된 항목을 자동으로 삭제하고 Amazon DynamoDB Streams를 사용하여 TTL 만료 항목을 캡처합니다. 그런 다음 DynamoDB 스트림을 AWS Lambda에 연결하고, AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행합니다.
DynamoDB 스트림에 새 항목이 추가되면 Lambda 함수가 시작되고 Amazon Data Firehose 전송 스트림에 데이터를 씁니다. Firehose는 데이터를 Amazon S3에 아카이브로 로드할 수 있는 간단한 완전 관리형 솔루션을 제공합니다.
DynamoDB는 센서 및 연결된 디바이스의 웹 페이지 클릭 스트림 데이터 또는 사물 인터넷(IoT) 데이터와 같은 시계열 데이터를 저장하는 데 주로 사용됩니다. 액세스 빈도가 낮은 항목을 삭제하는 대신 감사 목적으로 보관하려는 고객이 많습니다. TTL은 타임스탬프 속성에 따라 항목을 자동으로 삭제하여 보관을 간소화합니다.
TTL에 의해 삭제된 항목은 DynamoDB Streams에서 식별할 수 있으며, 여기에서는 항목 수준 수정을 캡처하고 최대 24시간 동안 로그에 저장합니다. 이 데이터는 Lambda 함수에서 사용하고 Amazon S3 버킷에 보관하여 스토리지 비용을 줄일 수 있습니다. 비용을 더욱 절감하기 위해 Amazon S3 수명 주기 규칙을 생성하여 데이터를 생성하자마자 S3 Glacier Instant Retrieval 또는 S3 Glacier Flexier Flexival와 같이 가장 비용이 저렴한 스토리지 클래스
사전 조건 및 제한 사항
사전 조건
활성 상태의 AWS 계정.
AWS Command Line Interface(AWS CLI) 버전 1.7 이상 macOS, Linux 또는 Windows에 설치 및 구성.
Python 3.7
이상. Boto3
, 설치 및 구성됨. Boto3가 설치되지 않은 경우에는 다음 python -m pip install boto3
명령을 실행하여 설치합니다.
아키텍처
기술 스택
Amazon DynamoDB
Amazon DynamoDB Streams
Amazon Data Firehose
AWS Lambda
Amazon S3

항목은 TTL에 의해 삭제됩니다.
DynamoDB 스트림 트리거는 Lambda 스트림 프로세서 함수를 간접 호출합니다.
Lambda 함수는 Firehose 전송 스트림에 레코드를 배치 형식으로 저장합니다.
데이터 레코드는 S3 버킷에 보관됩니다.
도구
AWS CLI - AWS Command Line Interface(AWS CLI)는 AWS 서비스를 관리하는 통합 도구입니다.
Amazon DynamoDB - Amazon DynamoDB는 모든 규모에서 10밀리초 미만의 성능을 제공하는 키-값 및 도큐먼트 데이터베이스입니다.
Amazon DynamoDB Time to Live(TTL) - Amazon DynamoDB TTL을 사용하면 항목별 타임스탬프를 정의하여 항목이 더 이상 필요하지 않은 시점을 결정할 수 있습니다.
Amazon DynamoDB Streams - Amazon DynamoDB Streams는 DynamoDB 테이블에서 시간 순서에 따라 항목 수준 수정을 캡처하고 이 정보를 최대 24시간 동안 로그에 저장합니다.
Amazon Data Firehose - Amazon Data Firehose는 스트리밍 데이터를 데이터 레이크, 데이터 스토어 및 분석 서비스로 안정적으로 로드하는 가장 쉬운 방법입니다.
AWS Lambda - AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행합니다. 사용한 컴퓨팅 시간에 대해서만 비용을 지불하면 됩니다.
Amazon S3 - Amazon Simple Storage Service(S3)는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다.
코드
이 패턴의 코드는 GitHub DynamoDB TTL 리포지토리를 사용하여 S3에 항목 아카이브
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
DynamoDB 테이블을 생성합니다. | AWS CLI를 사용하여 DynamoDB에
| 클라우드 아키텍트, 앱 개발자 |
DynamoDB TTL을 켭니다. | AWS CLI를 사용하여
| 클라우드 아키텍트, 앱 개발자 |
DynamoDB 스트림을 켭니다. | AWS CLI를 사용하면
이 스트림에는 새 항목, 업데이트된 항목, 삭제된 항목, TTL에 의해 삭제된 항목에 대한 레코드가 포함됩니다. TTL로 삭제된 항목의 레코드에는 수동으로 삭제된 항목과 구분하기 위한 추가 메타데이터 속성이 포함되어 있습니다. TTL 삭제 이 패턴에서는 TTL에 의해 삭제된 항목만 보관되지만, | 클라우드 아키텍트, 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
S3 버킷을 생성합니다. | AWS CLI를 사용하여 AWS 리전에 대상 S3 버킷을 생성하고를 리전
네임스페이스는 모든 AWS 계정에서 공유되므로 S3 버킷의 이름이 전역적으로 고유한지 확인합니다. | 클라우드 아키텍트, 앱 개발자 |
S3 버킷에 대한 30일 수명 주기 정책을 생성합니다. |
| 클라우드 아키텍트, 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
Firehose 전송 스트림을 생성하고 구성합니다. | GitHub 리포지토리에서 이 코드는 Python으로 작성되었으며 Firehose 전송 스트림과 AWS Identity and Access Management(IAM) 역할을 생성하는 방법을 보여줍니다. IAM 역할에는 Firehose가 대상 S3 버킷에 쓰는 데 사용할 수 있는 정책이 있습니다. 스크립트를 실행하려면 다음 명령과 명령줄 인수를 사용하십시오. 인수 1= 인수 2= Firehose 이름(이 파일럿은를 사용합니다 인수 3= IAM 역할 이름(이 파일럿에서
지정된 IAM 역할이 없는 경우 스크립트는 신뢰할 수 있는 관계 정책과 충분한 Amazon S3 권한을 부여하는 정책을 사용하여 수임 역할을 생성합니다. 이러한 정책의 예는 추가 정보 섹션을 참조하십시오. | 클라우드 아키텍트, 앱 개발자 |
Firehose 전송 스트림을 확인합니다. | AWS CLI를 사용하여 전송 스트림이 성공적으로 생성되었는지 확인하여 Firehose 전송 스트림을 설명합니다.
| 클라우드 아키텍트, 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
Lambda 함수에 대해 신뢰 정책를 생성합니다. | 다음 정보로 신뢰 정책 파일을 생성합니다.
이렇게 하면 함수에 AWS 리소스에 액세스할 수 있는 권한이 부여됩니다. | 클라우드 아키텍트, 앱 개발자 |
Lambda 함수용 실행 역할을 생성합니다. | 실행 역할을 생성하려면 다음 코드를 실행합니다.
| 클라우드 아키텍트, 앱 개발자 |
역할에 권한을 추가하십시오. | 역할에 권한을 추가하려면
| 클라우드 아키텍트, 앱 개발자 |
Lambda 함수를 생성합니다. | 다음 명령어를 실행하여 코드 리포지토리의
Lambda 함수를 생성할 때, Lambda 실행 역할 ARN이 필요합니다. ARN을 가져오려면 다음 코드를 실행합니다.
Lambda 함수를 생성하려면 다음 코드를 실행합니다.
| 클라우드 아키텍트, 앱 개발자 |
Lambda 함수 트리거를 구성합니다. | AWS CLI를 사용하여 Lambda 함수를 간접 호출하는 트리거(DynamoDB 스트림)를 구성합니다. 배치 크기 400은 Lambda 동시성 문제가 발생하지 않도록 하기 위한 것입니다.
| 클라우드 아키텍트, 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
타임스탬프가 만료된 항목을 예약 테이블에 추가합니다. | 기능을 테스트하려면 에포크 타임스탬프가 만료된 항목을 Lambda 함수는 DynamoDB 스트림 활동 시 시작되며 이벤트를 필터링하여 Firehose 전송 스트림은 중요데이터 검색을 최적화하려면 추가 정보 섹션에 자세히 | 클라우드 아키텍트 |
작업 | 설명 | 필요한 기술 |
---|---|---|
모든 리소스를 삭제합니다. | 모든 리소스를 삭제하여 사용하지 않는 서비스에 대해 요금이 청구되지 않도록 합니다. | 클라우드 아키텍트, 앱 개발자 |
관련 리소스
추가 정보
Firehose 전송 스트림 생성 및 구성 - 정책 예제
Firehose 신뢰할 수 있는 관계 정책 예제 문서
firehose_assume_role = { 'Version': '2012-10-17', 'Statement': [ { 'Sid': '', 'Effect': 'Allow', 'Principal': { 'Service': 'firehose.amazonaws.com' }, 'Action': 'sts:AssumeRole' } ] }
S3 권한 정책 예
s3_access = { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "{your s3_bucket ARN}/*", "{Your s3 bucket ARN}" ] } ] }
기능 테스트 - Amazon S3 구성
다음과 Prefix
및 ErrorOutputPrefix
의 Amazon S3 구성이 데이터 검색을 최적화하도록 선택되었습니다.
접두사
firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/
Firehose는 먼저 S3 버킷 firehosetos3example
바로 아래에 라는 기본 폴더를 생성합니다. 그런 다음 Java DateTimeFormatter!{timestamp:yyyy}
, !{timestamp:MM}
, !{timestamp:dd}
및 !{timestamp:HH}
를 연도, 월, 일, 시간으로 평가합니다.
예를 들어, Unix 에포크 타임의 대략적인 도착 타임스탬프 1604683577은 year=2020
, month=11
, day=06
및 hour=05
로 평가됩니다. 따라서 데이터 레코드가 전송되는 Amazon S3의 위치는 firehosetos3example/year=2020/month=11/day=06/hour=05/
로 평가됩니다.
ErrorOutputPrefix
firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/
ErrorOutputPrefix
는 S3 버킷 바로 아래에 firehosetos3erroroutputbase
가 직접 호출되는 기본 폴더를 만듭니다. 표현식 !{firehose:random-string}
은 ztWxkdg3Thg
와 같은 11자 임의 문자열로 평가됩니다. 실패한 레코드가 전송된 Amazon S3 객체의 위치를 firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/
로 평가할 수 있습니다.