Go
AWS

AWS Price List API から価格情報を引いてくるツールを作った

AWS Price List API で雑に月額を出してみる の続きです。

今回はある程度汎用的に使えそうなコマンドラインツールの形式で、 Go で実装しました。

実装について

Price List API のオファーファイルは本当にデカいので毎回落としてくるのは厳しいと思い、キャッシュする機構をつけてみました。

macOS の場合は /var/folders/xx/xxxxxxxxxxxxxxxxxx/T/awsprice らへんに保存されると思います。

Homebrew でインストールできるようにもしてみました。

使用したライブラリなど

表示には k0kubun/pp (Goのデバッグに便利なpretty printライブラリ「pp」を作った) を使わせてもらいました。大変きれいにターミナルに出力されて感激です。

CLI の骨組みは urfave/cli を使わせてもらいました。これがなかったらオプションまわりとか面倒すぎて死ぬ気がしました。

スライスをソートするのが面倒だったので bradfitz/slice も使わせてもらいました。 Go 力が足りない自分にはありがたい…

使いみちについて

おおよその使い方は README.ja.md に書いたので、実際何に使えるか考えてみます。

EFS が東京にまだ来てない現状を確認してみる

$ awsprice listOfferRegions -o AmazonEFS
[]awsprice.RegionCode{
  "ap-southeast-2",
  "eu-west-1",
  "us-east-1",
  "us-east-2",
  "us-west-2",
}

まだかな〜

リージョン毎に使えるインスタンスタイプの違いを見てみる

$ awsprice -f json listAttributes -p "Compute Instance" -r us-east-1 | jq ".instanceType | length"
77
$ awsprice -f json listAttributes -p "Compute Instance" -r ap-northeast-1 | jq ".instanceType | length"
73
$ awsprice -f json listAttributes -p "Compute Instance" -r eu-central-1 | jq ".instanceType | length"
56
$ awsprice -f json listAttributes -p "Compute Instance" -r ap-south-1 | jq ".instanceType | length"
45

新造リージョンは古いインスタンスタイプがなかったりで、使えるインスタンスタイプが少ないことがわかります。

awsprice 単体はそれほどクエリー機能が強力ではないですが、 JSON で出力できるので jq などとの連携が簡単です。

最強インスタンス3年一括お買い上げの値段で腰を抜かしてみる

$ awsprice -f json listProductTerms -r ap-northeast-1 -a instanceType=x1.32xlarge -a operatingSystem=Linux -a preInstalledSw=NA -a tenancy=Dedicated --termType Reserved -t "PurchaseOption=All Upfront" -t LeaseContractLength=3yr -t OfferingClass=standard | jq ".[0].OfferTerms[0].PriceDimensions"
{
  "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.2TG2D8R56U": {
    "RateCode": "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.2TG2D8R56U",
    "Description": "Upfront Fee",
    "BeginRange": "",
    "EndRange": "",
    "Unit": "Quantity",
    "PricePerUnit": {
      "USD": "142204"
    },
    "AppliesTo": []
  },
  "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.6YS6EN2CT7": {
    "RateCode": "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.6YS6EN2CT7",
    "Description": "USD 0.0 per Linux/UNIX (Amazon VPC), x1.32xlarge instance-hour (or partial hour)",
    "BeginRange": "0",
    "EndRange": "Inf",
    "Unit": "Hrs",
    "PricePerUnit": {
      "USD": "0.0000000000"
    },
    "AppliesTo": []
  }
}

1,600万円あったら何するかなあ… :skull:

最強インスタンスでなくても、この要領でインスタンス単体のお値段を調べることができます。

で、月額は?

汎用的に使えるツールを目指した結果、 EC2 以外のサービスの情報も引けるようになったのはいいのですが、価格単位が時間以外のものも混ざってきて、しかも時間単位でも RI の扱いをどうしたものか……と悩んで結局実装してません。

なにかいいアイデアがあれば教えてください…