DynamoDB TTL을 사용하여 Amazon S3에 항목 자동으로 보관 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

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와 같이 가장 비용이 저렴한 스토리지 클래스 또는 장기 보관을 위한 Amazon S3 Glacier Deep Archive로 자동 전환할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

아키텍처

기술 스택  

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

DynamoDB에서 S3 버킷으로의 4단계 프로세스입니다.
  1. 항목은 TTL에 의해 삭제됩니다.

  2. DynamoDB 스트림 트리거는 Lambda 스트림 프로세서 함수를 간접 호출합니다.

  3. Lambda 함수는 Firehose 전송 스트림에 레코드를 배치 형식으로 저장합니다.

  4. 데이터 레코드는 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에 Reservation이라는 테이블을 생성합니다. 임의 읽기 용량 유닛(RCU)과 쓰기 용량 유닛(WCU)을 선택하고 테이블에 두 가지 속성 ReservationIDReservationDate를 지정합니다. 

aws dynamodb create-table \ --table-name Reservation \ --attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \ --key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100

ReservationDate는 TTL을 켜는 데 사용되는 에포크 타임스탬프입니다.

클라우드 아키텍트, 앱 개발자

DynamoDB TTL을 켭니다.

AWS CLI를 사용하여 ReservationDate 속성에 대해 DynamoDB TTL을 활성화합니다.

aws dynamodb update-time-to-live \ --table-name Reservation\ --time-to-live-specification Enabled=true,AttributeName=ReservationDate
클라우드 아키텍트, 앱 개발자

DynamoDB 스트림을 켭니다.

AWS CLI를 사용하면 NEW_AND_OLD_IMAGES 스트림 유형을 사용하여 Reservation 테이블에 대한 DynamoDB 스트림을 활성화할 수 있습니다. 

aws dynamodb update-table \ --table-name Reservation \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES

이 스트림에는 새 항목, 업데이트된 항목, 삭제된 항목, TTL에 의해 삭제된 항목에 대한 레코드가 포함됩니다. TTL로 삭제된 항목의 레코드에는 수동으로 삭제된 항목과 구분하기 위한 추가 메타데이터 속성이 포함되어 있습니다. TTL 삭제 userIdentity 필드는 DynamoDB 서비스가 삭제 작업을 수행했음을 나타냅니다. 

이 패턴에서는 TTL에 의해 삭제된 항목만 보관되지만, eventNameREMOVE이고 userIdentitydynamodb.amazonaws.com에 상응하는 principalId를 포함하는 레코드만 보관할 수 있습니다.

클라우드 아키텍트, 앱 개발자
작업설명필요한 기술

S3 버킷을 생성합니다.

AWS CLI를 사용하여 AWS 리전에 대상 S3 버킷을 생성하고를 리전us-east-1으로, amzn-s3-demo-destination-bucket을 버킷 이름으로 바꿉니다. 

aws s3api create-bucket \ --bucket amzn-s3-demo-destination-bucket \ --region us-east-1

네임스페이스는 모든 AWS 계정에서 공유되므로 S3 버킷의 이름이 전역적으로 고유한지 확인합니다.

클라우드 아키텍트, 앱 개발자

S3 버킷에 대한 30일 수명 주기 정책을 생성합니다.

  1. AWS Management Console에 로그인한 후 Amazon S3 콘솔을 엽니다. 

  2. Firehose의 데이터가 포함된 S3 버킷을 선택합니다. 

  3. S3 버킷에서 관리 탭을 선택하고 수명 주기 규칙 추가를 선택합니다. 

  4. 수명 주기 규칙 대화 상자에 규칙 이름을 입력하고, 버킷의 30일 수명 주기 규칙을 구성합니다.

클라우드 아키텍트, 앱 개발자
작업설명필요한 기술

Firehose 전송 스트림을 생성하고 구성합니다.

GitHub 리포지토리에서 CreateFireHoseToS3.py 코드 예제를 다운로드하고 편집합니다. 

이 코드는 Python으로 작성되었으며 Firehose 전송 스트림과 AWS Identity and Access Management(IAM) 역할을 생성하는 방법을 보여줍니다. IAM 역할에는 Firehose가 대상 S3 버킷에 쓰는 데 사용할 수 있는 정책이 있습니다.

스크립트를 실행하려면 다음 명령과 명령줄 인수를 사용하십시오.

인수 1=<Your_S3_bucket_ARN>, 사용자가 앞서 생성한 버킷의 Amazon 리소스 이름(ARN)

인수 2= Firehose 이름(이 파일럿은를 사용합니다firehose_to_s3_stream.)

인수 3= IAM 역할 이름(이 파일럿에서 firehose_to_s3 사용)

python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3

지정된 IAM 역할이 없는 경우 스크립트는 신뢰할 수 있는 관계 정책과 충분한 Amazon S3 권한을 부여하는 정책을 사용하여 수임 역할을 생성합니다. 이러한 정책의 예는 추가 정보 섹션을 참조하십시오.

클라우드 아키텍트, 앱 개발자

Firehose 전송 스트림을 확인합니다.

AWS CLI를 사용하여 전송 스트림이 성공적으로 생성되었는지 확인하여 Firehose 전송 스트림을 설명합니다.

aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream
클라우드 아키텍트, 앱 개발자
작업설명필요한 기술

Lambda 함수에 대해 신뢰 정책를 생성합니다.

다음 정보로 신뢰 정책 파일을 생성합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

이렇게 하면 함수에 AWS 리소스에 액세스할 수 있는 권한이 부여됩니다.

클라우드 아키텍트, 앱 개발자

Lambda 함수용 실행 역할을 생성합니다.

실행 역할을 생성하려면 다음 코드를 실행합니다.

aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json
클라우드 아키텍트, 앱 개발자

역할에 권한을 추가하십시오.

역할에 권한을 추가하려면 attach-policy-to-role 명령을 사용합니다.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess
클라우드 아키텍트, 앱 개발자

Lambda 함수를 생성합니다.

다음 명령어를 실행하여 코드 리포지토리의 LambdaStreamProcessor.py 파일을 압축합니다.

zip function.zip LambdaStreamProcessor.py

Lambda 함수를 생성할 때, Lambda 실행 역할 ARN이 필요합니다. ARN을 가져오려면 다음 코드를 실행합니다.

aws iam get-role \ --role-name lambda-ex

Lambda 함수를 생성하려면 다음 코드를 실행합니다.

# Review the environment variables and replace them with your values. aws lambda create-function --function-name LambdaStreamProcessor \ --zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \ --role {Your Lamda Execution Role ARN}\ --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"
클라우드 아키텍트, 앱 개발자

Lambda 함수 트리거를 구성합니다.

AWS CLI를 사용하여 Lambda 함수를 간접 호출하는 트리거(DynamoDB 스트림)를 구성합니다. 배치 크기 400은 Lambda 동시성 문제가 발생하지 않도록 하기 위한 것입니다.

aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \ --batch-size 400 --starting-position LATEST \ --event-source-arn <Your Latest Stream ARN From DynamoDB Console>
클라우드 아키텍트, 앱 개발자
작업설명필요한 기술

타임스탬프가 만료된 항목을 예약 테이블에 추가합니다.

기능을 테스트하려면 에포크 타임스탬프가 만료된 항목을 Reservation 테이블에 추가하십시오. TTL은 타임스탬프를 기반으로 항목을 자동으로 삭제합니다. 

Lambda 함수는 DynamoDB 스트림 활동 시 시작되며 이벤트를 필터링하여 REMOVE 활동 또는 삭제된 항목을 식별합니다. 그런 다음 레코드를 Firehose 전송 스트림에 배치 형식으로 넣습니다.

Firehose 전송 스트림은 firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/ 접두사가 있는 대상 S3 버킷으로 항목을 전송합니다.

중요

데이터 검색을 최적화하려면 추가 정보 섹션에 자세히 ErrorOutputPrefix 설명된 Prefix 및 로 Amazon S3를 구성합니다.

클라우드 아키텍트
작업설명필요한 기술

모든 리소스를 삭제합니다.

모든 리소스를 삭제하여 사용하지 않는 서비스에 대해 요금이 청구되지 않도록 합니다. 

클라우드 아키텍트, 앱 개발자

관련 리소스

추가 정보

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 구성

다음과 PrefixErrorOutputPrefix의 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=06hour=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/로 평가할 수 있습니다.