

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

# DynamoDB TTL を使用して項目を Amazon S3 に自動的にアーカイブする
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward、Amazon Web Services*

## 概要
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-summary"></a>

このパターンでは、サーバー群を管理しなくても、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 ライフサイクルルール](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)を作成して、データを自動的に (作成後すぐに) 最低コストの[ストレージクラス](https://aws.amazon.com/s3/storage-classes/)に移行できます。

## 前提条件と制限事項
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ macOS、Linux、または Windows にインストールおよび設定されている [AWS コマンドラインインターフェイス (AWS CLI) バージョン 1.7 以降](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html)。
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) 以降。
+ インストールおよび設定されている [Booto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)。Boto3 がまだインストールされていない場合は、`python -m pip install boto3` コマンドを実行してインストールします。

## アーキテクチャ
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-architecture"></a>

**テクノロジースタック**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Amazon S3

![\[DynamoDB から S3 バケットへの 4 ステップのプロセス。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


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

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

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

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

## ツール
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) – AWS コマンドラインインターフェイス (AWS CLI) は、AWS のサービスを管理するための統合ツールです。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – Amazon DynamoDB は、どのような規模でも一桁のミリ秒単位のパフォーマンスを実現するキーバリューおよびドキュメントデータベースです。
+ [Amazon DynamoDB Time to Live (TTL)](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html) – Amazon DynamoDB TTL は、項目ごとのタイムスタンプを定義して、項目がいつ不要になるかを判断するのに役立ちます。
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html) – Amazon DynamoDB Streams は、DynamoDB テーブル内の項目レベルの変更の時系列シーケンスをキャプチャし、この情報をログに最大 24 時間保存します。
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) – Amazon Data Firehose は、ストリーミングデータをデータレイク、データストア、分析サービスに確実にロードする最も簡単な方法です。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda を使用すると、サーバーのプロビジョニングや管理を必要とせずにコードを実行できます。支払いは、使用したコンピューティング時間に対する料金のみになります。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) – Amazon Simple Storage Service (Amazon S3) は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、パフォーマンスを提供するオブジェクトストレージサービスです。

**コード**

このパターンのコードは、GitHub 内の「[Archive items to S3 using DynamoDB TTL](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl)」リポジトリで利用できます。

## エピック
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### DynamoDB テーブル、TTL、および DynamoDB ストリームをセットアップする
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DynamoDB テーブルを作成します。 | AWS CLI を使用して、`Reservation` というテーブルを DynamoDB に作成します。ランダムな読み取りキャパシティユニット (RCU) と書き込みキャパシティユニット (WCU) を選択し、テーブルに 2 つの属性 (`ReservationID` と `ReservationDate`) を与えます。 <pre>aws dynamodb create-table \<br />--table-name Reservation \<br />--attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \<br />--key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \<br />--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100 </pre>`ReservationDate` は、TTL を有効にするために使用されるエポックタイムスタンプです。 | クラウドアーキテクト、アプリ開発者 | 
| DynamoDB TTL を有効にする。 | AWS CLI を使用して `ReservationDate` 属性の DynamoDB TTL を有効にします。<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | クラウドアーキテクト、アプリ開発者 | 
| DynamoDB ストリームをオンにする。 | AWS CLI を使用して、`NEW_AND_OLD_IMAGES` ストリームタイプを使用して `Reservation` テーブルの DynamoDB ストリームを有効にします。 <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre>このストリームには、新しい項目、更新された項目、削除された項目、および TTL によって削除された項目のレコードが含まれます。TTL によって削除されたアイテムのレコードには、手動で削除されたアイテムと区別するためのメタデータ属性が追加されています。TTL 削除の `userIdentity` フィールドは、DynamoDB サービスが削除アクションを実行したことを示します。 このパターンでは、TTL によって削除されたアイテムのみがアーカイブされますが、`eventName` が `REMOVE` で、`userIdentity` に `dynamodb.amazonaws.com` に等しい `principalId` が含まれるレコードのみをアーカイブすることもできます。 | クラウドアーキテクト、アプリ開発者 | 

### S3 バケットの作成と設定
<a name="create-and-configure-an-s3-bucket"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| S3 バケットを作成する。 | AWS CLI を使用して AWS リージョンに宛先 S3 バケットを作成し、`us-east-1` をリージョンに、amzn-s3-demo-destination-bucket をバケットの名前に置き換えます。 <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre>名前空間はすべての AWS アカウントによって共有されているので、S3 バケット名はグローバルに一意であることを確認します。 | クラウドアーキテクト、アプリ開発者 | 
| S3 バケットの 30 日間のライフサイクルポリシーを作成する。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | クラウドアーキテクト、アプリ開発者 | 

### Firehose 配信ストリームを作成する
<a name="create-a-akf-delivery-stream"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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` を使用) <pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre>指定した IAM ロールが存在しない場合、スクリプトは信頼できる関係ポリシーと、十分な Amazon S3 アクセス権限を付与するポリシーを使用してアサインロールを作成します。これらのポリシーの例については、「*追加情報*」セクションを参照してください。 | クラウドアーキテクト、アプリ開発者 | 
| Firehose 配信ストリームを確認する。 | AWS CLI を使用して Firehose 配信ストリームを記述し、配信ストリームが正常に作成されたことを確認します。<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | クラウドアーキテクト、アプリ開発者 | 

### Firehose 配信ストリームを処理する Lambda 関数を作成する
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Lambda 関数の信頼ポリシーを作成する。 | 次の情報を使用して信頼ポリシーファイルを作成します。<pre> {<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />      {<br />          "Effect": "Allow",<br />          "Principal": {<br />              "Service": "lambda.amazonaws.com"<br />           },<br />           "Action": "sts:AssumeRole"<br />      }<br />    ]<br />  } </pre>これにより、関数に AWS リソースへのアクセス権限が付与されます。 | クラウドアーキテクト、アプリ開発者 | 
| Lambda 関数の実行ロールを作成する。 | 実行ロールを作成するには、次のコードを実行します。<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | クラウドアーキテクト、アプリ開発者 | 
| ロールにアクセス権限を追加します。 | ロールにアクセス権限を追加するには、`attach-policy-to-role` コマンドを使用します。<pre>aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess </pre> | クラウドアーキテクト、アプリ開発者 | 
| Lambda 関数を作成する。 | 次のコマンドを実行して、コードリポジトリから `LambdaStreamProcessor.py` ファイルを圧縮します。<pre>zip function.zip LambdaStreamProcessor.py</pre>Lambda 関数を作成するときは、Lambda 実行ロール ARN が必要になります。ARN を取得するには、次のコードを実行します。<pre>aws iam get-role \<br />--role-name lambda-ex </pre>Lambda 関数を作成するには、次のコードを実行します。<pre># Review the environment variables and replace them with your values.<br /><br />aws lambda create-function --function-name LambdaStreamProcessor \<br />--zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \<br />--role {Your Lamda Execution Role ARN}\<br />  --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"</pre> | クラウドアーキテクト、アプリ開発者 | 
| Lambda 関数のトリガーを設定する。 | AWS CLI を使用して Lambda 関数を呼び出すトリガー (DynamoDB Streams) を設定します。バッチサイズを 400 にするのは、Lambda の同時実行の問題が発生しないようにするためです。<pre>aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \<br />--batch-size 400 --starting-position LATEST \<br />--event-source-arn <Your Latest Stream ARN From DynamoDB Console></pre> | クラウドアーキテクト、アプリ開発者 | 

### 関数をテストする
<a name="test-the-functionality"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| タイムスタンプが期限切れの項目を Reservation テーブルに追加する。 | 機能をテストするには、エポックタイムスタンプが期限切れの項目を `Reservation` テーブルに追加します。TTL はタイムスタンプに基づいて自動的に項目を削除します。 Lambda 関数は DynamoDB ストリームのアクティビティ時に開始され、イベントをフィルタリングして `REMOVE` アクティビティや削除された項目を識別します。次に、Firehose 配信ストリームにレコードをバッチ形式で格納します。Firehose デリバリーストリームは、`firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/` プレフィックスが付いた送信先 S3 バケットにアイテムを転送します。データ取得を最適化するには、「*追加情報*」セクションで詳しく説明されている `Prefix` と `ErrorOutputPrefix` を使用して Amazon S3 を設定します。 | クラウドアーキテクト  | 

### リソースをクリーンアップする
<a name="clean-up-the-resources"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| すべてのリソースを削除する。 | 使用していないサービスに対して課金されることがないように、リソースをすべて削除します。  | クラウドアーキテクト、アプリ開発者 | 

## 関連リソース
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Managing your storage lifecycle](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Amazon S3 ストレージクラス](https://aws.amazon.com/s3/storage-classes/)
+ [AWS SDK for Python (Boto3) documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## 追加情報
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**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 の設定が選択されています。 

*Prefix*

```
firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/
```

Firehose は最初に S3 バケットの直下に `firehosetos3example` という名前のベースフォルダを作成します。次に、`!{timestamp:yyyy}`、`!{timestamp:MM}`、`!{timestamp:dd}` および `!{timestamp:HH}` という式を評価し、Java [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) フォーマットを使用して年、月、日、時間に変換します。

例えば、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/` と評価される可能性があります。