Amazon Timestreamを試してみた

# 背景・目的
今まで、Timestreamについて、触れたことがなく、知識がなかったので整理します。
また、簡単に試してみます。

# まとめ
下記に特徴を整理します

| 特徴 | 説明
|:--|:--|
|概要|・時系列データベース<BR>・数兆件イベントを保存、分析できる<BR>・キャパシティとパフォーマンスを調整するために、オートスケールする|
|ユースケース|・IoTアプリケーション<BR>・DevOpsアプリケーション<BR>・分析アプリケーション|
|時系列データとは|時間経過とともに変化する事象を測定するために、タイムスタンプとともに記録されたシーケンスデータ|
|Timestreamの特徴|・サーバレス<BR>・コスト最適化<BR>・スケーラブル<BR>・時系列専用<BR>・セキュア|
|アーキテクチャ|・Table<BR>・Time-Series<BR>・Record|
|Table|・タイムシリーズを保持するコンテナ<BR>・テーブル内は暗号化される<BR>・テーブル作成時のスキーマ定義は不要<BR>・カラム定義やインデックス設定は自動で実施<BR>・ストレージ階層とデータ保持ポリシーに基づいたデータライフサイクル管理を自動で実施|
| ストレージ階層の種類|インメモリとマグネティックの2階層をサポート|
| Time-Series|・ある属性値で説明できる時系列に並んだレコードのまとまり<BR>・時系列データないの欠損値は、Time-Series化したデータを使って組み込みの補間関数で値を埋めることが可能|
|Records|・単一の時系列データポイント<BR>・各レコードは、タイムスタンプ、1つ以上のディメンション、及び時間の経過とともに変化するメジャーで構成|
|Dimensions|・各テーブルで128個のディメンションが利用可能<BR>・すべてのディメンションは文字列として扱われる<BR>・ディメンションはデータが取り込まれた時に、動的に追加<BR>・一度定義されたディメンションは変更不可|
|Measure|・測定値<BR>・各レコードはmeasure_nameとmeasure_valueで構成<BR>・各テーブルは1024のメジャーで種類を定義できる<BR>・データ型は、boolean、bigint、double、varchar<BR>・テーブルにデータを追加された時に、動的に追加される<BR>・一度定義されたメジャーは変更不可|



# 概要
[Amazon Timestream](https://aws.amazon.com/jp/timestream/)を元に整理します

> Amazon Timestream は、高速かつスケーラブルなサーバーレス時系列データベースサービスです。1 日あたり数兆件規模のイベントを最大 1,000 倍の速度でより簡単に保存および分析できます。Amazon Timestream は、容量とパフォーマンスを調整するために自動的にスケールアップまたはスケールダウンするので、基盤インフラストラクチャの管理が不要です。

- 時系列データベース
- 数兆件イベントを保存、分析できる
- キャパシティとパフォーマンスを調整するために、オートスケールする

ユースケースは次の通り
- IoTアプリケーション
    - 組み込みの分析関数を使用して、IoTアプリケーションにより生成された時系列データを迅速に分析する
- DevOpsアプリケーション
    - 運用メトリクスを収集および分析して、正常性と使用状況をモニタリングしデータをリアルタイムに分析する
    - パフォーマンスと可視性を改善する
- 分析アプリケーション
    - 分析とインサイトのための追加の集約関数を使用し、アプリケーションの着信と発信Webトラフィックを保存、処理する


## BlackBelt
[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)を元に整理します

### 時系列データとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8c3e16ea-2ab2-a65e-3f04-ca40759d4d31.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- 時間経過とともに変化する事象を測定するために、タイムスタンプとともに記録されたシーケンスデータ

### 活用場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8cf042f4-03f9-30d2-dab1-c7f4a362dbf0.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

| 分類 | ワークロード | 
|:--|:--|
|IoT Application | センサーNW監視|
||在庫計画
||交通の混雑状況や遅延のモニタリング|
||製造・物流の管理|
|Analytics Application |クリックストリーム分析|
||株市場の予測|
||商品需要予測|
||企業データの分析|
|DevOps Application|物理システムのモニタリング|
||アプリケーションのモニタリング|
||ソフトウェアシステムのモニタリング|

### 時系列データを扱う上での課題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3da07843-94b2-c387-8ec4-215d3e0036ad.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- RDB
    - 時系列データを効率良く扱うための設計が必要
    - スキーマが固定され柔軟性に欠ける
    - 時系列データ分析用の機能を必要に応じて独自で実装
- 既存の時系列データソリューション
    - 大規模なデータに対してスケールすることが難しい
    - データライフサイクル管理
    - リアルタイムデータとヒストリカルデータの分離

### Amazon Timestreamの特徴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e535cd51-80ff-1c08-7a08-a3050318001b.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- サーバレスによるインフラ運用負荷軽減
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bea4ba13-bd42-3327-367d-f7b6124f32af.png)

※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- パフォーマンス要求に応じてコストが最適化された異なるストレージ
- 下記に応じた利用料金
    - 取り込んだデータ量
    - 保存したデータ量
    - クエリしたデータ量

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1bd94974-be7c-6f06-e869-b4a995f05837.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- 下記で分離されている。独立して拡張される
    - データIngestion
    - ストレージ
    - クエリプロセッシング

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6f32b18f-9cda-b9e0-75cc-98825616b971.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- 時系列データ嗜好データモデル、平滑化/近似/補間などの時系列関数を提供
- アプリで複雑な計算ロジックの対応が不要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9169600a-f700-1a01-5880-f1c884b59903.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- 通信時は、TLS
- 保管時は、KMSを利用して暗号化
- アクセス管理は、IAMユーザによる認証


### アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4f9af43d-c61f-e2a3-124e-b10a3d49971f.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

下記の構成要素がある
- Table
- Time-Series
- Record

#### テーブル
- タイムシリーズを保持するコンテナ
- テーブル内は暗号化される
- テーブル作成時のスキーマ定義は不要
- カラム定義やインデックス設定は自動で実施
- ストレージ階層とデータ保持ポリシーに基づいたデータライフサイクル管理を自動で実施

##### ストレージ階層の種類
インメモリと、マグネティックの2種類サポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b40374a4-c4e8-2f80-4673-b5ef8fceea36.png)


|大分類|中分類|インメモリ|マグネティック|
|:--|:--|:--|:--|
|特徴|挿入|すべてのデータを取り込み|すべてのデータはインメモリ階層から連携される|
||クエリ|高速ポイントタイムクエリに合わせて最適化|分析クエリに合わせてパフォーマンス最適化される<BR>長期間データの保存に対してコスト効率が高い|
|データライフサイクル管理|保持ポリシー|1H〜最大1年|1日〜最大200年|
||サイクル|保持期間に達したデータをマグネティックに移動する|保持期間に達したデータを削除|


#### Time-Series
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ac3f0471-fa54-e0b1-c877-0746ad39c409.png)

※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

- ある属性値で説明できる時系列に並んだレコードのまとまり
- 時系列データないの欠損値は、Time-Series化したデータを使って組み込みの補間関数で値を埋めることが可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/be2fc77d-6774-bed2-6b8a-a8b910cde8e2.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

#### Records

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4f1914c4-74af-d8ab-4b9b-19f7db165b9e.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)


- 単一の時系列データポイント
- 各レコードは、タイムスタンプ、1つ以上のディメンション、及び時間の経過とともに変化するメジャーで構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6b946c93-eb17-b9a7-da43-006cd832f6cc.png)
※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

#### Dimensions
- 各テーブルで128個のディメンションが利用可能
- すべてのディメンションは文字列として扱われる
- ディメンションはデータが取り込まれた時に、動的に追加
- 一度定義されたディメンションは変更不可

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5e20b102-4c8b-4777-fa2f-50796e8237e2.png)

※出典：[20201216 AWS Black Belt Online Seminar Amazon Timestream](https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream)

#### Measures
- 測定値
- 各レコードはmeasure_nameとmeasure_valueで構成
- 各テーブルは1024のメジャーで種類を定義できる
- データ型は、boolean、bigint、double、varchar
- テーブルにデータを追加された時に、動的に追加される
- 一度定義されたメジャーは変更不可

## Amazon Timestream for InfluxDBと Amazon Timestream for LiveAnalytics
2つのデータベースサービスがあり、どちらを使えばわかりませんでしたが、クラスメソッドさんがまとめてくださっていました。
クラスメソッドさんの、[Amazon Timestream for InfluxDBを試した所感 (2024年3月時点)](https://dev.classmethod.jp/articles/personal-opinion-on-amazon-timestream-for-influxdb-202403/)を元に整理しています。


- Amazon Timestream for InfluxDBはどちらかというとRDSやDocumentDBの仲間とのこと

|項目 |LiveAnalytics|InfluxDB|
|:--|:--|:--|
|DB|AWS 独自|OSS版InfluxDB|
|NW|非VPC|要VPC|
|データアクセス|AWSのAPI|InfluxDBのAPI|
|スケーラビリティ|スケーラブル|限定的|

※出典：クラスメソッド [Amazon Timestream for InfluxDBを試した所感 (2024年3月時点)](https://dev.classmethod.jp/articles/personal-opinion-on-amazon-timestream-for-influxdb-202403/)


## 料金
[Amazon Timestream の料金](https://aws.amazon.com/jp/timestream/pricing/)を元に整理します。

:::note info
- 最新の料金はマニュアルをご確認ください
- 2024/3/31時点の東京リージョンの料金です
- Amazon Timestream for LiveAnalyticsの料金を試算しています
:::

- 書き込み
    - 1Kサイズの書き込みが100万件で、0.625USD
    - バッチロードの書き込みについては、S3のGETについても課金される
- クエリ
    - 1GBあたり 0.0125USD
    - クエリごと最小10MBになるようだ
- メモリストア
    - GB/時間あたり、0.045USD
- マグネティックストア
    - GB/月あたり 0.0375USD

# 実践
[チュートリアル](https://docs.aws.amazon.com/timestream/latest/developerguide/getting-started.db-w-sample-data.html)を元に試してみます。

## データベースの作成

1. AWSにサインインし、Timestreamのトップページに遷移します
1. Timestreamサーバレスを選択し、「データベースを作成」をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f9d64e66-3e67-0f7a-3bb3-9bcace53f767.png" width=200 />

1. データベース設定で「サンプルデータベース」を選択します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4a9be060-b08d-cad6-0761-26221db0a15b.png)

1. サンプルデータを含むテーブルでは、下記を選択し、「データベースを作成」をクリックします
    - サンプルデータセット：「IoT」と「DevOps」
    - 時系列レコードタイプ：マルチメジャーレコード
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/48dc3861-7d48-d647-4cfb-e4bc4590dc20.png)

1. できました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8aaa0677-4f50-e767-5992-013f8f9ccf67.png)

## クエリを実行する
### スキーマを確認する
1. スキーマを表示をクリックします
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/aa4f3f52-4bfc-88c2-2fb3-91aa35b367e4.png" width=300 />

1. 表示されました
    - attribute typeには下記の4つがありました
        - TIMESTAMP
        - MULTI
        - DIMENSION
        - MEASURE_NAME
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e82c8d68-0f4a-ed83-7bc9-5690c2b259bf.png)

    
### データを確認する
1. ナビゲーションペインで「クエリエディタ」をクリックします
1. 2つのテーブルが、存在することがわかります
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2586057b-fe57-c974-f636-ddfa5d504e72.png" width=300 />

1. データをプレビューをクリックし、実行します
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/94989ab8-79c4-426e-ac87-1fb3327b1914.png" width=300 />

1. 下記のクエリが実行されます
    - 15分前〜直近までのレコードが確認できたようです
    ```
    -- Get the 10 most recently added data points in the past 15 minutes. You can change the time period if you're not continuously ingesting data
    SELECT * FROM "sampleDB"."IoTMulti" WHERE time between ago(15m) and now() ORDER BY time DESC LIMIT 10 
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c1c508a6-91b2-fe95-b3ce-24fe04702ed4.png)


#### Measure nameを確認
1. 下記のクエリを確認します。1レコードしか入っていませんでした。
    ```
    SELECT distinct measure_name from "sampleDB"."IoTMulti" 
    ```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/143ba064-e972-6896-166b-ea599ce87189.png)


#### COUNT
1. 下記のクエリを実行します
    ```
    SELECT  COUNT(1) from "sampleDB"."IoTMulti" 
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/48496aa4-d4e3-c2ab-335d-412e129b44ae.png)


#### MAX
1. 下記のクエリを実行します
    ```
    SELECT MAX(fuel_capacity) from  "sampleDB"."IoTMulti" 
    ```
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f24c85a6-d3c4-884c-d88d-30af4e728a71.png" width=300 />


## あと始末
1. データベースを選択し「削除」をクリックします
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eb97d9b9-7a7e-6789-fbc6-9561ad43bacc.png)

1. 一度テーブルをきれいにしないといけないようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e413208c-3bd3-e769-28ad-6fa829fcc68a.png)

1. テーブルをクリックします
1. 該当するテーブルを選択し、「削除」をクリックします

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/98791e9f-1ef9-a529-6d5f-e146d8655e64.png)

1. ポップアップが上がるので「delete」を入力し削除します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/dffc57a1-4abc-c5db-6071-60df59e1adb1.png)

1. データベースをクリックします
1. データベースを選択し、削除します
1. ポップアップが上がるので「delete」を入力し「削除」します
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5dc937ed-8e40-db76-8c3c-e5f28fc568d1.png)

1. きれいになりました
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/257573ac-b05f-e8d7-dff7-8591a4167d4e.png)



# 考察
はじめて、Timestreamを触りました。時系列DB特有の考えがあり、新鮮でした。
属性タイプごとの意味が最初は、つかめませんでしたが、下記のように理解しました。（MEASURE_NAMEだけよくわからない）
- TIMESTAMP: レコードが記録された日時
- DIMENSION： レコードの切り口というかメタ情報のようなもの
- MEASURE:   計測した値
- MEASURE_NAME: どうやら顧客でパーティションキーを指定しない場合、measure_nmame列に基づくデフォルトパーティションを使用するようです

また、SQLもある程度使えそうなので、取り扱いには困らなそうです。


まだまだ、初歩の初歩なので、もっと理解すべく今後も利用していきたいと思います。



# 参考
https://docs.aws.amazon.com/ja_jp/whitepapers/latest/aws-overview/database.html

https://docs.aws.amazon.com/ja_jp/timestream/latest/developerguide/what-is-timestream.html

https://aws.amazon.com/jp/timestream/

https://www.slideshare.net/AmazonWebServicesJapan/20201216-aws-black-belt-online-seminar-amazon-timestream

https://dev.classmethod.jp/articles/personal-opinion-on-amazon-timestream-for-influxdb-202403/

https://aws.amazon.com/jp/timestream/pricing/