Blog

AWSのコスト削減を試した話(S3編)

はじめに

こんにちは。ニフティ入社新卒四年目の佐々木です。今回はAWSのリソースの一つであるS3についてコスト削減を行う方法を紹介します。

背景

ニフティではクラウドとしてAWSを活用しており、その中でサービスに対してクラウドリソースのコストを削減するといった活動も行っています。

そこで、今回は担当システムでAWSのコスト削減を行う機会があったので、何故削減するのか?どういう点で主に削減できそうか?削減する場合の注意点や考え方について紹介します。

この記事の内容

  • 触れること
    • S3のコスト削減方法
    • S3のコストを削減する上での注意点
    • 実際に試したコスト削減例とTips
  • 触れないこと
    • S3そのものの説明
    • ストレージクラスなどの詳しい説明

S3を使用したコスト削減方法

課金形態

普段はニフティトップページの運用を担当しており、AWSにデプロイしたサービスを採用しています。

特にAWSの中でも、S3はほぼ制限なしで容量を必要な分だけ増やして使えるのでとても便利なサービスですが、使用した分だけコストがかかってしまうというデメリットもあります。 そこで、S3の課金形態について最初にご紹介したいと思います。2023年3月現在では主に以下のようになっています。
  • ストレージに対する課金
    • S3バケットにオブジェクトを保存するには料金がかかります
    • オブジェクト内に保存されているデータサイズによって月額のコストが決まります
  • リクエストとデータ取り出しに関する課金
    • S3バケットとオブジェクトに対して行われたリクエストに対しても料金がかかります
    • リクエストの量に応じて課金されます
    • リクエストタイプによって料金が異なります
オブジェクトにデータを保存し取得するといった単純なフローを考える場合、基本的にはこれらの2つの要素がほとんどの課金要素になってくるかなと思います

削減方法

次に、主に既に使用しているS3に対して対処できそうな方法をご紹介します
  • ストレージクラスの選択
    • 上記でも触れたとおり、S3には様々なストレージクラスがあり、アクセス頻度に応じてコストを削減できます
    • 例えば、サーバーのアクセスログを年単位で保存すると言った場合には、すぐにログを取りだす必要がないのであれば、低頻度のストレージクラスに移動させることでコストが節約できます
  • ライフサイクルルールの設定
    • これはストレージクラスの話にも関わってきますが、アクセス頻度の低いバケットに対しては「一定期間たった後にアクセス頻度の低いストレージクラスに移動する」などといった柔軟性をもたせた対処ができます
    • もし、ログの保存ルールが決まっている場合は、例えば最初の3ヶ月はすぐに取り出せるよう高頻度アクセス用のストレージに保管し、その後アーカイブとして1年間低頻度用のストレージに保存するといったこともできます
  • リクエストコストの削減
    • S3にあるデータの取り出しにはコストがかかるので、それらを削減する方法も重要になります
    • 例えば、S3にアクセスするためのリクエストの頻度を減らす、S3に保存するデータ量を見直すといった対処ができます
  • 不要データの削除
    • 単純に不要となっているバケットそのものを削除する方法です
    • 不要なデータはそもそも保存させない、不要なバケットそのものを削除する、といった節約方法になります

実際にためしたこと

次に、S3のコスト削減を考えた際に実際に試したことや注意点などについて、Tipsを話していきたいと思います

S3の課金項目の把握

何はともあれ、まずは現状のコストの把握から始めないといけません。実際にどの程度S3にコストが掛かっているのかを把握するため、Cost Explorerでサービスごとに料金を確認していきます。

例えば、S3のどの要素に課金がされているのかを把握することが重要です。S3バケットに対してタグを付与することで、Cost Explorerからのコスト把握がしやすくなります。

また、実際にタグを付与したりしたりすることで、「このバケットは何に使われていたのか?」といった目的の確認ができたりします。それらを活用し現状を把握することで、その後に削減する箇所のアイデアが浮んだり、後述するリソースの洗い出しにつながってくるといったメリットはあると思います。

S3バケットとオブジェクトの精査

次に、S3ストレージに保存されているオブジェクトサイズを把握するために精査を行いました。

ここでは、S3 Storage Lensという機能を活用することで、S3の様々な情報をコーンソール上で確認することができます。以下はとあるバケットの例ですが、ストレージクラスごとのバケットサイズやオブジェクトの合計数などの詳細を把握できます。
また、閲覧出来る数に制限はありますが、使用量が上位のバケット一覧もこちらから確認できます。今回調査した範囲ではバケットが100個程度と数が多かったので、これを活用することでバケットサイズなどを容易に洗い出すことができました。

不要なバケットの削除

ここまでで、バケットのストレージサイズや使用用途について洗い出せたので、さらに不要なバケットの削除を行いました。

担当システムのチームで洗い出しを行った上でバケットの削除を行いましたが、今回の例ではそもそもデータ容量が多い不要なS3バケットがあまり存在しなかったので、コスト削減の効果は限定的でした。

ただ、不要なバケットを削除しリソースの整理ができたので、「このリソース何だっけ?」といった将来の管理面の負担を減らせたという点で、コスト面以外でもメリットがあったかと思います。

ライフサイクルルールの見直し検討

一方で、ストレージクラスごとの料金から現状のルールと変更後のルールを比較しコストの計算を行いました。 結局、今回はこちらも効果が限定的だったので変更は見送りましたが、もし保管しているデータ量の多いS3バケットが存在するのであれば、かなり手軽に削減出来る方法だと思いました。

まとめ

今回はS3のコスト削減について紹介しました。

全体を通した感想としては、アーキテクチャの把握からコスト削減までを一通りやることで知識も身につくので、担当プロジェクトでもし余裕があるのであれば一度そのような取り組みをやってみると良いなと思いました。それに加えて、AWSについて詳しくなれますし「この部分も実は改善できるのでは?」といったサービスに対する一歩上の視点で見れるようになったので学びになりました。

S3単体だけでなく、他のサービスと組み合わせることでさらにコスト削減を仕組みを導入する予定なので、また機会があればそちらも紹介したいと思います。

参考記事

We are hiring!

ニフティでは、さまざまなプロダクトへ挑戦するエンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトよりお気軽にご連絡ください! Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!