各AWSサービスの最新の価格を確認できる「AWS Price List API」が公開されました!

AWS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

連日の飲み会で軽い頭痛が継続している森永です。

AWSは価格変更が頻繁にあることもあり、プログラマチックにAWSの料金計算をすることが困難でした。
最新の価格を知るにはわざわざ公式ドキュメントを確認する必要がありなんとかならないかなぁと思っていた方も多いかと思います。

今回、AWSが公式で各AWSサービスの価格を確認することが出来る「AWS Price List API」を公開されました! Amazon Web Services ブログ: 【AWS発表】新しいAWS Price List API

使い方

以下のURLに問い合わせるだけです。

https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/{offer_code}/current/index.{format}

{offer_code}はサービス名、{format}は出力フォーマットで、csvjsonを選択できます。

が、ひとまずどんなサービスで使用できるかを確認して見ましょう。
https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.jsonにアクセスすることで{offer_code}を確認できます。

$ curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.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-12-09T23:40:29Z",
  "offers" : {
    "AmazonS3" : {
      "offerCode" : "AmazonS3",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonS3/current/index.json"
    },
    "AmazonGlacier" : {
      "offerCode" : "AmazonGlacier",
      "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",
      "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",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonRedshift/current/index.json"
    },
    "AmazonCloudFront" : {
      "offerCode" : "AmazonCloudFront",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonCloudFront/current/index.json"
    },
    "awskms" : {
      "offerCode" : "awskms",
      "currentVersionUrl" : "/offers/v1.0/aws/awskms/current/index.json"
    },
    "AmazonVPC" : {
      "offerCode" : "AmazonVPC",
      "currentVersionUrl" : "/offers/v1.0/aws/AmazonVPC/current/index.json"
    }
  }
}

jqを使うと、JSONを見やすく整形することが可能です。

$ curl https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json | jq .offers[].offerCode
"AmazonS3"
"AmazonGlacier"
"AmazonSES"
"AmazonRDS"
"AmazonSimpleDB"
"AmazonDynamoDB"
"AmazonEC2"
"AmazonRoute53"
"AmazonRedshift"
"AmazonCloudFront"
"awskms"
"AmazonVPC"

現在対応しているのは上記のAWSサービスのようです。

では、料金を見てみましょう。

いちばん料金の気になるEC2を見てみることにします。
jqで処理したいので今回はjsonを指定します。
Excelなどで処理したい場合はcsvが有用かと思います。

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

を打ってみましたが、すさまじい量なので一旦wgetなどでダウンロードすることをオススメします。
というかそうしないとコマンド一回打つのに凄い時間がかかりますし、AWSのサーバへ負荷がかかってしまいます。(最新情報を得るための単発コマンドならありですが)

データの構造は以下のようになっています。(順番は保証致しません)

{
    "offerCode" : "AmazonEC2",
    "products" : {
        "SKUの値" : {
            各インスタンスタイプ(リージョン、OSなどで別々)の詳細情報
        },
        ...
    },
    "terms" : {
        "OnDemand" : {
            "SKUの値" : {
                オンデマンドの料金情報
            }
        },
        "Reserved" : {
            "SKUの値" : {
                "SKUの値.乱数" : {
                    Partial Upfront 1年契約の料金情報
                },
                "SKUの値.乱数" : {
                    Partial Upfront 3年契約の料金情報
                },
                "SKUの値.乱数" : {
                    All Upfront 1年契約の料金情報
                },
                "SKUの値.乱数" : {
                    All Upfront 3年契約の料金情報
                },
                "SKUの値.乱数" : {
                    No Upfront 1年契約の料金情報
                }
            },
            ...
        }
    }
}

SKU(Stock Keeping Unit)を言うのがキモで、各インスタンスタイプにユニークなSKUが割り当てらてられています。
この値を調べると、オンデマンドでもリザーブドでも料金情報を調べることが出来るわけです。

EC2以外のサービスに関しても、「製品情報」と「料金情報」にわけられています。

さいごに

これを使えば最新のAWSリソースの料金を簡単に知ることが出来るようになります。
特定のインスタンスタイプ条件から料金を引っ張ってくるというのをjqでやろうとしたのですが、なかなか骨が折れたので別のメンバーに任せることにします。。。
(東京リージョンのLinuxのオンデマンド料金だけみたいなことがやりたい人生だった…)

AWS Cloud Roadshow 2017 福岡