本日も乙

ただの自己満足な備忘録。

タグ付けしたAWSリソースのコストをリザーブドインスタンス適用無しのオンデマンド料金で計算する方法

小ネタです。

AWSではBillingの設定で独自に定義したタグに対してコストを算出することができます。この機能によって例えば、プロジェクト毎やシステム毎のAWS料金を確認できるようになります。料金はAWS Cost Explorer か、Cost & Usage Report(CUR)というCSVファイルの詳細レポートから見ることができます。

参考: Using Cost Allocation Tags - AWS Billing and Cost Management

しかし、AWS料金を計算する上でやっかいなのがリザーブドインスタンス(RI)を適用した場合です。

RIを適用する条件(リージョン、インスタンスタイプ、AZなど)がマッチしてしまうと、どのリソースにRIを適用するかはAWS側に委ねられることになります。
例えば、 c5.large × 2 のEC2インスタンスが起動していてインスタンス名がAとBだとします。インスタンスA用に c5.large × 1のリージョナルRIを購入した場合、インスタンスBもRIの適用条件を満たしているとインスタンスBに割引料金が適用されてしまうこともあります。

そのインスタンスにどのRIを適用するかはAWS側が自動で割り当てているため、こちらで制御することはできません *1
コストアロケーションによって、コスト配分したとしてもRIの適用次第では意図した金額とならない可能性があります。

CURによってRIを適用しないオンデマンド料金を算出する

CURの活用によって回避することが可能です。
例えば、上記の例の場合

  • CURレポート項目 lineItem/ResourceId とEC2インスタンスID(インスタンスA、B)がマッチ、かつ lineItem/OperationRunInstances のレコードを抽出する
  • オンデマンド料金を計算したいインスタンスB に対して pricing/publicOnDemandCost カラムの金額を合計する
  • RI適用済の料金を計算したいインスタンスAに対して 0円 *2とする

とすることで、インスタンスAはオンデマンド、インスタンスBはRI適用済として意図した金額になります。

最後に

CURにおける計算方法を紹介しましたが、正直面倒なのでできればAWSアカウントを分けられないかを検討した方が良いです。

*1:仮に手動で割り当てる機能があったとしても割り当て忘れがあったりして無駄なコストを生んでしまうことを考えると自動割当は妥当だと思います

*2:All Upfrontの場合