AWS Price List APIをぶっ叩く

Chromeのタブ開きすぎてパフォーマンスが辛いので積みタブ消化。

#AWS Price List APIとは？
AWSサービスの価格を取ってくるAPIです。

結構最近リリースされた（はず）

##とりあえず叩く
###ルートのAPI
<code>https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json</code>

us-east-1となっているけども、他のリージョンに変えるとつながらないのでまだ対応していない様子。

####戻り値
```
{
  "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": "2016-01-07T05:56:50Z",
  "offers": {
    "AmazonS3": {
      "offerCode": "AmazonS3",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonS3/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonS3/current/index.json"
    },
    "AmazonGlacier": {
      "offerCode": "AmazonGlacier",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonGlacier/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonGlacier/current/index.json"
    },
    "AmazonSES": {
      "offerCode": "AmazonSES",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonSES/current/index.json"
    },
    "AmazonRDS": {
      "offerCode": "AmazonRDS",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonRDS/current/index.json"
    },
    "AmazonSimpleDB": {
      "offerCode": "AmazonSimpleDB",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonSimpleDB/current/index.json"
    },
    "AmazonDynamoDB": {
      "offerCode": "AmazonDynamoDB",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonDynamoDB/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonDynamoDB/current/index.json"
    },
    "AmazonEC2": {
      "offerCode": "AmazonEC2",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonEC2/current/index.json"
    },
    "AmazonRoute53": {
      "offerCode": "AmazonRoute53",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonRoute53/current/index.json"
    },
    "AmazonRedshift": {
      "offerCode": "AmazonRedshift",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonRedshift/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonRedshift/current/index.json"
    },
    "AmazonElastiCache": {
      "offerCode": "AmazonElastiCache",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonElastiCache/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonElastiCache/current/index.json"
    },
    "AmazonCloudFront": {
      "offerCode": "AmazonCloudFront",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonCloudFront/current/index.json"
    },
    "awskms": {
      "offerCode": "awskms",
      "versionIndexUrl": "/offers/v1.0/aws/awskms/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/awskms/current/index.json"
    },
    "AmazonVPC": {
      "offerCode": "AmazonVPC",
      "versionIndexUrl": "/offers/v1.0/aws/AmazonVPC/index.json",
      "currentVersionUrl": "/offers/v1.0/aws/AmazonVPC/current/index.json"
    }
  }
}
```
サービス別のプライスリストJSONのURLらしきものが並んでます。

とりあえず1つ叩いてみましょう。

##EC2の価格を見る
そろそろ「まだEC2で消耗しているの？」と煽られそうな気配ですが気にせずAPIを叩きます。

先ほどの値からEC2の情報だけ見れるようにjqで絞り込みます。

```#bash
$ curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json | jq ".offers.AmazonEC2"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2721  100  2721    0     0  13938      0 --:--:-- --:--:-- --:--:-- 13953
{
  "offerCode": "AmazonEC2",
  "currentVersionUrl": "/offers/v1.0/aws/AmazonEC2/current/index.json"
}
```

`/offers/v1.0/aws/AmazonEC2/current/index.json`がそれっぽいですね。

ということで`https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.json`で再度APIを叩いてみます。

```
% curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/index.json | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39.9M  100 39.9M    0     0   995k      0  0:00:41  0:00:41 --:--:-- 1160k
```

40MBて・・・╭(°A°`)╮
EC2のインスタンスリストを全部返してきてるとかなのかもしれないです。

返ってくる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/",
  "offerCode": "AmazonEC2",
  "version": "20151209144527",
  "publicationDate": "2015-12-09T14:45:27Z",
  "products": {
    "DQ578CGN99KG6ECF": {
      "sku": "DQ578CGN99KG6ECF",
      "productFamily": "Compute Instance",
      "attributes": {
        "servicecode": "AmazonEC2",
        "location": "US East (N. Virginia)",
        "locationType": "AWS Region",
        "instanceType": "hs1.8xlarge",
        "currentGeneration": "No",
        "instanceFamily": "Storage optimized",
        "vcpu": "17",
        "physicalProcessor": "Intel Xeon E5-2650",
        "clockSpeed": "2 GHz",
        "memory": "117 GiB",
        "storage": "24 x 2000",
        "networkPerformance": "10 Gigabit",
        "processorArchitecture": "64-bit",
        "tenancy": "Shared",
        "operatingSystem": "Windows",
        "licenseModel": "License Included",
        "usagetype": "BoxUsage:hs1.8xlarge",
        "operation": "RunInstances:0002",
        "preInstalledSw": "NA"
      }
    },
    "#以下省略" : "",
}
```
興味本位で行数を調べてみたところ **1,128,401行** ありました。
検索クエリ的なものは見当たらなかったので「とりあえずJSONでDLできるぜオラー」ってかんじなのかもです。

##どう使う？
JavaScriptでどうこうするためというよりはElasticsearchとかHadoopとかぶん回しながら使う系かも。

ブラウザで40MBのJSONとかダウンロードしだしたら非常に辛いし。

##追記
公式のドキュメントにこんなこと書かれてるので、マジで「とりあえずJSON見れるようにしたぜオラー」な気がしてきました。

>To find a reserved Amazon EC2 instance using the JSON file
>1:Download the JSON file.
>2:Open the JSON file with your program of choice. For this example, we use Notepad++.
>3:Press CRTL+F.
>4:For Find what:, type reserved.
>5:Choose Find All in Current Document.
>From:http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/procedures.html

「CRTL+Fで検索しろ」て・・・