Azure CLI を使って Azure Quota API を試してみた

## 背景と目的

Azure ポータルのサブスクリプション -> 設定にある「使用料＋クォータ」で確認している、VM の vCPU 使用量が REST API で取得出来るようになったようです。

ただ、REST API のアクセストークンを毎回取得して実行しても良いのですが、もっと簡単に Azure CLI を使った REST API の実行方法があるので試してみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```zsh:zsh
% sw_vers
ProductName:    macOS
ProductVersion: 11.2.3
BuildVersion:   20D91

% az version                            
{
  "azure-cli": "2.21.0",
  "azure-cli-core": "2.21.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

```zsh:zsh
# Azure Quota API を実行するためのリソースプロバイダーが登録されているか確認します。
% az provider show \
  --namespace Microsoft.Capacity \
  --query registrationState

"NotRegistered" # 登録されていませんでした。

# Azure Quota API を実行するためのリソースプロバイダーを登録します。
% az provider register \
  --namespace Microsoft.Capacity

Registering is still on-going. You can monitor using 'az provider show -n Microsoft.Capacity'

# Azure Quota API を実行するためのリソースプロバイダーが登録されたかを確認します。
% az provider show \
  --namespace Microsoft.Capacity \
  --query registrationState

"Registering" # 登録されました。

# サブスクリプションの ID を取得します。
subscriptionid=$(az account show \
  --query id \
  --output tsv)

# 対象リージョンをセットします。
region=japaneast

# Azure CLI で REST API を実行します。
% az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/${subscriptionid}/providers/Microsoft.Capacity/resourceProviders/Microsoft.Compute/locations/${region}/serviceLimits?api-version=2020-10-25" \
  --query "value[].{name:properties.name.localizedValue, currentValue:properties.currentValue, limit:properties.limit}" \
  --output table

Bad Request({"error":{"code":"MissingRegistrationForResourceProvider","message":"The subscription is not in registered state for the resource provider: Microsoft.Capacity."}}) # まだリソースプロバイダーの登録が反映していないようです。
```

## 実施結果

Azure Quota API を Azure CLI から実行して、対象リージョンのクォータ名、現在の使用量、リミット（現在の上限）を一覧表示することが出来ました。

```zsh:zsh
% az rest \
  --method get \
  --url "https://management.azure.com/subscriptions/${subscriptionid}/providers/Microsoft.Capacity/resourceProviders/Microsoft.Compute/locations/${region}/serviceLimits?api-version=2020-10-25" \
  --query "value[].{name:properties.name.localizedValue, currentValue:properties.currentValue, limit:properties.limit}" \
  --output table

Name                                      CurrentValue    Limit
----------------------------------------  --------------  -------
Total Regional vCPUs                      2               10
Total Regional Low-priority vCPUs         0               10
Standard DSv4 Family vCPUs                2               10
Standard BS Family vCPUs                  0               10
Basic A Family vCPUs                      0               10
Standard A0-A7 Family vCPUs               0               10
Standard A8-A11 Family vCPUs              0               10
Standard D Family vCPUs                   0               10
Standard Dv2 Family vCPUs                 0               10
Standard DS Family vCPUs                  0               10
Standard DSv2 Family vCPUs                0               10
Standard G Family vCPUs                   0               10
Standard GS Family vCPUs                  0               10
Standard F Family vCPUs                   0               10
Standard FS Family vCPUs                  0               10
Standard NV Family vCPUs                  0               6
Standard NC Family vCPUs                  0               6
Standard H Family vCPUs                   0               8
Standard Av2 Family vCPUs                 0               10
Standard LS Family vCPUs                  0               10
Standard MS Family vCPUs                  0               0
Standard Dv3 Family vCPUs                 0               10
Standard DSv3 Family vCPUs                0               10
Standard Ev3 Family vCPUs                 0               10
Standard ESv3 Family vCPUs                0               10
Standard Dv4 Family vCPUs                 0               10
Standard DDv4 Family vCPUs                0               10
Standard DDSv4 Family vCPUs               0               10
Standard Ev4 Family vCPUs                 0               10
Standard EDv4 Family vCPUs                0               10
Standard ESv4 Family vCPUs                0               10
Standard EDSv4 Family vCPUs               0               10
Standard FSv2 Family vCPUs                0               10
Standard NDS Family vCPUs                 0               0
Standard NCSv2 Family vCPUs               0               0
Standard NCSv3 Family vCPUs               0               0
Standard LSv2 Family vCPUs                0               10
Standard EIv3 Family vCPUs                0               10
Standard EISv3 Family vCPUs               0               10
Standard DCS Family vCPUs                 0               0
Standard MSv2 Family vCPUs                0               0
Standard HBS Family vCPUs                 0               0
Standard HCS Family vCPUs                 0               0
Standard NVSv3 Family vCPUs               0               0
Standard NC Promo Family vCPUs            0               6
Standard H Promo Family vCPUs             0               8
Standard DAv4 Family vCPUs                0               10
Standard DASv4 Family vCPUs               0               10
Standard EAv4 Family vCPUs                0               10
Standard EASv4 Family vCPUs               0               10
Standard DCSv2 Family vCPUs               0               0
Standard NVSv4 Family vCPUs               0               0
Standard NDSv2 Family vCPUs               0               0
Standard HBrsv2 Family vCPUs              0               0
Standard NCASv3_T4 Family vCPUs           0               0
Standard EIDSv4 Family vCPUs              0               10
Standard XEISv4 Family vCPUs              0               10
Standard HBv3 Family vCPUs                0               0
Standard MDSMediumMemoryv2 Family vCPUs   0               10
Standard MIDSMediumMemoryv2 Family vCPUs  0               10
Standard MSMediumMemoryv2 Family vCPUs    0               10
Standard MISMediumMemoryv2 Family vCPUs   0               10
```

## 参考

[Automating quota management with Azure Quota REST API](https://azure.microsoft.com/ja-jp/blog/automating-quota-management-with-azure-quota-rest-api/)

[Quotas_listUsagesForCompute](https://docs.microsoft.com/ja-jp/rest/api/reserved-vm-instances/quota/list#quotas_listusagesforcompute)

[az rest](https://docs.microsoft.com/ja-jp/cli/azure/reference-index?view=azure-cli-latest#az_rest)