Azure Retail Price APIでAzure価格取得してみた

# 1. Azure Retail Price APIとは

Azure各サービスの価格を取得できるAPIです（請求額ではない）。
詳細はこちらを参照ください。  

https://docs.microsoft.com/ja-jp/rest/api/cost-management/retail-prices/azure-retail-prices

# 2. 使い方
## 概要

`https://prices.azure.com/api/retail/prices`に対してリクエストを投げるだけです。
ただし結果が膨大なためフィルターをかけた方が良さそうです。

## URI作ってみる

今回はAv2シリーズ仮想マシンの課金情報を引っ張ってみることにします。

| Key                       | Value                 |
| :------------------------ | :-------------------- |
| 通貨 (currencyCode)        | 日本円 (JPY)           |
| サービス (serviceName)     | Virtual Machines      |
| リージョン (armRegionName) | 東日本 (japaneast)     |
| 課金体系 (pricetype)       | 従量課金 (Consumption) |
| SKU (skuName)              | Standard Av2シリーズ  |

できたURIがこちら（長い）。

```
https://prices.azure.com/api/retail/prices?currencyCode='JPY'&$filter=serviceName eq 'Virtual Machines' and armRegionName eq 'japaneast' and pricetype eq 'Consumption' and startswith(skuName, 'A') and endswith(skuName, 'v2')
```

ワイルドカード的な書き方が分からなかったため、「Aで始まり」「v2で終わる」フィルターにしてみました。
もっとうまい書き方があれば教えていただきたいです。

## 投げてみる

今回はPowerShellコマンドで投げてみます。

### コマンド

```PowerShell
# URL作成 ($はエスケープ)
PS> $uri="https://prices.azure.com/api/retail/prices?currencyCode='JPY'&`$filter=serviceName eq 'Virtual Machines' and armRegionName eq 'japaneast' and pricetype eq 'Consumption' and startswith(skuName, 'A') and endswith(skuName, 'v2')"
# API叩く
PS> (Invoke-RestMethod -Method Get -Uri $uri).Items | Select-Object currencyCode,retailPrice,armRegionName,productName,skuName,serviceName,unitOfMeasure | Format-Table -AutoSize
```

### 結果

無事Av2シリーズ仮想マシンの料金が取れました。（2021/10/27時点）

```
currencyCode retailPrice armRegionName productName                         skuName serviceName      unitOfMeasure
------------ ----------- ------------- -----------                         ------- -----------      -------------
JPY              25.9644 japaneast     Virtual Machines Av2 Series Windows A2m v2  Virtual Machines 1 Hour       
JPY              12.5922 japaneast     Virtual Machines Av2 Series         A2 v2   Virtual Machines 1 Hour       
JPY              39.7823 japaneast     Virtual Machines Av2 Series Windows A4 v2   Virtual Machines 1 Hour       
JPY               9.0262 japaneast     Virtual Machines Av2 Series Windows A1 v2   Virtual Machines 1 Hour       
JPY               6.0175 japaneast     Virtual Machines Av2 Series         A1 v2   Virtual Machines 1 Hour       
JPY              17.0496 japaneast     Virtual Machines Av2 Series         A2m v2  Virtual Machines 1 Hour       
JPY              18.9439 japaneast     Virtual Machines Av2 Series Windows A2 v2   Virtual Machines 1 Hour       
JPY              75.4415 japaneast     Virtual Machines Av2 Series         A8m v2  Virtual Machines 1 Hour       
JPY              35.8821 japaneast     Virtual Machines Av2 Series         A4m v2  Virtual Machines 1 Hour       
JPY              54.3803 japaneast     Virtual Machines Av2 Series Windows A4m v2  Virtual Machines 1 Hour       
JPY              83.5762 japaneast     Virtual Machines Av2 Series Windows A8 v2   Virtual Machines 1 Hour       
JPY              55.7175 japaneast     Virtual Machines Av2 Series         A8 v2   Virtual Machines 1 Hour       
JPY             114.2209 japaneast     Virtual Machines Av2 Series Windows A8m v2  Virtual Machines 1 Hour       
JPY              26.5215 japaneast     Virtual Machines Av2 Series         A4 v2   Virtual Machines 1 Hour       
```

## 補足

APIの制限として、結果上限が100件となっている模様です。
100件をこえる場合は、レスポンス内に次の100件を引き出すためのURIが記載されているため、
そちらを投げることで101件目以降の結果を確認できます。

### コマンド

```PowerShell
PS> $uri="https://prices.azure.com/api/retail/prices?currencyCode='JPY'&`$filter=serviceName eq 'Virtual Machines' and armRegionName eq 'japaneast' and pricetype eq 'Consumption'"
PS> (Invoke-RestMethod -Method Get -Uri $uri).NextPageLink
```

### 結果

```
https://prices.azure.com:443/api/retail/prices?currencyCode=%27JPY%27&$filter=serviceName%20eq%20%27Virtual%20Machines%27%20and%20armRegionName%20eq%20%27japaneast%27%20and%20pricetype%20eq%20%27Consumption%27&$skip=100
```

# 3. 感想

フィルターは多少面倒でしたが、サクッと料金を引っ張ってくることができました。
Azureに限らずクラウドの料金は予告なく変動あるため、常に最新の価格を取ってこられるのは便利だと思います。
普通に料金算出するなら「Azure料金計算ツール」がありますが...
自前で料金計算ツール作りたい方はぜひ。

https://azure.microsoft.com/ja-jp/pricing/calculator/

# #11/10追記

値上がりしていました。やはり、いつ変わるか分からないですね。（2021/11/10時点）

```
currencyCode retailPrice armRegionName productName                         skuName serviceName      unitOfMeasure
------------ ----------- ------------- -----------                         ------- -----------      -------------
JPY              26.4968 japaneast     Virtual Machines Av2 Series Windows A2m v2  Virtual Machines 1 Hour       
JPY              12.8504 japaneast     Virtual Machines Av2 Series         A2 v2   Virtual Machines 1 Hour       
JPY              40.5980 japaneast     Virtual Machines Av2 Series Windows A4 v2   Virtual Machines 1 Hour       
JPY               9.2113 japaneast     Virtual Machines Av2 Series Windows A1 v2   Virtual Machines 1 Hour       
JPY               6.1409 japaneast     Virtual Machines Av2 Series         A1 v2   Virtual Machines 1 Hour       
JPY              17.3992 japaneast     Virtual Machines Av2 Series         A2m v2  Virtual Machines 1 Hour       
JPY              19.3324 japaneast     Virtual Machines Av2 Series Windows A2 v2   Virtual Machines 1 Hour       
JPY              76.9884 japaneast     Virtual Machines Av2 Series         A8m v2  Virtual Machines 1 Hour       
JPY              36.6178 japaneast     Virtual Machines Av2 Series         A4m v2  Virtual Machines 1 Hour       
JPY              55.4954 japaneast     Virtual Machines Av2 Series Windows A4m v2  Virtual Machines 1 Hour       
JPY              85.2900 japaneast     Virtual Machines Av2 Series Windows A8 v2   Virtual Machines 1 Hour       
JPY              56.8600 japaneast     Virtual Machines Av2 Series         A8 v2   Virtual Machines 1 Hour       
JPY             116.5630 japaneast     Virtual Machines Av2 Series Windows A8m v2  Virtual Machines 1 Hour       
JPY              27.0654 japaneast     Virtual Machines Av2 Series         A4 v2   Virtual Machines 1 Hour       
```