久しぶりに Azure の話。

Azure Database for MySQL はインスタンスの SKU によって利用できる vCore 数やメモリサイズが異なる。 SKU は Standard_B1msStandard_D2ds_v4 などの名前。

それぞれの SKU に対して、どのような vCore 数やメモリサイズが利用できるか確認したい場面がある。 そんなときに Location Based Capabilities API が便利。

Location Based Capabilities - List - REST API (Azure MySQL)

MySQL サービスの詳細 - 特定のサブスクリプション内の指定した場所にある機能を取得します。
icon
learn.microsoft.com

Location Based Capabilities API を使う

Location Based Capabilities API は Azure CLI からも利用可能。 以下のコマンドで特定のリージョンに対して利用できる SKU の一覧を取得できる。

az mysql flexible-server list-skus --location japaneast

このコマンドを実行すると「ゾーン → サービスレベル → バージョン → SKU」の順でネストされた配列が返ってくる。 大量に出てくるので、大幅に省略したものを載せておく。

[
  // ゾーン none の情報
  {
    "supportedFlexibleServerEditions": [
      {
        /// サービスレベル Burstable の情報
        "name": "Burstable",
        "supportedServerVersions": [
          {
            // バージョン 5.7 の情報
            "name": "5.7",
            "supportedSkus": [
              {
                /// SKU Standard_B1ms の情報
                "name": "Standard_B1ms",
                "supportedIops": 640,
                "supportedMemoryPerVCoreMb": 2048,
                "vCores": 1
              },
              (snip)
            ]
          },
          {
            // バージョン 8.0.21 の情報
            "name": "8.0.21",
          },
          {
            // バージョン 8.4 の情報
            "name": "8.4",
          },
          {
            // バージョン 9.3 の情報
            "name": "9.3",
          }
        ],
        "supportedStorageEditions": [
          {
            "maxBackupIntervalHours": null,
            "maxBackupRetentionDays": 35,
            "maxStorageSize": 16777216,
            "minBackupIntervalHours": null,
            "minBackupRetentionDays": 7,
            "minStorageSize": 20480,
            "name": "Premium"
          }
        ]
      },
      {
        // サービスレベル GeneralPurpose の情報
        "name": "GeneralPurpose",
      },
      {
        // サービスレベル BusinessCritical の情報
        "name": "BusinessCritical",
      }
    ],
    "supportedGeoBackupRegions": [
      "japanwest"
    ],
    "supportedHaMode": [
      "SameZone",
      "ZoneRedundant"
    ],
    "zone": "none"
  },
  {
    // ゾーン 1 の情報
    "supportedFlexibleServerEditions": [
    ],
    "zone": "1"
  },
  {
    // ゾーン 2 の情報
    "supportedFlexibleServerEditions": [
    ],
    "zone": "2"
  }
]

この結果から必要な SKU の vCore 数やメモリサイズを抽出して利用する。 jq を使う場合には「ゾーン → サービスレベル → バージョン → SKU」の順に展開して絞り込んでいく。

jq --arg zone "$ZONE" \
    --arg version "$VERSION" \
    --arg sku "$SKU" ' .[] | select(.zone == $zone) | .supportedFlexibleServerEditions[] | .supportedServerVersions[] | select(.name == $version) | .supportedSkus[] | select(.name == $sku) '

こんな感じで特定の SKU の情報を取得できるので、あとはいい感じに使う。 例えば、メモリは vCore あたりのサイズになっているので、vCore 数を掛けて合計メモリサイズを計算するなど。

{
  "name": "Standard_D2ds_v4",
  "supportedIops": 3200,
  "supportedMemoryPerVCoreMb": 4096,
  "vCores": 2
}

余談

あるサブスクリプションでは Japan East リージョンで MySQL を作るのにクォータ制限が掛かっていたので SKU の一覧が出てこなかった。

$ az mysql flexible-server list-skus -l japaneast
For prices please refer to https://aka.ms/mysql-pricing
[]

Azure Portal から MySQL 作ろうとしたときのエラー。

{
    "status": "Failed",
    "error": {
        "code": "ProvisionNotSupportedForRegion",
        "message": "Provisioning in requested region is not supported. Your subscription might not have access to create a server in the selected region. (https://aka.ms/mysqlcapacity)"
    }
}

サポートリクエスト上げて解除待ち。 解放されたらちゃんと出てくるようになるはず。