
はじめに
製造・エネルギー事業部所属の八木です。
AWSコストの内訳で大きな割合を占めていた数百億オーダーのデータ(=Item)を保存しているDynamoDBのコストを削減する機会があり、その中で行った施策を春の入門祭り2025 にあわせて共有します。
前提
- テーブルのキャパシティモードはオンデマンドで利用しています
1. テーブルを再作成してデータ削除コストを減らす
DynamoDBのストレージ料金を削減するために、100億オーダーの過去データを削除することになりました。
DynamoDBのテーブルからデータを削除するには、DeleteItemを利用することになり、削除するデータごとに書き込みキャパシティユニット(WCU)を消費します。
つまり、削除するデータ量に応じてコストが増加するため、大量のデータを削除するには、その分大きなコストが必要になります。
さらに、開発/検証環境のテーブルにおいても本番環境と同様にDeleteItemでデータ削除すると、さらに追加の費用が必要となります。
今回、この削除費用を避けるために、開発/検証環境で全データを1度リセットしても問題ないテーブルに関しては、テーブルを削除&再作成をすることでWCUを消費せずにストレージ容量を削減することにしました。
削除方法 | 削除対象 | コスト(WCUの消費) |
---|---|---|
DeleteItem | 個別データ | 発生する |
テーブル削除&再作成 | 全データ | 発生しない |
本番環境ではもちろんテーブルを削除&再作成することは難しいと思いますが、開発/検証環境でデータをリセットしても問題ないテーブルがある場合は、データ削除コストの節約のための選択肢として実施して良いかもしれません。
2. データ保持期限をTTLで設定
DynamoDBでは以下のように、データの保持期限を設定するTTL(Time To Live)という機能があります。
TTL では、項目がいつ不要になるかを示す有効期限タイムスタンプを項目ごとに定義できます。DynamoDB は、書き込みスループットを消費することなく、有効期限が切れてから数日以内に期限切れの項目を自動的に削除します。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/TTL.html
TTLによるデータの自動削除はWCUを消費しないため、テーブルに保存しておく必要のある期間が分かっているデータは、設定しておくのが良いと思います。
削除方法 | コスト(WCUの消費) |
---|---|
TTL | 発生しない |
DeleteItem | 発生する |
3. 利用していないGSIの削除
GSIを1つ貼ると、ストレージのコストがテーブル1つ分増加します。また、データの書き込み時にもGSI用のテーブルを更新する必要が発生し、テーブルに貼るGSIの分だけ、ストレージコストや書き込みコストが増加します。
そのため、利用されていないGSIが貼られていないかを確認し、あれば削除していきましょう。
4. 不要なバックアップの棚卸し
マネジメントコンソール画面からDynamoDBテーブルのバックアップを作成すると、オンデマンドバックアップが作成され、保存コストが発生します。
DynamoDBのマネジメントコンソールを操作する際に、「テーブル」や「項目を探索」の画面と比較すると、「バックアップ」の画面に遷移することは少ないと思います。そのため、不要になったバックアップの削除が漏れると、なかなかバックアップが残っていることに気づかれず、そのまま保存されたままになってしまう危険性があります。
意外とコスト削減に繋がる過去の産物が見つかるかもしれないので、不要なバックアップが残り続けていないかをチェックしてみましょう。
おわりに
AWS DynamoDBのコスト削減に向けた具体的な施策を紹介しました。特に大規模なデータを扱うDynamoDB環境においては、わずかな工夫が大きなコスト削減に繋がる可能性があります。
他にも、ユースケースによってはテーブルクラスやキャパシティモードの変更なども効果的かもしれません。
DynamoDBのコスト最適化に取り組む方々の一助となれば幸いです。