RareJob Tech Blog

レアジョブテクノロジーズのエンジニア・デザイナーによる技術ブログです

プロダクトごとの AWS コスト可視化

はじめに

こんにちは、DevOps グループの中島です。
最近また円安に振れてきて、コストが気になるようになってきましたね。

弊社はレアジョブ英会話以外にもいくつかプロダクトを開発しておりますが、 各プロダクトを開発しているチームでもコスト意識を持ってもらおうと思い、プロダクトごとの AWS コスト可視化を行いはじめました。

今回はそのときの知見をいくつか紹介したいと思います。

コスト管理の方法

AWS のコストは コスト配分タグ を利用することで、各リソースにかかったコストをタグを用いて分類することができます。 コストはコスト配分レポートとしてCSV 形式でダウンロード できます。

一般的な従量課金のレコードは以下のようになります。

項目名
usage_type APN1-BoxUsage:t3.large
item_description $0.1088 per On Demand Linux ...
usage_quantity 利用時間
rate 利用時間あたりのコスト
cost usage_quantity * rate = 合計コスト
コスト配分タグ1 RareJobEikaiwa
コスト配分タグ2 StudentSite

弊社では AWS のコストを若干値引き可能なためクラスメソッド様のサービスを利用させて頂いておりますが、 このようなクラウドサービスのリセラーを利用していると、コスト配分タグが複数作成できない、キー値が指定されているなどの制限がある場合があるため、注意が必要です。

また、タグを付与できないリソースや、タグを付与しても集計対象にできないリソースや処理も存在するため、 正確に把握したい場合はアカウントを分けるのが最善と考えられます。

ただし、アカウントを分けても後から集計単位を変更したくなった場合や さらに細かい単位で集計したくなった場合はコスト配分タグを利用することになるため、 将来的に同じ問題に直面する可能性があります。

コスト配分タグ 1 種類でも複数の軸で集計する

前述のような理由で、使用可能なコスト配分タグが 1 種類という制限がある場合、 タグの値に複数の情報を含めることで複数軸による集計をすることができます。
例えば、プロダクトの他に機能ごとに集計したいと考えた場合、 タグの値を Product_Function のように何らかのセパレータで区切り、別の項目として集計します。

このようなワークアラウンドでコスト集計に対する問題の回避は可能ですが、 やはりタグが分かれないことで、AWS の提供するリソースのフィルタリングがこのタグに対しては効かないなどのデメリットはあります。

リザーブインスタンスの考慮

リザーブインスタンスが適用された場合は、以下のようにコスト 0 のレコードとなります。

項目名
usage_type APN1-HeavyUsage:t3.large
item_description Linux/UNIX (Amazon VPC), t3.large reserved instance applied
usage_quantity 利用時間
rate 0
cost usage_quantity * rate = 0

上記 (と利用時間あたりのコスト) によってどれぐらいの削減効果があったかをタグごとに知ることができます。 しかし、購入したリザーブインスタンスはどのインスタンスに適用するかを指定することができません。 このため、正確に (平等に) 利用料金を求めるためには、同じインスタンスタイプのすべてのレコードから利用時間を用いて按分するなどして再計算する必要があります。

Savings Plans の考慮

こちらはリザーブインスタンスと異なり、コストがマイナス値の値引きレコードとして表現されます。 通常の従量課金レコードに対して、使用割合で按分して均等に値引きを適用させるなどで値引き額の按分が実現できます。 レコードは以下のようになります。

項目名
usage_type APN1-BoxUsage:t3.large
item_description SavingsPlanNegation used by AccountId : ... and UsageSku : ...
usage_quantity 利用時間
rate 利用時間あたりの値引き額 (マイナス値)
cost usage_quantity * rate = 値引き額 (マイナス値)

ECS へのタグの付与

コンテナの実行にかかる料金をコストデータに反映させるためには、ECS タスクにタグを付与する必要があります。 ECS タスクへのタグ付与は、サービス定義propagateTags パラメータを指定することで、 ECS タスクの生成と同時にタグが伝搬して付与されるようになります。

注意点として、サービスから伝搬させるためにはサービスにタグを付与する必要がありますが、 ARN が古い サービスは、タグ付与するためにサービスを再作成する必要があります。 本番環境のサービスを削除するのはなかなか難しいので、タスク定義から伝搬させることになることが多いと思います。

コスト配分タグの効果が得られないリソース

タグを付与してもコストデータに反映されないリソースは、逐一 AWS に確認しないと分かりません。 ここでは弊社の AWS 利用のうち料金が目立っているものを 2 点紹介します。

CloudTrail のコスト

Trail ごとにタグを付与することが可能ですが、コスト配分レポートには反映されません。
プロダクトごとに用意するようなものではないのであまり気になりませんが、結構なコストがかかります。

RDS スナップショットからの復元コスト

本番の RDS スナップショットに対して、データ分析などのためマスキングを行った上で別アカウントにコピーを行っています。 データが大きいこともあり、このときのスナップショットの作成 (S3へのエクスポート) にコストがかかっているのですが、 こちらもコスト配分レポートに反映されません。AWS に問い合わせたところ、反映する方法はないそうです。

このようなコストは共通としてカウントするか、各プロダクトに按分するしかありません。

終わりに

改善のためにまずは計測からということでこのような施策を行いました。 すぐには効果が得られないと思いますが、地道に見守っていきたいと思います。

We're hiring!
弊社では、特に DevOps グループでは、一緒に働いてくださるエンジニアを大募集しています。
rarejob-tech.co.jp