技術

各種DB系サービスのコストの考え方

DBにかかるコスト(金額)の考え方は、昔とだいぶ変わりました。

今さら感はありますが、最近はデータを扱う仕事をしてしみじみそう思いました。そこで、各製品ごとに考えないといけないポイントをまとめてみたいと思います。

DBのコストの考え方の遷移

昔はサーバ代やデータセンターなどの主に物理にかかるコストを意識しなければいけませんでした。今はクラウドの時代なので、物理のコストは考えなくてよくてなりました。

しかし、代わりにクエリにかかるコストを考えないといけなくなりました。というのもクラウドのほとんどの製品は、クエリ課金です。

しかし、同じようなクエリでも、各製品によって仕様が違うので、そこを意識しておかないと想定以上のコストがかかってしまうとことになりますので、注意が必要です。

製品別コストの考え方

AWS RDS

まずは基本中の基本、RDS。

これは従来のRDBのマネージドサービスなので、コストの考え方は従来のEC2とあまり変わりません。サーバのグレード(スペック)を意識すればいいだけです。

一度、立ててしまえば、あとはどんなにクエリを発行してもお金は変わらないはずです。

注意が必要なのは、RDSは停止できないということです。停止しても7日後に自動で起動してきます。EC2みたく使わないから、停止しておこうみたいな運用はできません。後で使うけど、当分は止めておきたいというときは、バックアップをとって一度削除する必要があります。

AWS Redshift

RedshiftはDWHのマネージドサービスで、ノードタイプとサーバレスのタイプ(Amazon Redshift Spectrum)があります。

ノードタイプの方は、RDSと同様、サーバのクラスと稼働時間に応じてコストがかかります。

後者はクエリがスキャンしてデータ量に応じてになります。こちらのタイプは使ったことがないので、私は詳細はわかっていません。使う時がきたら、limitの仕様はどうなっているかなど、調べる必要がありそうです。

AWS DynamoDB

AWSのNoSQLのDB。Lambdaと相性が良く、Lambdaを使う時によく使います。

コストは割り当てたキャパシティに応じてになります。そのキャパシティはデータの読み書きに応じて消費されます。要は、データのIn/Outに応じてお金がかかるけど、まったくアクセスがなくても割り当てているキャパシティの分は課金されます。

つまりはクエリ量をできるだけ把握しておく必要があり、またむやみやたらにデータを読み込まないようなシステムを構成する必要もあります。

注意が必要なのはscanを使った場合です。scanを使った場合、filterで取得データ量を絞っても、全データを取得->filterで表示データを限定というながれなので、全データスキャン分のコストがかかります。

パーティショニングやインデックスを適切に設定し、scanはなるべく使わないように設計しておく必要があります。

AWS Athena

アテナというカッコイイ名前のサービス。S3にあるデータに対して、SQLを投げてデータを取得できます。

Athenaは、limitをすればlimitの分だけのデータスキャンになります。なので、limitを使うように気を付けておけば、お金はあまり気にする必要はありません。

またAthena自体も安いサービスなので、基本的にはコストは気にせずガンガン使っても問題ありません。

ただデータソースがS3なのでデータ量自体は大規模になるので、パーティショニングだけは気にしたクエリを投げるように心がけておく必要があります。

GCP BigQuery

BigQueryはGCPのDWHのサービスです。

Redshiftの違いは、クエリ課金ということです。

クエリ投げさえしなかればお金がかかることはないので、個人の勉強とかでは使いやすいです。

limitは、DynamoDBのscan同様、全スキャン後にかかるので注意が必要です。limitをしてもコスト節減にはなりません。

https://stackoverflow.com/questions/63173434/is-the-limit-statement-useful-for-reducing-the-query-costs-in-bigquery

まとめ

以上、私が触ったことがあるDB系のサービスのコストの考え方について、まとめてみました。

EMRやAzureは使ったことがないので、今回は対象外とさせていただきました。

少しでも参考になったら幸いです。