この記事は公開されてから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}
は出力フォーマットで、csv
かjson
を選択できます。
が、ひとまずどんなサービスで使用できるかを確認して見ましょう。
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のオンデマンド料金だけみたいなことがやりたい人生だった…)