Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

S3のコストが上がった原因は?

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

May 9, 202410 min read
Gregory Wiedeman

About Gregory Wiedeman

Greg is a Cloud Architecture Strategist at DoiT International and holds an M.S. in Systems Engineering from Regis University. He specializes in cloud architecture, FinOps consulting, and technical advisory services—helping clients optimize infrastructure and make smarter build decisions. When he's not immersed in cloud cost strategies, he enjoys writing about AI governance for non-technical leaders, playing cornhole, or climbing Colorado's many 14ers.

My personal page

S3のコストが想定より高くなり、原因を調べている方は、S3バケットのバージョニング機能が有効になっているかもしれません。ご安心ください。適切に対処すれば、S3バケットとバージョニングのコストを思いどおりにコントロールできます。本記事では、バージョニングを有効にしたS3バケットで発生するコストと、その効率的な管理方法を解説します。これを押さえておけば、S3バケットを最適化し、本当に必要なストレージ分だけを支払うようにできます。

S3バージョニングは、同じオブジェクトの複数のバージョンを1つのバケットに保持できる便利な機能です。誤って削除や上書きをしてしまっても、過去のバージョンに常にアクセスできます。S3バージョニングを使えば、1つのバケット内にオブジェクトの複数バージョンを保管し、必要なバージョンを復元できます。

たとえば、あるバケットでS3バージョニングを有効にしている場合、削除したオブジェクトは完全には消去されません。代わりに、Amazon S3が「削除マーカー」を挿入し、それが現行のオブジェクトバージョンになります。必要に応じて、以前のバージョンを復元できます。

同様に、オブジェクトを上書きすると、Amazon S3はバケットに新しいオブジェクトバージョンを追加します。以前のバージョンはバケット内に残り、「非現行バージョン」となり、いつでも復元可能です。詳しくは、バージョニングが有効なバケットからオブジェクトバージョンを削除する方法をご覧ください。

Deleting object versions from a versioning-enabled bucket \ \ Delete an object in a versioning-enabled bucket by including the specific version ID of the object.\ \ docs.aws.amazon.com

S3バケットでバージョニングを有効化する理由はさまざまですが、一度有効にすると無効化できない点には注意が必要です。ただし「停止(Suspend)」は可能で、S3バケットのバージョニングを無理なく管理する方法を見つけられます。想定外のS3コストに振り回される必要はありません。S3バケットの主導権を握り、バージョニングコストを効率よく管理しましょう。

数百万のオブジェクトを抱えるバケットを複数運用していると、現状把握だけでも手に負えないと感じるかもしれません。AWSが提供するStorage Lensを使えば、どのバケットにバージョン付きオブジェクトがあるか、その数や非現行オブジェクトの割合、さらに非現行オブジェクトが置かれているストレージ階層まで確認できます。AWS Storage Lensの使い方の詳細は、次の記事をご参照ください。

Assessing your storage activity and usage with Amazon S3 Storage Lens \ \ Use Amazon S3 Storage Lens to evaluate your Amazon S3 storage to gain insights, help increase cost efficiency, and…\ \ docs.aws.amazon.com

これらのデータを参照すれば、非現行バージョンのストレージ量と階層を見ながらバージョニングコストの全体像を素早く把握し、ストレージ管理の方針を判断できます。料金は現行バージョンのコピーと同じです。次の例は、非現行バージョンが時間とともに急速に積み上がり、コストを押し上げる様子を示しています。

4GiBのオブジェクトが1日に5回更新されるとします。すると毎日、非現行バージョンが5つと現行バージョンが1つ、合わせて6つのバージョンが存在することになります。1日5回の変更を1か月平均30日で計算すると、5回 × 30日 = 150個の非現行バージョンコピーが発生します。これは急速に積み重なり、非現行オブジェクトが置かれているストレージ階層の料金がそのまま課金されます。

もう1つの例として、1MBのファイルに対して200個のコピー(非現行バージョン)がある場合、200MB分のストレージ料金が発生します。

バージョニングが有効なバケットと、すでに非現行バージョンを持つオブジェクトを特定したら、そのコピーを保持する価値について考えてみましょう。「このオブジェクトのコピーは本当に必要か?」と自問することが大切です。答えが「はい」であれば、次は「どのくらいの期間保持するか」「いくつのコピーが必要か」を検討します。これらの答えが、コピーの維持コストや、オブジェクトの遷移を管理するための自動化を判断する手がかりになります。じっくり時間をかけて、自社のニーズに最適な方針を決めてください。すべてのバケットが同じというわけではありません。

バケットでバージョニングが不要な場合は、以下の手順でバージョニングを停止し、非現行コピーや不要な削除マーカーを削除しましょう。これによりコストを抑え、実質的にバージョニングを無効化したような状態にできます。

注意: 以下の手順を実行して非現行ファイルを削除すると、すべての非現行コピーは永久に失われ、復元する手段はありません。正しいS3バケットを選択しているか、非現行バージョンが本当に不要かを十分に確認したうえで削除してください。まずはテスト用バケットで試すことをおすすめします。

  1. AWS S3コンソールで、バージョニングを停止したいバケットを探して選択します。
  2. 「プロパティ」タブを開きます。
  3. 「プロパティ」タブ内のバージョニングに関するセクションを見つけ、「編集」を選択します。

S3バケットのプロパティ

4. ラジオボタン「停止(Suspend)」を選択します。

5. 「バケットのバージョニング停止による影響を理解しました」のチェックボックスを選択します。

6. 「変更を保存」をクリックします。

7. これでバケットのバージョニングが停止状態になります。

  • バージョニングを停止すると、新しいバージョンのオブジェクトは作成されなくなります。
  • バージョニングの停止は、バケット内の既存オブジェクトには影響しません。

バケットのバージョニングの停止または有効化

次のステップは、非現行バージョンと有効期限切れの削除マーカーを削除することです。特に数百万単位のファイルを扱う場合に最も一般的な方法の1つが、ライフサイクル設定(Lifecycle Configuration)の活用です。本記事ではAWS推奨のこの方法を例として用いますが、他の手段もあります。詳しくは以下を参照してください。

Options to delete millions of objects from a versioning-enabled AWS S3 bucket \ \ Do you want to delete or clean up a versioning-enabled -S3-bucket? Though it looks empty, S3 is not allowing you to do…\ \ aws.plainenglish.io

引き続き同じS3バケットで「管理」タブを選択します。

「管理」画面に「ライフサイクルルール」というセクションがあります。「ライフサイクルルールを作成」をクリックします。

S3管理のライフサイクルルール

  1. 「ライフサイクルルールを作成」で、以下の項目を入力します。

ライフサイクルルール名:ルールの内容がわかる名前を付けます。

例: DeleteNV-1days-DeleteMarker-IMU-7days このルール名は、非現行コピーは1日後、削除マーカーと未完了のマルチパートアップロードは7日後に削除する、という内容を表しています。 2. 「ルールスコープを選択」では、「バケット内のすべてのオブジェクトに適用」のラジオボタンを選択します。警告メッセージが表示されるので内容を確認し、「このルールがバケット内のすべてのオブジェクトに適用されることを承認します」を選択します。1つ以上のフィルターを使ってこのルールの範囲を限定するオプションについては、本記事の後半で説明します。 3. 「ライフサイクルルールアクション」では、非現行バージョンのオブジェクトを完全に削除有効期限切れのオブジェクト削除マーカーまたは未完了のマルチパートアップロードを削除 のチェックボックスを選択します。 4. その下に 非現行バージョンのオブジェクトを完全に削除有効期限切れのオブジェクト削除マーカーまたは未完了のマルチパートアップロードを削除 という2つの新しいセクションが表示されます。 5. 非現行バージョンのオブジェクトを完全に削除オブジェクトが非現行になってからの日数 のテキストボックスに「1」と入力します。数値はゼロより大きい必要があります。これは前述の「非現行オブジェクトをどのくらいの期間保持するか」の判断に該当します。その右の 保持する新しいバージョンの数 — オプション は空欄のままにします。「いくつのバージョンを保持する必要があるか?」という問いを思い出してください。ここで指定した数のコピー(非現行バージョン)が常に保持されます。 6. 次は 有効期限切れのオブジェクト削除マーカーを削除未完了のマルチパートアップロードを削除 のセクションです。有効期限切れのオブジェクト削除マーカーを削除未完了のマルチパート アップロードを削除のチェックボックスを選択します。「日数」という新しい入力欄が表示されるので、テキストボックスに「7」と入力します。これは未完了のマルチパートアップロードを削除するまでの日数です。リカバリーが必要な場合に、未完了のマルチパートアップロードが完了するための猶予を確保するための設定です。

ライフサイクルルールの設定

ライフサイクルルールアクション

なぜ未完了のマルチパートアップロードを削除するオプションを選んだのか、気になる方もいるでしょう。これはS3バケットのライフサイクルルールで自動化でき、コストを抑えるシンプルかつ効果的な方法です。未完了のマルチパートアップロードのパーツについても、アップロード時に指定されたストレージクラスに応じた料金が発生する点を覚えておきましょう。未完了マルチパートアップロードの分析にもS3 Storage Lensが活用できます。詳しくは以下の記事をご参照ください。

Discovering and Deleting Incomplete Multipart Uploads to Lower Amazon S3 Costs | Amazon Web… \ \ This blog post is contributed by Steven Dolan, Senior Enterprise Support TAM Amazon S3's multipart upload feature…\ \ aws.amazon.com

非現行バージョンのオブジェクト削除に関するAWSからの補足情報を以下に記します。

バージョニングが有効なバケットでは、各オブジェクトに1つの現行バージョンと0個以上の非現行バージョンが存在します。オブジェクトを削除する際は、以下にご注意ください。

削除リクエストでバージョンIDを指定しない場合、Amazon S3はオブジェクトを削除する代わりに削除マーカーを追加します。現行のオブジェクトバージョンは非現行となり、削除マーカーが現行バージョンになります。

削除リクエストでバージョンIDを指定すると、Amazon S3はそのオブジェクトバージョンを完全に削除します(削除マーカーは作成されません)。

非現行バージョンが0個の削除マーカーは「有効期限切れのオブジェクト削除マーカー」と呼ばれます。(出典)

お疲れさまでした。これでバージョニングが有効なS3バケットの主導権を取り戻せました。設定したライフサイクル構成とユースケースに応じて、1週間ほどでコスト削減の効果が見えてくるはずです。なお、ライフサイクルルールは非同期で実行されるため、非現行バージョンのオブジェクト削除に時間がかかる場合があります。とはいえご安心ください。完了までに余分にかかった日数分について、AWSから追加で課金されることはありません。

非現行バージョンはライフサイクル管理ルールが自動で処理してくれるので、改めてバージョニングを有効化することもできます。あるいは、オブジェクトのバージョンが不要であれば、バージョニングを停止したままにしておいても構いません。なお、バージョニングを停止している間にS3バケットへ配置された新しいオブジェクトはnull IDマーカーが付与され、バージョニングの対象にはなりません。

S3バケットでバージョニングを有効にしておきたいが、ライフサイクル管理は特定のオブジェクトにだけ適用したいケースもあります。ライフサイクル管理では、特定のプレフィックスにルールを適用できます。これは「1つ以上のフィルターを使用してこのルールの範囲を制限する」という機能です。フィルターを使えば、削除対象とする非現行オブジェクトを絞り込めます。また、フィルター機能を活用すれば、オブジェクトごとに異なるライフサイクルルールを設定することも可能です。

オブジェクトの保存場所でフィルタリングできます。たとえば、logsフォルダにファイルがある場合、フィルターを「logs/」に設定します。すると、このライフサイクルルールはlogs/log.txt、logs/temp3.txt、logs/test1.txtに適用され、ルートにあるexample.jpgというオブジェクトには適用されません。ファイル拡張子、タグ、オブジェクトサイズによるフィルタリングも可能です。フィルタリングのさまざまな例については、以下の記事をご参照ください。

Lifecycle configuration elements \ \ Explains the elements of Amazon S3 Lifecycle configuration.\ \ docs.aws.amazon.com

これで、オブジェクトの非現行バージョンに起因するS3コストをコントロールするための知識が身につきました。本番環境に適用する前に、必ずテスト環境または開発環境で変更を検証することをおすすめします。

参考リソース:

Cloud bill shouldn't be a mystery

One platform for AI and Cloud optimization.