DynamoDBの料金を最適化しよう【初級編】

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

DynamoDBの料金体系って難しくてよくわからないと思っている方も多いかもしれません。私もその一人でした。

今回はどのようにすればDynamoDBを安く利用できるのかについて、まとめてみたいと思います。

本ブログのコンセプト

  • DynaomDBをこれから利用する、もしくはとりあえず利用しているが熟知はしていない方向け
  • 利用料金の最適化に必要な範囲の説明を行う
  • キャパシティーユニット等のわかりにくい用語についても少し解説を入れる
  • RDSとの比較などは行わない
  • 大規模であったり、細かいチューニングを伴うような部分は割愛

なお、上級者向けの内容は含まれていませんのでご了承下さい。

RDSとの比較やDynamoDBの詳細な使い方などは、弊社都元が執筆しているコンセプトから学ぶAmazon DynamoDB – シリーズ –がむちゃくちゃ参考になるので、こちらも御覧ください。投稿順で(下から)見るのがオススメです。

DynamoDBの料金体系

DynamoDBの料金を決める要素は大きく3つあります。

  • キャパシティーユニット
  • ストレージ容量
  • データ転送量

その他にもDAXやストリームなどもありますが、必ずしも利用するものではないのでここでは割愛します。

公式の料金情報は料金 - Amazon DynamoDB(NoSQLデータベース)|AWSにあります。以下記載の料金は2017/11/06現在の東京リージョンの料金をベースに算出しています。

料金の考え方と最適化

それぞれの要素の説明と、それに応じた最適化について説明していきます。

キャパシティーユニット

正直この要素が一番わかりづらいと思いますが、まず簡単に結論を述べます。

  • キャパシティーユニットは利用量を推測してなるべく小さくする(ただしやりすぎない)
  • 利用量が定量であることが見込めるのであればリザーブドキャパシティーを購入する
  • 使わないDBは消す

順に説明していきます。

キャパシティーユニットとは

簡単に言うと読み込み/書き込み容量です。

DynamoDBではキャパシティーユニットを事前に設定して、読み込み/書き込み容量の上限を決めることにより料金が決定します。

1キャパシティーユニットは1秒間に決められた回数の読み込み/書き込み容量を提供し、利用している時間分料金がかかります。

実際に読み込み/書き込みした量に応じて料金がかかるわけではない事に注意が必要です。その為、利用量を事前に推測して、キャパシティーユニットを設定しましょう。

2017/11/06現在の東京リージョンの料金を簡単に書くと下記のようになっています。

プロビジョニングするスループットタイプ 1時間あたりの料金 パフォーマンス
書き込みキャパシティーユニット (WCU): 0.000742USD/WCU 1WCUは1秒間に1回の書き込み
読み込みキャパシティーユニット (RCU): 0.0001484USD/RCU 1RCUは1秒間に2回の読み込み、または結果整合性のある1回の読み込み

例えば、デフォルトのままとりあえずDynamoDBを作成すると読み込み/書き込みがそれぞれ5/5キャパシティーユニットで作成されますが、このDBは1秒間に5回の書き込みと10回の通常の読み込みができ、料金は月あたり約3.2USD(上記ベース)となります。

細かい計算は以下の通りです。

書き込み: 0.000742USD * 5キャパシティーユニット * 24時間 * 30日 = 2.67USD

読み込み: 0.0001484USD * 5キャパシティーユニット * 24時間 * 30日 = 0.53USD

合計: 3.2USD(1ヶ月あたりのキャパシティーユニット料金)

キャパシティーユニットについての詳細は下記でも説明されています。

よくある質問 - Amazon DynamoDB(NoSQLデータベース)|AWS

なお、1キャパシティーユニットには書き込みが1KB、読み込みが4KBまでと制限があり、これを超える場合には追加でキャパシティーユニットが必要であることにも注意が必要です。

キャパシティーユニットは利用量を推測してなるべく小さくする(ただしやりすぎない)

事前に設定した分だけお金がかかるので、当然ギリギリのキャパシティーにすればその分安く利用することが可能です。

キャパシティーの詰め方ですが、5WCUについて考えた時に、1秒間に5回の書き込みと聞くと少ないように感じて大きく見積もりがちですが、例えば5分間で5WCU * 60秒 * 5分 = 1,500回の書き込み、1時間で18,000回の書き込みとなりそこまで少なくないと感じる場合もあると思います。

特に規模の小さいシステムであれば、読み込み/書き込み失敗時のリトライを適切に設計しつつキャパシティーユニットを少なくするといいでしょう。

ただし、小さくしすぎるとキャパシティーが足りずに読み込み/書き込みできなくなるので非常にインパクトが大きいです。まず最初は余裕を持って容量を設定し、CloudWatchなどで利用量を監視しながら、徐々に最適化しましょう。

実際の利用量を確認する場合には、CloudWatchのConsumedReadCapacityUnitsConsumedWriteCapacityUnitsを確認しましょう。

CloudWatch_Management_Console

バーストオートスケール等でキャパシティー超過に対応することもできますが、あくまで保険的な役割であると考え、頼りすぎないようにしましょう。

利用量が定量であることが見込めるのであればリザーブドキャパシティーを購入する

DynamoDBでは毎月決まった量を利用することがわかっていればリザーブドキャパシティーを購入することで安く利用できます。

細かい料金については記載しませんが、1年間もしくは3年間のコミットで100RCU/WCU単位で購入でき、1年間は約53%、3年は76%のコスト削減が期待できます。

詳細は下記をご参照下さい。

DynamoDBのリザーブドキャパシティを購入してみた

最低限利用するキャパシティーユニットが100を超える場合には、検討しましょう。

使わないDBは消す

Lambdaみたいに、作っても利用しないまま放置していても料金がかからない、なんてことはありません。

稼働時間分請求されるので、検証用などの使わないDBは消しましょう。

ストレージ容量

DynamoDBに保存されているデータの容量に応じで課金されます。料金は以下のようになっています。

  • 毎月最初の 25 GB の保管は無料
  • それ以降は月額 0.285USD/GB

非常にシンプルですね。

ストレージについてはS3と比べると分かりやすいのですが、S3では月額 0.025USD/GBに対して約10倍の料金になります。

この点からも、大きいデータの保存には向かないことがわかります。大きいデータについてはS3に保存し、保存先についての情報のみDynamoDBに入れるなど、データ量を少なくする工夫をしましょう。

データ転送量

これはどのAWSサービスでも概ね同じですが、データのアウトに料金がかかります。

転送されたデータ 料金
データ転送受信(イン)
すべてのデータ転送受信 (イン) 0.00USD/GB
データ転送送信(アウト)
1 GB/月まで 0.00USD/GB
次の 9.999 TB/月 0.14USD/GB

不要なデータの取り出しは少なくするようにした方がいいです。

GetItemを行う際に、ProjectionExpressionを指定することによって必要な要素を絞ることが出来るので、一つのItemに大量のデータが紐付いている場合にはこれを活用するのも選択肢の一つです。

まとめ

長くなりましたが、一番肝になるのはやはりキャパシティーユニットです。

容量の見積もりは絞りすぎると痛い目を見るので、余裕を持って見積もりCloudWatchを監視して絞って行きましょう。

安定した後にはリザーブドキャパシティーの検討もお忘れなく!