Amazon Timestreamの料金計算方法
これはInfocom Advent Calendar 2021 4日目の記事です.
経緯
前から欲しかったTWELITE PALを購入しラズパイと接続ができたので, クラウドにデータを溜めて可視化するために,Amazon Timestreamを使ってみようと思っています.
cf. TWELITE PALとMONOSTICKを接続する | ottijp blog
しかし,公式の料金説明や計算ツールを見ても,いまいち計算方法がわからなかったので,実際に数値を当てはめながら計算方法を理解しました. この記事では,理解したことを解説します.
ちなみに,Amazon TimestremはまだAWS Pricing Calculatorが対応しておらず, 計算ツール(Excelファイル)が提供されています. 公式ページの料金ページからリンクされているので,一応公式のもの?っぽいです. 計算方法の詳細を知らなくても,このツールを使えば計算はできます.
この記事では,料金はオレゴン(us-west-2)の単価で計算しています.
課金される項目
- 書き込み
- メモリストア
- マグネティックストア
- SSDストア(近日公開とのこと)
- クエリ
- データ転送
この記事ではSSDストアとデータ転送については説明しません.
書き込むデータの前提
次のような温度データを書き込むとします.
アトリビュート | データタイプ | 名称 | 値 | 名称の長さ | 値の長さ | アトリビュートのサイズ |
---|---|---|---|---|---|---|
タイムスタンプ | - | - | 2021-12-04T01:02:03.000 | - | 8 | 8 |
ディメンション | string | sensor_id | s001 | 9 | 4 | 13 |
ディメンション | string | facility | myhome | 8 | 6 | 14 |
メジャー | double | temperature | 15.5 | 11 | 8 | 19 |
- タイムスタンプやstring以外のデータタイプの値の長さはTimestreamの仕様で決まっています.
- 実際にはそれぞれのデータごとにサイズは異なることが多いので,典型的(平均的)なデータで計算するのが良さそうです.
書き込み
料金は,Timestreamへの書き込み回数で決まります. 1KBを超えるデータの書き込みは,1KB単位でカウントされます.
ここでは100個のセンサが1分に1度データを発生させる条件で計算してみます.
1データごとに書き込む場合
- 月あたりの書き込み回数 = 100回/分 x 60分 x 24時間 x 30日 = 4,320,000回
- 月あたりの書き込み料金 = 4,320,000回 x $0.50/1,000,000回 = $2.16
バッチ書き込みする場合
1回の書き込みあたり1KBまで可能なので,前提データ(54bytes)を18データまでバッチ書き込みすることで,書き込み回数を減らすことができます.
- 月あたりの書き込み回数 = ceil(100 / 18)回/分 x 60分 x 24時間 x 30日 = 259,200回
- 月あたりの書き込み料金 = 259,200回 x $0.50/1,000,000回 = $0.1295
データ発生から登録までの遅延などを考慮する必要はありますが, 小さいデータを発生都度Timestreamに書き込むのではなく, アグリゲータがまとめてバッチ書き込みしたほうが良さそうです.
コモンアトリビュートでさらに書き込み回数を減らす場合
コモンアトリビュートを使うことで,書き込み回数をさらに減らせる場合があります. 例えば,前提データのfacilityがバッチ書き込みの全データで同じであれば,これをコモンアトリビュートにするとを考えます. この場合,コモンアトリビュートが14bytes,それ以外が40bytes(8+13+19)となるので, 1KBあたり24データ(floor((1000-14)/40))を入れることができます.
- 月あたりの書き込み回数 = ceil(100 / 24)回/分 x 60分 x 24時間 x 30日 = 216,000回
- 月あたりの書き込み料金 = 216,000回 x $0.50/1,000,000回 = $0.108
メモリストア
料金は,格納したデータ量で決まります. 書き込みについてはコモンアトリビュートでコスト効率を高めることが可能ですが, メモリストアの料金は,格納されるデータ量で決まる点に注意です. (コモンアトリビュートは,格納後に各レコードで共有されず,それぞれのレコードのデータ量となる.)
ここでは100個のセンサが1分に1度データを発生させ, メモリストアのデータ保持期間を24時間とした条件で計算してみます.
- 24時間当たりのデータ量 = 54bytes/データ x 100データ/分 x 60分 x 24時間 = 7.776MB
- 月あたりのデータ量時間 = 7.776MB x 24時間 x 30日 = 5.599GB時
- 月あたりのデータ料金 = 5.599GB時 x $0.036/GB時 = $0.201564
$0.036/GBという単価は,GB時間の(1GBを1時間保持する)価格なので, 1ヶ月継続的に保持するためのデータ量時間は,上記の計算ように24時間x30日分必要になります.
マグネティックストア
料金の計算は,単価が異なる($0.03/GB月)だけで,メモリストアと同じです. メモリストアがGB時単位の料金であるのと異なり,マグネティックストアはGB月単位の料金です.
ここでは100個のセンサが1分に1度データを発生させ, メモリストアのデータ保持期間を1年とした条件で計算してみます.
- 1年当たりのデータ量 = 54bytes/データ x 100データ/分 x 60分 x 24時間 x 365日 = 2.83824GB
- 月あたりのデータ量時間 = 2.83824GB x 1ヶ月 = 2.83824GB月
- 月あたりのデータ料金 = 2.83824GB月 x $0.03/GB月 = $0.0851472
クエリ
料金は,クエリしたときにスキャンされたデータ量で決まります. 多くのアプリケーションはアドホックな検索などがあるので,料金計算のための現実的な条件設定が一番難しい項目だと思います.
ここでは,7日分の54.432MBのデータに対し, (ディメンションなどで条件を絞ることで)そのうち20%をスキャンするクエリを, 1日あたり100回実行する条件で計算してみます.
- 月あたりのスキャンデータ量: 54.432MB x 20% x 100回/日 x 30日 = 32.6592GB
- 月あたりのクエリ料金: 32.6592GB x $0.01/GB = $0.326592
上記の計算には当てはまりませんが,1クエリあたりのスキャンデータ量が10MB未満のクエリは10MBとして計算されるので,注意です.
クエリの料金は,対象期間(母数)やそのうち何割のデータがスキャンされるかなどの条件によって大きく変わるため, ユーザが自由に条件を変えて何度もクエリが発行できるようなアプリケーションだと, 予算を大きく超えてしまう可能性がある点が注意かなと思います.
料金を安くするための工夫
まだ実際に使っておらずドキュメントを読んだだけですが,以下のような点で料金を安くすることができるのではないかと思います.
- 書き込みはできるだけバッチ書き込みやコモンアトリビュートを使う
- 必要最小限の頻度でデータを発生させる(書き込み回数,格納データ量を適正化する)
- 符号化できるアトリビュート名や値は符号化して,データサイズを小さくする
- ユーザによる自由なクエリを発生させないようなコントロールやアプリケーション設計を行う