S3 で10万削減？「S3 Storage Lens + ライフサイクルルール」でコスト削減する方法

こんにちは。リンクアンドモチベーションの綿引です。

本記事では、***「S3 Storage Lens」***と***「ライフサイクルルール」***を使用して不要なデータを定期的に削除し ***"S3 のコストを削減"*** する方法をご紹介します。

この後詳細を記載しますが、当時あるシステムで***「S3 の費用が10万円以上」***発生していたことがありました。。
その際に上記問題を解決した「コスト削減方法」について書いていければと思います。

## S3 は確かに安い！が・・
S3 を使用したことのある方のイメージと言えば***「安い！」***と思い浮かぶ方も多くいらっしゃるのではないでしょうか？
幾つか課金項目がある中のストレージ料金だけですが、***「1GB あたり 0.025USD」***と確かに安いです。
尚、以下が料金形態となります。

https://aws.amazon.com/jp/s3/pricing/

私自身ずっと「安い」というイメージを持っており、あまりコストを気にしたことがなかったのですが、ふと AWS Cost Explorer を確認した時に「思ったより S3 のコストが高い」ことがありました。

原因としては数年に渡って徐々に蓄積されたデータが膨大となり、ストレージ料金が高額となっていたためでした。
上記で安いと記載しているものの、これが数TBなどになるとコストにインパクトを与えてきます。

コストがかかっている S3 バケットは開発環境であったり、そもそも不要なデータだったりしたためファイルを削除することで対応したのですが、そこで使用したのが***「S3 Storage Lens」***と***「ライフサイクルルール」***だったため、こちらについて私が行った方法を記載できればと思います。

## S3 Storage Lens で利用状況を確認
S3 のコストが高かった際、一番最初に確認するのは「どのバケットにコストがかかっているか」です。
そこで便利なのがこの「S3 Storage Lens」で***「S3 の利用状況を可視化する」***ことができます。

デフォルトでダッシュボードが存在するため、設定なども特になく、そのアカウントにある S3 全体のストレージの合計や、ストレージを使用しているバケットの上位3つなど、色々な情報を得ることができます。

使用方法としては S3 のマネジメントコンソールから上部にある「Storage Lens ダッシュボードを表示」をクリックするだけです。

![スクリーンショット 2021-12-24 13.53.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662296/6b3f5017-325e-256a-320e-354c70d7f930.png)

ダッシュボードを開くと、上記の情報などを見ることができます。

![スクリーンショット 2021-12-24 13.58.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662296/eac4cd10-4ba4-5e9c-4a63-39946fa376ff.png)

まずはここで「どのバケットがストレージを使用しているか」を調査して、「バケット内のファイルが不要かどうかの判斷」や実際の対応に進んでいきましょう。

尚、S3 Storage Lens のデフォルトのダッシュボードは以下の項目を見ることができるのですが、「有料のメトリクス」を使用することでより詳しい情報を見ることことも可能です。

#### 無料のメトリクス
- ストレージの合計
- オブジェクト数
- 現行バージョンのバイト数
- 現行バージョンのオブジェクト数
- 旧バージョンのバイト数
- 旧バージョンのオブジェクト数
- 削除マーカーのオブジェクト数
- 暗号化されたバイト数
- 暗号化されたオブジェクト数
- レプリケートされたバイト数
- レプリケートされたオブジェクト数
- オブジェクトロックのバイト数
- オブジェクトロックのオブジェクト数
- 未完了の MPU バイト数
- 未完了の MPU オブジェクト数

#### 有料のメトリクス
- すべてのリクエスト
- GET リクエスト
- PUT リクエスト
- HEAD リクエスト
- POST リクエスト
- DELETE リクエスト
- LIST リクエスト
- リクエストを選択
- スキャンされたバイトを選択
- 返されたバイトを選択
- ダウンロード済みバイト数
- アップロード済みバイト数
- 4xx エラー
- 5xx エラー

## ライフサイクルの設定
次に不要なファイルが存在することが判明した場合の削除方法です。
S3 オブジェクトの削除方法は「コンソールから手動で削除」や、「aws s3 コマンドを使用する」など幾つかありますが、おすすめはライフサイクルです。

ライフサイクルの機能としては「オブジェクトを一定期間経過後に自動的に削除・移動する」というものであり、単発で削除する際にも使えますが、増え続けるファイルを***「一定期間経過後に自動的に削除できる」***という点が魅力です。

ライフサイクルを使用するには、まず「ライフサイクルルール」を作成します。
S3 のコンソールから、対象の S3 バケットを選択 → 管理 → ライフサイクルルールを作成する でルールの作成ができます。

![スクリーンショット 2021-12-24 14.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662296/ff613333-731c-da10-b714-3123be6c98cc.png)

設定では「特定のオブジェクトをフィルタリング」したり、「オブジェクトのサイズにで適用する範囲を制限」することなども可能です。

![スクリーンショット 2021-12-24 14.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662296/5f902c51-8a26-cb7c-7b86-951ab3d9601a.png)

どれほどの期間が経過したら削除されるかは、設定画面下部の「ライフサイクルルールのアクション」で指定します。
例えば***「ファイルの作成から30日経過したら削除したい」***といった場合は、以下のような設定を行います。

- オブジェクトの現行バージョンを有効期限切れにする : ***チェックをつける***
- オブジェクト作成後の日数 : ***30***

![スクリーンショット 2021-12-24 14.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662296/a193847d-6fed-df37-1399-f9b1069771f0.png)

これで作成から30日以上経過したファイルは削除されます。
今回はバージョニングについては触れませんが、バージョニングを有効にしている場合は設定内容が少しことなるため注意頂ければと思います。

またストレージクラスの移動についても記載していませんが、ライフサイクルを使えば特定のファイルを自動で Glacier に移動できたりもするので、是非見てみてください。

## おわりに
「S3 Storage Lens」と「ライフサイクルルール」を使用して不要なデータを定期的に削除し"S3 のコストを削減"する方法をご紹介させて頂きました。

この記事が見て頂いた方の何かの参考になれば幸いです。