Azure Database for MySQL を Azure CLI で操作する際には、単一サーバーかフレキシブルサーバーでコマンドが別という話

2022.05.15

いわさです。

Azure Database for MySQLを利用されている方から、「az mysql server listで、作成したサーバーが表示されない」というご相談を頂きました。

Azure Database for MySQLには、デプロイオプションの概念があって単一サーバーとフレキシブルサーバーという2つの種類があります。
この2つのデプロイモードごとに使うAzure CLIのコマンドが異なっています。

なお、現在は基本的にはフレキシブルサーバーの利用が推奨されています。
この記事では単一サーバーとフレキシブルサーバーの違いについての説明を行いませんので、詳細は以下をご確認ください。

Azure CLIを実行し、2つのコマンドの違いを確認してみる

以下のように単一サーバーとフレキシブルサーバーのMySQLを作成しました。

server listコマンド

まずはサーバー一覧を取得するためのコマンドを実行してみます。
az mysql server listと、az mysql flexible-server listの2つがあります。

前者のaz mysql server listを試してみましょう。
こちらは、単一サーバーだけが対象で、フレキシブルサーバーは対象とされません。

iwasa_takahito@Azure:~$ az mysql server list
[
  {
    "administratorLogin": "hoge",
    "byokEnforcement": "Disabled",
    "earliestRestoreDate": "2022-05-14T22:15:30.960000+00:00",
    "fullyQualifiedDomainName": "hoge0515single.mysql.database.azure.com",
    "id": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/20220515/providers/Microsoft.DBforMySQL/servers/hoge0515single",
    "identity": null,
    "infrastructureEncryption": "Disabled",
    "location": "eastus",
    "masterServerId": "",
    "minimalTlsVersion": "TLSEnforcementDisabled",
    "name": "hoge0515single",
    "privateEndpointConnections": [],
    "publicNetworkAccess": "Enabled",
    "replicaCapacity": null,
    "replicationRole": "",
    "resourceGroup": "20220515",
    "sku": {
      "capacity": 1,
      "family": "Gen5",
      "name": "B_Gen5_1",
      "size": null,
      "tier": "Basic"
    },
    "sslEnforcement": "Enabled",
    "storageProfile": {
      "backupRetentionDays": 7,
      "geoRedundantBackup": "Disabled",
      "storageAutogrow": "Enabled",
      "storageMb": 5120
    },
    "tags": {},
    "type": "Microsoft.DBforMySQL/servers",
    "userVisibleState": "Ready",
    "version": "5.7"
  }
]

単一サーバーが取得されました。

フレキシブルサーバーを抽出したい場合は後者のaz mysql flexible-server listを使う必要があります。
こちらは逆に単一サーバーは抽出対象外です。

iwasa_takahito@Azure:~$ az mysql flexible-server list
[
  {
    "administratorLogin": "hoge",
    "administratorLoginPassword": null,
    "availabilityZone": "1",
    "backup": {
      "backupRetentionDays": 7,
      "earliestRestoreDate": "2022-05-14T22:03:09.280018+00:00",
      "geoRedundantBackup": "Disabled"
    },
    "createMode": null,
    "fullyQualifiedDomainName": "hoge0515mysql.mysql.database.azure.com",
    "highAvailability": {
      "mode": "Disabled",
      "standbyAvailabilityZone": null,
      "state": "NotEnabled"
    },
    "id": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/20220515/providers/Microsoft.DBforMySQL/flexibleServers/hoge0515mysql",
    "location": "East US",
    "maintenanceWindow": null,
    "name": "hoge0515mysql",
    "network": {
      "delegatedSubnetResourceId": null,
      "privateDnsZoneResourceId": null,
      "publicNetworkAccess": "Enabled"
    },
    "replicaCapacity": 10,
    "replicationRole": "None",
    "resourceGroup": "20220515",
    "restorePointInTime": null,
    "sku": {
      "name": "Standard_B1ms",
      "tier": "Burstable"
    },
    "sourceServerResourceId": null,
    "state": "Ready",
    "storage": {
      "autoGrow": "Enabled",
      "iops": 360,
      "storageSizeGb": 20,
      "storageSku": "Premium_LRS"
    },
    "systemData": {
      "createdAt": "2022-05-14T21:53:09.280018+00:00",
      "createdBy": null,
      "createdByType": null,
      "lastModifiedAt": null,
      "lastModifiedBy": null,
      "lastModifiedByType": null
    },
    "tags": {},
    "type": "Microsoft.DBforMySQL/flexibleServers",
    "version": "5.7"
  }
]

フレキシブルサーバーが取得されました。

dbコマンド使ってみる

ついでにサーバーではなく、データベースを対象とする場合のコマンドも確認してみました。

というのも、サーバーの場合はserverflexible-serverという違いがあったのですが、データベースの場合はaz mysql dbaz mysql flexible-server dbコマンドが存在しています。

上記のようなコマンド階層となっていたので、az mysql dbが単一・フレキシブルどちらも対応していて、az mysql felxible-server dbがフレキシブル用なのかと最初思ったのですが、az mysql server dbコマンドは存在していません。

mysql db

mysql dbコマンドで単一サーバーを指定して最低限のパラメータでデータベースを作成してみると以下のように作成が出来ました。

iwasa_takahito@Azure:~$ az mysql db create --name hoge1 --resource-group 20220515 --server-name hoge0515single
{
  "charset": "latin1",
  "collation": "latin1_swedish_ci",
  "id": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/20220515/providers/Microsoft.DBforMySQL/servers/hoge0515single/databases/hoge1",
  "name": "hoge1",
  "resourceGroup": "20220515",
  "type": "Microsoft.DBforMySQL/servers/databases"
}

フレキシブルサーバーも同じように指定してみると以下のようにエラーとなりました。
このコマンドは単一サーバー用でフレキシブルサーバーには使えないことが確認出来ました。

iwasa_takahito@Azure:~$ az mysql db create --name hoge1 --resource-group 20220515 --server-name hoge0515mysql
(ResourceNotFound) The Resource 'Microsoft.DBforMySQL/servers/hoge0515mysql' under resource group '20220515' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Code: ResourceNotFound
Message: The Resource 'Microsoft.DBforMySQL/servers/hoge0515mysql' under resource group '20220515' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix

mysql flexible-server db

フレキシブルサーバーの場合は、mysql flexible-server dbを使います。
なお、データベース名パラメータは先程はnameでしたがこちらではdatabase-nameになっているのでパラメータ名の違いは意識が必要です。

iwasa_takahito@Azure:~$ az mysql flexible-server db create --database-name hoge1 --resource-group 20220515 --server-name hoge0515mysql
Creating database with utf8 charset and utf8_general_ci collation
{
  "charset": "utf8",
  "collation": "utf8_general_ci",
  "id": "/subscriptions/11111111-2222-3333-4444-555555555555/resourceGroups/20220515/providers/Microsoft.DBforMySQL/flexibleServers/hoge0515mysql/databases/hoge1",
  "name": "hoge1",
  "resourceGroup": "20220515",
  "systemData": null,
  "type": "Microsoft.DBforMySQL/flexibleServers/databases"
}

さいごに

本日は、Azure Database for MySQLの単一サーバーとフレキシブルサーバーでのAzure CLIコマンドの違いを確認してみました。
このようにデプロイオプションでコマンドが異なっているので、Azure CLIコマンドで操作を行うドキュメントを参考にする際などはその違いを意識しておくと良さそうです。

Azure Database for MySQL自体のGAが2018年4月18日でその当時はフレキシブルサーバーの概念はありませんでした。
その後、フレキシブルサーバーが2020年9月22日にパブリックプレビューとして登場し、公式ドキュメントの履歴ではその頃から「単一サーバー」と「フレキシブルサーバー」で分けて記述がされるようになっているようです。
フレキシブルサーバーが後から追加された機能ということでAzure CLIコマンドの階層が少しレベルが違う感じになってしまっているのかもしれないですね。

Azureポータルで確認したように「Azure Database for MySQL」のサーバー一覧が取得したい場合の、共通的な取得コマンドはaz mysqlには存在していないようでしたので、デプロイオプションに関わらず一覧を取得したい場合は、より抽象的なResource Graphなどを利用する形になるのではないかなと思います。

iwasa_takahito@Azure:~$ az graph query -q "Resources | where type has 'microsoft.dbformysql/' | project name, type, resourceGroup"
{
  "count": 2,
  "data": [
    {
      "name": "hoge0515flexible",
      "resourceGroup": "20220515",
      "type": "microsoft.dbformysql/flexibleservers"
    },
    {
      "name": "hoge0515single",
      "resourceGroup": "20220515",
      "type": "microsoft.dbformysql/servers"
    }
  ],
  "skip_token": null,
  "total_records": 2
}