DynamoDB TTL を使用して項目を Amazon S3 に自動的にアーカイブする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

DynamoDB TTL を使用して項目を Amazon S3 に自動的にアーカイブする

作成者: Tabby Ward (AWS)

コードリポジトリ: DynamoDB TLL を使用して S3 に項目をアーカイブする

環境:PoC またはパイロット

テクノロジー: モダナイゼーション、データベース、サーバーレス、ストレージとバックアップ、コスト管理

ワークロード: オープンソース

AWS サービス: Amazon S3、Amazon DynamoDB、Amazon Kinesis、AWS Lambda

[概要]

このパターンでは、サーバー群を管理しなくても、Amazon DynamoDB テーブルから古いデータを削除し、Amazon Web Services (AWS) の Amazon Simple Storage Service (Amazon S3) バケットにアーカイブする手順を示します。 

このパターンでは、Amazon DynamoDB の Time-toLive (TTL) を使用して古い項目を自動的に削除し、Amazon DynamoDB Streams を使用して TTL の有効期限が切れた項目をキャプチャします。次に DynamoDB Streams を AWS Lambda に接続し、サーバーをプロビジョニングしたり管理したりせずにコードを実行します。 

新しい項目が DynamoDB ストリームに追加されると、Lambda 関数が開始され、データが Amazon Data Firehose 配信ストリームに書き込まれます。Firehose は、データをアーカイブとして Amazon S3 にロードするためのシンプルでフルマネージド型のソリューションを提供します。

DynamoDB は、ウェブページのクリックストリームデータや、センサーや接続されたデバイスからのモノのインターネット (IoT) データなどの時系列データを保存するためによく使用されます。アクセス頻度の低い項目を削除するのではなく、監査目的でアーカイブしたいと考えるお客様が多くいます。TTL は、タイムスタンプ属性に基づいてアイテムを自動的に削除することで、このアーカイブを簡素化します。 

TTL によって削除された項目は DynamoDB Streams で識別できます。DynamoDB Streams は、DynamoDB Streams で識別できます。DynamoDB Streams は、項目レベルの変更に関するシーケンスを時間順にキャプチャし、そのシーケンスを最大 24 時間ログに保存します。このデータは Lambda 関数で使用して Amazon S3 バケットにアーカイブすることで、ストレージコストを削減できます。コストをさらに削減するために、Amazon S3 ライフサイクルルールを作成して、(作成されるとすぐに) データを最も低コストのストレージクラス (S3 Glacier インスタント取得、S3 Glacier フレキシブル取得、長期ストレージ用の Amazon S3 Glacier Deep Archive など) に自動的に移行できます。

前提条件と制限

前提条件

アーキテクチャ

テクノロジースタック

  • Amazon DynamoDB

  • Amazon DynamoDB Streams

  • Amazon Data Firehose

  • AWS Lambda

  • Amazon S3

  1. アイテムは TTL によって削除されます。

  2. DynamoDB ストリームトリガーは Lambda ストリームプロセッサ関数を呼び出します。

  3. Lambda 関数は、レコードを Firehose 配信ストリームにバッチ形式で配置します。

  4. データレコードは S3 バケットにアーカイブされます。

ツール

  • AWS CLI – AWS コマンドラインインターフェイス (AWS CLI) は、AWS のサービスを管理するための統合ツールです。

  • Amazon DynamoDB – Amazon DynamoDB は、どのような規模でも一桁のミリ秒単位のパフォーマンスを実現するキーバリューおよびドキュメントデータベースです。

  • 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 (Amazon S3) は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージサービスです。

Code

このパターンのコードは、 GitHub DynamoDB TTL リポジトリを使用した S3 へのアーカイブ項目で使用できます。

エピック

タスク説明必要なスキル

DynamoDB テーブルを作成します。

AWS CLI を使用して、Reservation というテーブルを DynamoDB に作成します。ランダムな読み取りキャパシティユニット (RCU) と書き込みキャパシティユニット (WCU) を選択し、テーブルに 2 つの属性 (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 を置き換えます。 

aws s3api create-bucket \ --bucket reservationfirehosedestinationbucket \ --region us-east-1

ネームスペースはすべての AWS アカウントで共有されるため、S3 バケットの名前がグローバルに一意であることを確認してください。

クラウドアーキテクト、アプリ開発者

S3 バケットの 30 日間のライフサイクルポリシーを作成する。

  1. AWS マネジメントコンソールにサインインし、Amazon SNS コンソールを開きます。 

  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 関数を作成するには、次のコードを実行します。

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 = arn:aws:s3:::reservationfirehosedestinationbucket,iam_role_name = firehose_to_s3, batch_size=400}"
クラウドアーキテクト、アプリ開発者

Lambda 関数のトリガーを設定する。

AWS CLI を使用して Lambda 関数を呼び出すトリガー (DynamoDB Streams) を設定します。バッチサイズを 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 テーブルに追加する。

機能をテストするには、エポックタイムスタンプが期限切れの項目を Reservation テーブルに追加します。TTL はタイムスタンプに基づいて自動的に項目を削除します。 

Lambda 関数は DynamoDB ストリームのアクティビティ時に開始され、イベントをフィルタリングして REMOVE アクティビティや削除された項目を識別します。次に、レコードを Firehose 配信ストリームにバッチ形式で配置します。

Firehose 配信ストリームは、 firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/ プレフィックスを持つ送信先 S3 バケットに項目を転送します。

重要: データ取得を最適化するには、「追加情報」セクションで詳しく説明されている PrefixErrorOutputPrefix を使用して 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 の設定

データ取得を最適化するために、次の 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=2020month=11day=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/ と評価される可能性があります。