EC2 料金データについて（参考訳）

このドキュメントは [EC2 Pricing Data](https://qiita.com/wayland/items/15f6b863f11c6b7c323c) の参考訳です。
EC2 の単価を決定するにはたくさんの項目があることや、AWS が提供するコストレポート(CUR)について説明されています。


# 背景
EC２の価格表をチェックしたいと思っていても、AWS のインスタンスタイプはたくさんの種類があって、さらに *Region, Operation, UsadeType* など価格を決定する要素も多く、正確な単価をすぐに知りたい場合でも膨大な時間がかかってしまって、辛い状況になります。

# EC2 価格表の入手先　
価格表は色々なサイトに載っています。

- [AWS EC2 Pricing Page](https://aws.amazon.com/ec2/pricing/on-demand/): AWS のオフィシャルページに価格表がありますが、表示速度が遅く、たくさんボタンをクリックしない限り欲しい情報が出てきません。さらに、検索する方法がまだありません。
- [AWS Cost Calculator](https://calculator.s3.amazonaws.com/index.html): インスタンスタイプを把握して、他のコストと合わせて予算を設定するサイト。
- [ec2instances.info](https://www.ec2instances.info/): 価格決定のための色々な要素を組み合わせられるサードパーティサイト。
- [AWS Price List API](https://aws.amazon.com/blogs/aws/new-aws-price-list-api/): このポストでシェアしたいものです！


# AWS Price List API
この API はアマゾンが提供しているすべてのサービスの価格を網羅しています。

OfferIndex にアクセスすることによってすべてのサービスの OfferCode と URL を取得します。

```
https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json
```

こんな感じに返ってきます:

``` json
{
  "formatVersion" : "v1.0",
  "disclaimer" : "This pricing list is for informational purposes only. All prices are subject to the additional terms included in the pricing pages on http://aws.amazon.com. All Free Tier prices are also subject to the terms included at https://aws.amazon.com/free/",
  "publicationDate" : "2015-11-19T02:10:02Z",
 "offers" : {
    "AmazonS3" : {
      "offerCode" : "AmazonS3",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/current/index.json"
    },
    "AmazonRedshift" : {
      "offerCode" : "AmazonRedshift",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonRedshift/current/index.json"
    },
    "AmazonEC2" : {
      "offerCode" : "AmazonEC2",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonEC2/current/index.json"
    },
    "AmazonCloudWatch" : {
      "offerCode" : "AmazonCloudWatch",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonCloudWatch/current/index.json"
    }
  }
}
````

例として EC2 の価格の index を取得してみます。これは 40 万アイテムもの膨大なリストを含んでいて、一個の API の要求では body 内にすべての情報は返ってきません。
幸運にも、AWS は全てのデータを CSV フォーマット(file size は約304MB)で提供しており、以下のURLからダウンロードできます。（が、スペックの高くないノート PC の場合は開いちゃダメです):

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.csv


CSV のスクリーンショット (私のマックで開いた場合):


<img width="2062" alt="excel.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/8b031790-ffe6-f242-3317-840c94313d66.png">

確認できるように、 **アイテムの数は40万以上にものぼります！** なぜこんなに価格データがあるのでしょうか？

下記のようにCSVをフィルタにかけると


- `InstanceType`,
- `Operation`,
- `Location`,
- `TermType`,
- `UsageType`,
- `Tenancy`,
- `...`

`PricePerUnit` という列の中に、価格データを含む行が残ります。このセルの数字は特定のリージョンの特定のインスタンスの価格設定レートを表しています。例えば、

> `Region` および `InstanceType` をフィルタリングした後、東京リージョンの m3.medium インスタンスには ***204 の価格設定*** が含まれます。
そしてその m3.medium インスタンスの 204 の価格設定は異なるレートをです。なぜなら OS(Windows, Linux/Unix, SUSE, Enterprise Linux などで価格が異なる)、予約期間(3 年または 1 年と、前払いなし、一部前払い、全額前払いの支払いオプション、Convertible と Standard のクラス)、プリインストールされたソフトウェアなどの項目があるためです。


# CSV を DynamoDb に dump する
BigQuery や QuickSight など、巨大な CSV を可視化するためのビックデータソリューションはたくさんあるのですが、早くデータを見たいので DynamoDb に dump することに決めました。使っていない値をフィルタした後、グローバルに利用可能な EC2 のデータを 309,365 個取得しました。

<img width="975" alt="dynamodb1.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/b44250a9-5a2a-b9d5-08f1-85e5c3212b75.png">


あるアイテムをクリックしてみると、特定の `m5.12xlarge` の価格データはこのようになります

<img width="879" alt="dynamodb2.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/6185b1cd-e296-a6a1-5e94-5a3ebef85a3d.png">


検索したいインスタンスの価格データを簡単に見れるようになりました。

<img width="1569" alt="dynamodb3.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/de21784a-b9f5-90d9-ac78-41fc11b38527.png">

# 興味深い項目
項目がたくさんあるために、価格データが莫大な量になります。そして、[true unblended cost](https://mobingi.com/jp/products/wave/faq) を自分自身で計算しようとするならば、これらの項目をすべて理解しなければなりません。ここで、最も重要と思われるいくつかの項目を説明してみたいと思います。

- `TermType`: *OnDemand, or Reserved*
- `PriceDescription`: *The description of the pricing item*
- `ProductFamily`: *Compute Instance, Data Transfer or EBS Storage, etc*
- `serviceCode`: *AmazonEC2*
- `Location`: *Region, eg: Asia Pacific (Tokyo)*
- `InstanceType`: *The type of instance, eg: c1.large*
- `UsageType`: *AWS がオフィシャルに月次請求書を計算するために使用する項目。この項目をあなたの毎月の [CUR](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-reports-costusage.html) csv にある列と突き合わせることで、AWS は単価を適用し総使用コストを生成します。*
- `Tenancy`: *Shared, Dedicated, or Host*
- `Operation`: *This defines what OS is the instance running, eg:*
  - `RunInstances` *Amazon EC2 running Linux/UNIX*
  - `RunInstances:000g` *Amazon EC2 running SUSE Linux*
  - `RunInstances:0010` *Amazon EC2 running Red Hat Enterprise Linux*
  - `RunInstances:0002` *Amazon EC2 running Windows*
  - `RunInstances:0006` *Amazon EC2 running Windows with SQL Server Standard*
  - `RunInstances:0102` *Amazon EC2 running Windows with SQL Server Enterprise*
  - `RunInstances:0202` *Amazon EC2 running Windows with SQL Server Web*
  - `RunInstances:0800` *Amazon EC2 running Windows (Bring your own license)*
  - `RunInstances:SV006` *Amazon EC2 running Linux/UNIX Spot Instance-hour in US East (Virginia) in VPC Zone #6 ...*
  - ...

# CUR と自分で計算する方法について
CUR（Cost and Usage Report）は、時間単位/日単位で AWS があなたの S3 バケット（Payer アカウント経由）に提供する CSV ファイルです。このCSVファイルには、すべてのサービス使用データが詳細に含まれています。

したがって、CUR csv ファイルを元にのコストを計算し、AWS の使用状況を詳細に把握することができます。CUR と一括請求の詳細は[こちらのAWSドキュメント](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/con-bill-blended-rates.html)に記載されています。


自分で計算することは難しく、人的リソースも集中する必要があります。特に、RI ブレンドが複数の aws アカウント間で発生した場合、正しい使用状況を再計算する必要があります。

幸運にも、CUR の再計算サービスを提供している SaaS ベンダーがあります。

- [Cloudability](https://www.cloudability.com/)
- [Mobingi Wave](https://mobingi.com/jp/products/wave)
- [Mobingi Ripple for CSP/MSP](https://mobingi.com/jp/products/ripple)
- [CloudCheckr](https://cloudcheckr.com/)

私は Mobingi チームで働いており、私たちは多くの AWS のお客様に対し、毎月の請求書計算のお手伝いをしています。金額の合計は数百万ドルにもなります。Mobingi Wave を[使い始める](https://docs.mobingi.com/v/wave/mobingi-wave/prep)のはとても簡単です。

別の記事で CUR CSV 形式についてもっと詳しく説明します。