Azure Database for MySQL を Azure CLI で操作する際には、単一サーバーかフレキシブルサーバーでコマンドが別という話
いわさです。
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コマンド使ってみる
ついでにサーバーではなく、データベースを対象とする場合のコマンドも確認してみました。
というのも、サーバーの場合はserver
とflexible-server
という違いがあったのですが、データベースの場合はaz mysql db
とaz 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 Database for MySQL | Azure の更新情報 | Microsoft Azure
- Azure Database for MySQL フレキシブル サーバーのプレビュー開始 | Azure の更新情報 | Microsoft Azure
- Azure Database for MySQL - フレキシブル サーバーの一般提供を開始 | Azure の更新情報 | Microsoft Azure
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 }