翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 ライフサイクルルールを作成して、(作成されるとすぐに) データを最も低コストのストレージクラス
前提条件と制限
前提条件
アクティブなAWS アカウント
macOS、Linux、または Windows にインストールおよび設定されている AWS コマンドラインインターフェイス (AWS CLI) バージョン 1.7 以降。
Python 3.7
以降。 インストールおよび設定されている Booto3
。Boto3 がまだインストールされていない場合は、 python -m pip install boto3
コマンドを実行してインストールします。
アーキテクチャ
テクノロジースタック
Amazon DynamoDB
Amazon DynamoDB Streams
Amazon Data Firehose
AWS Lambda
Amazon S3
![](images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)
アイテムは TTL によって削除されます。
DynamoDB ストリームトリガーは Lambda ストリームプロセッサ関数を呼び出します。
Lambda 関数は、レコードを Firehose 配信ストリームにバッチ形式で配置します。
データレコードは 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 を使用して、
| クラウドアーキテクト、アプリ開発者 |
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 Streams) を設定します。バッチサイズを 400 にするのは、Lambda の同時実行の問題が発生しないようにするためです。
| クラウドアーキテクト、アプリ開発者 |
タスク | 説明 | 必要なスキル |
---|---|---|
タイムスタンプが期限切れの項目を Reservation テーブルに追加する。 | 機能をテストするには、エポックタイムスタンプが期限切れの項目を 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/
と評価される可能性があります。