【ITニュース解説】Taming S3 Costs: Automated Reports with Lambda, Python, Athena & SES (because weekends are for coffee, not cost reports ☕)
2025年09月17日に「Dev.to」が公開したITニュース「Taming S3 Costs: Automated Reports with Lambda, Python, Athena & SES (because weekends are for coffee, not cost reports ☕)」について初心者にもわかりやすく解説しています。
ITニュース概要
S3のコスト管理を効率化するため、Lambda、Python、Athena、SESを連携させた自動レポートシステムを構築した。S3 Inventoryで利用状況を収集し、AthenaでSQL分析。Lambdaがこれを実行し、コストが高いバケットを特定する詳細レポートをS3に保存し、メールで通知する。EventBridgeで週次実行し、手動での確認作業をなくした。
ITニュース解説
多くのITシステムで利用されるクラウドサービスの一つに、AWS(アマゾン ウェブ サービス)のS3(Simple Storage Service)がある。S3はファイルを保存するためのサービスで、非常に安価で便利だが、利用量が増えると知らず知らずのうちにコストが膨らんでしまうことがある。特に、様々なプロジェクトや実験で使われたS3バケット(S3におけるファイルを保存する「入れ物」)が放置されると、どのバケットがコストを圧迫しているのか分からなくなり、管理が難しくなるという課題がある。
この記事では、このS3のコスト問題を解決し、どのバケットが最もコストを消費しているかを自動的に把握し、定期的にレポートとして受け取るためのシステム構築について解説する。手動での確認作業をなくし、効率的にコスト管理を行うことを目指した取り組みだ。
まず、S3に何が保存されているかを正確に把握することから始める。このために「S3 Inventoryレポート」という機能を使う。S3 Inventoryレポートは、S3バケット内のすべてのオブジェクト(ファイル)の詳細な情報(ファイル名、サイズ、ストレージの種類など)を定期的に生成し、別のS3バケットに保存する機能だ。ここでは、データ分析に適した「Parquet(パーケット)」という形式でレポートを生成するように設定する。Parquet形式のデータは、大量のデータから必要な情報だけを効率よく取り出すのに適している。このレポートが専用のS3バケットに格納されることで、S3に保存されているすべてのファイル情報が、いつでも分析できる状態で手に入るようになる。
次に、このS3 Inventoryレポートのデータを分析するための準備をする。ここで登場するのが「Amazon Athena」というサービスだ。Athenaは、S3に保存されているデータをSQL(データベースを操作するための言語)を使って直接分析できるサービスである。つまり、先ほどS3バケットに保存したParquet形式のS3 Inventoryレポートを、データベースのテーブルのように扱えるようにAthenaで設定する。これにより、膨大なファイルリストを一つ一つ確認する代わりに、SQLクエリを記述するだけで、目的の情報を効率的に抽出できるようになる。
データ分析の準備が整ったら、実際にAthenaを使ってSQLクエリを実行し、コスト分析を行う。クエリの目的は、各S3バケット(またはバケット内の特定のフォルダ、つまりプレフィックス)がどれくらいのデータを保存しており、それがどれくらいのコストになっているかを計算することだ。S3には、アクセス頻度や保存期間に応じて「STANDARD」「GLACIER」「DEEP_ARCHIVE」といった複数のストレージクラスがあり、それぞれ単価が異なる。この単価をSQLクエリの中に組み込み、各ストレージクラスのデータ量にそれぞれの単価を掛け合わせることで、推定コストを算出する。例えば、「STANDARD」クラスのデータ量には高い単価を、「GLACIER」や「DEEP_ARCHIVE」のようなアーカイブ用のクラスには低い単価を適用して計算する。これにより、「どのストレージクラスに保存されているデータが、どれだけの費用を占めているのか」といった具体的な情報を得ることが可能になる。
ここまでの作業を毎回手動で行うのは手間がかかるため、これを自動化する。この自動化の中心となるのが「AWS Lambda」というサービスと、Pythonというプログラミング言語、そしてAWSのサービスを操作するためのライブラリである「Boto3」だ。Lambdaは、プログラムコードを実行するために必要なサーバーの管理をAWSに任せられる「サーバーレス」なコンピューティングサービスである。
作成するLambda関数は、以下のような一連の処理を自動で行う。
- まず、各S3 InventoryのAthenaテーブルに対して、前述のコスト計算SQLクエリを実行する。
- Athenaでのクエリ実行には時間がかかるため、Lambda関数はクエリの完了を定期的に確認しながら待機する。
- クエリが完了すると、その結果はCSV形式のファイルとしてS3バケットに出力される。Lambda関数はこのCSVファイルをS3から取得する。
- 取得したCSVデータはPythonコードで処理され、各バケットやプレフィックスごとのオブジェクト数、合計サイズ、推定コストを集計する。さらに、ストレージクラスごとの内訳も保持する。
- すべてのデータが集計されたら、合計コストの高い順に上位のバケットやプレフィックスを特定する。
- 特定された上位項目について、詳細なCSVレポートを作成する。このレポートには、各バケット/プレフィックスの総コスト、総サイズ、総オブジェクト数、そしてストレージクラスごとの詳細な内訳が含まれる。
- 作成した詳細CSVレポートは、S3バケットにアップロードされる。これにより、レポートは履歴として残り、いつでも確認・共有できる状態になる。
- 最後に、「Amazon SES(Simple Email Service)」というAWSのメール送信サービスを利用して、コストが高い上位項目の概要を記した短いメールを送信する。このメールには、S3にアップロードされた詳細CSVレポートの場所へのリンクも含まれる。
このLambda関数は、AWSのイベントを管理するサービスである「Amazon EventBridge」を使って定期的に実行されるように設定する。例えば、毎週日曜日の深夜に実行するようスケジュールを設定すれば、毎週月曜日の朝には、最新のS3コストレポートが自動的にメールで届く。これにより、手動でクエリを実行したり、データを集計したりする手間が一切なくなり、週末はコーヒーを飲みながら、週明けにはすでにコスト状況を把握できる状態になる。
最終的に受信するメールには、たとえば「Table: my_bucket_1 | Bucket: my-bucket-1 | Size: 12.3 TB | Cost: $257.23」のように、バケットごとのサイズと推定コストが簡潔にまとめられている。これにより、どのS3バケットが現在の主要なコスト要因となっているかを一目で把握でき、問題のあるバケットを特定して対策を講じるための具体的な情報が得られる。
この自動化されたシステムは、S3コストの「見える化」を実現し、手動での作業をなくすことで時間と労力を節約する。さらに、古いプロジェクトのデータや設定ミスによって不要なコストが発生しているS3バケットを早期に発見し、コスト削減に繋げることが可能になる。このように、一見するとシンプルな仕組みだが、クラウド利用における費用管理において大きな価値をもたらす。