Команда Azure CLI az sql mi create используется для подготовки нового Управляемого экземпляра SQL Azure. Следующая команда подготавливает управляемый экземпляр с пользовательски назначенным управляемым удостоверением, а также включает аутентификацию, использующую только Microsoft Entra.
Примечание.
Для данного сценария требуется создать виртуальную сеть и подсеть в качестве необходимого компонента.
Имя для входа администратора SQL управляемого экземпляра создается автоматически, а также устанавливается случайный пароль. Так как возможность подключения с проверкой подлинности SQL отключена с помощью данной подготовки, учетные данные администратора SQL не будут использоваться.
Администратор Microsoft Entra будет учетной записью, которую <AzureADAccount>вы задали, и может использоваться для управления экземпляром после завершения подготовки.
Замените в примере приведенные ниже значения.
-
<subscriptionId>: ваш идентификатор подписки можно найти на портале Azure.
-
<ResourceGroupName>: имя группы ресурсов для управляемого экземпляра. Группа ресурсов также должна включать созданные виртуальную сеть и подсеть.
-
<managedIdentity> — управляемое удостоверение, назначаемое пользователем. Также может использоваться в качестве основного удостоверения.
-
<primaryIdentity> — основное удостоверение, которое вы хотите использовать в качестве удостоверения экземпляра.
-
<AzureADAccount>: может быть пользователем или группой Microsoft Entra. Например: DummyLogin
-
<AzureADAccountSID>: идентификатор объекта Microsoft Entra для пользователя
-
<managedinstancename>: имя управляемого экземпляра, который требуется создать.
- Параметр
subnet необходимо обновить с помощью <subscriptionId>, <ResourceGroupName>, <VNetName> и <SubnetName>.
# Define variables for resources
subscriptionId="<subscriptionId>"
resourceGroupName="<ResourceGroupName>"
managedIdentity="<managedIdentity>"
primaryIdentity="<primaryIdentity>"
AzureADAccount="<AzureADAccount>"
AzureADAccountSID="<AzureADAccountSID>"
VNetName="<VNetName>"
SubnetName="<SubnetName>"
managedinstancename="<managedinstancename>"
# Create a managed instance with a user-assigned managed identity
az sql mi create \
--assign-identity \
--identity-type UserAssigned \
--user-assigned-identity-id "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$managedIdentity" \
--primary-user-assigned-identity-id "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$primaryIdentity" \
--enable-ad-only-auth \
--external-admin-principal-type User \
--external-admin-name $AzureADAccount \
--external-admin-sid $AzureADAccountSID \
-g $resourceGroupName \
-n $managedinstancename \
--subnet "/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Network/virtualNetworks/$VNetName/subnets/$SubnetName"
Дополнительные сведения см. в разделе az sql mi create.
Примечание.
В примере выше выполняется подготовка управляемого экземпляра только с назначаемым пользователем управляемым удостоверением. Вы можете задать для --identity-type значение UserAssigned,SystemAssigned, если хотите создать оба типа управляемых удостоверений с экземпляром.
Команда PowerShell New-AzSqlInstance используется для подготовки нового Управляемого экземпляра SQL Azure. Следующая команда подготовит управляемый экземпляр с управляемым удостоверением, назначаемого пользователем, а также включите проверку подлинности только для Microsoft Entra.
Примечание.
Для данного сценария требуется создать виртуальную сеть и подсеть в качестве необходимого компонента.
Имя для входа администратора SQL управляемого экземпляра создается автоматически, а также устанавливается случайный пароль. Так как возможность подключения с проверкой подлинности SQL отключена с помощью данной подготовки, учетные данные администратора SQL не будут использоваться.
Администратор Microsoft Entra будет учетной записью, которую <AzureADAccount>вы задали, и может использоваться для управления экземпляром после завершения подготовки.
Замените в примере приведенные ниже значения.
-
<managedinstancename>: имя управляемого экземпляра, который требуется создать.
-
<ResourceGroupName>: имя группы ресурсов для управляемого экземпляра. Группа ресурсов также должна включать созданные виртуальную сеть и подсеть.
-
<subscriptionId>: ваш идентификатор подписки можно найти на портале Azure.
-
<managedIdentity> — управляемое удостоверение, назначаемое пользователем. Также может использоваться в качестве основного удостоверения.
-
<primaryIdentity> — основное удостоверение, которое вы хотите использовать в качестве удостоверения экземпляра.
-
<Location> — расположение управляемого экземпляра, например West US или Central US.
-
<AzureADAccount>: может быть пользователем или группой Microsoft Entra. Например: DummyLogin
- Параметр
SubnetId необходимо обновить с помощью <subscriptionId>, <ResourceGroupName>, <VNetName> и <SubnetName>.
$instanceName = @{
Name = "<managedinstancename>"
ResourceGroupName = "<ResourceGroupName>"
AssignIdentity = $true
IdentityType = "UserAssigned"
UserAssignedIdentityId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>"
PrimaryUserAssignedIdentityId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<primaryIdentity>"
ExternalAdminName = "<AzureADAccount>"
EnableActiveDirectoryOnlyAuthentication = $true
Location = "<Location>"
SubnetId = "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VNetName>/subnets/<SubnetName>"
LicenseType = "LicenseIncluded"
StorageSizeInGB = 1024
VCore = 16
Edition = "GeneralPurpose"
ComputeGeneration = "Gen5"
}
New-AzSqlInstance @instanceName
Дополнительные сведения см. в статье New-AzSqlInstance.
Примечание.
В примере выше выполняется подготовка управляемого экземпляра только с назначаемым пользователем управляемым удостоверением. Вы можете задать для -IdentityType значение "UserAssigned,SystemAssigned", если хотите создать оба типа управляемых удостоверений с экземпляром.
Управляемый экземпляр SQL. Создание или обновление REST API можно использовать для создания управляемого экземпляра с управляемым удостоверением, назначаемого пользователем.
Примечание.
Для данного сценария требуется создать виртуальную сеть и подсеть в качестве необходимого компонента.
Следующий скрипт подготовит управляемый экземпляр с управляемым удостоверением, назначаемого пользователем, задайте администратору Microsoft Entra как <AzureADAccount>и включите проверку подлинности только для Microsoft Entra. Имя для входа администратора SQL экземпляра создается автоматически, а также устанавливается случайный пароль. Так как возможность подключения с проверкой подлинности SQL отключена с помощью данной подготовки, учетные данные администратора SQL не будут использоваться.
Администратор <AzureADAccount> Microsoft Entra может использоваться для управления экземпляром после завершения подготовки.
Замените в примере приведенные ниже значения.
-
<tenantId>: можно найти, перейдя в портал Azure и перейдя к ресурсу идентификатора Microsoft Entra. В области Обзор должен отображаться параметр Идентификатор клиента.
-
<subscriptionId>: ваш идентификатор подписки можно найти на портале Azure.
-
<instanceName>: используйте уникальное имя управляемого экземпляра.
-
<ResourceGroupName>: имя группы ресурсов для логического сервера.
-
<AzureADAccount>: может быть пользователем или группой Microsoft Entra. Например: DummyLogin
-
<Location>: расположение сервера, например westus2 или centralus.
-
<objectId>: можно найти, перейдя в портал Azure и перейдя к ресурсу идентификатора Microsoft Entra.
На панели "Пользователь" найдите пользователя Microsoft Entra и найдите свой идентификатор объекта
- Параметр
subnetId необходимо обновить с помощью <ResourceGroupName>, Subscription ID, <VNetName> и <SubnetName>.
Import-Module Azure
Import-Module MSAL.PS
$tenantId = '<tenantId>'
$clientId = '1950a258-227b-4e31-a9cf-717495945fc2' # Static Microsoft client ID used for getting a token
$subscriptionId = '<subscriptionId>'
$uri = "urn:ietf:wg:oauth:2.0:oob"
$instanceName = "<instanceName>"
$resourceGroupName = "<ResourceGroupName>"
$scopes ="https://management.core.windows.net/.default"
Login-AzAccount -tenantId $tenantId
# Login as an Azure AD user with permission to provision a managed instance
$result = Get-MsalToken -RedirectUri $uri -ClientId $clientId -TenantId $tenantId -Scopes $scopes
$authHeader = @{
'Content-Type'='application\json; '
'Authorization'=$result.CreateAuthorizationHeader()
}
$body = '{
"name": "<instanceName>", "type": "Microsoft.Sql/managedInstances", "identity": {"type" : "UserAssigned", "UserAssignedIdentities" : {"/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>" : {}}},"location": "<Location>", "sku": {"name": "GP_Gen5", "tier": "GeneralPurpose", "family":"Gen5","capacity": 8},
"properties": { "PrimaryUserAssignedIdentityId":"/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<primaryIdentity>","administrators":{ "login":"<AzureADAccount>", "sid":"<objectId>", "tenantId":"<tenantId>", "principalType":"User", "azureADOnlyAuthentication":true },
"subnetId": "/subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.Network/virtualNetworks/<VNetName>/subnets/<SubnetName>",
"licenseType": "LicenseIncluded", "vCores": 8, "storageSizeInGB": 2048, "collation": "SQL_Latin1_General_CP1_CI_AS", "proxyOverride": "Proxy", "timezoneId": "UTC", "privateEndpointConnections": [], "storageAccountType": "GRS", "zoneRedundant": false
}
}'
# To provision the instance, execute the `PUT` command
Invoke-RestMethod -Uri https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/managedInstances/$instanceName/?api-version=2020-11-01-preview -Method PUT -Headers $authHeader -Body $body -ContentType "application/json"
Чтобы проверить результаты, выполните команду GET:
Invoke-RestMethod -Uri https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/managedInstances/$instanceName/?api-version=2020-11-01-preview -Method GET -Headers $authHeader | Format-List
Чтобы подготовить новую виртуальную сеть, подсеть и новый управляемый экземпляр, настроенный с помощью администратора Microsoft Entra, управляемого удостоверения, назначаемого пользователем, и проверки подлинности только для Microsoft Entra, используйте следующий шаблон.
Используйте инструкции из разделов о пользовательском развертывании на портале Azure и создании собственного шаблона с помощью редактора. Затем необходимо сохранить конфигурацию после того, как вставлен пример.
Чтобы получить идентификатор ресурса управляемого удостоверения, назначаемого пользователем, выполните поиск по запросу Управляемые удостоверения на портале Azure. Найдите свое управляемое удостоверение и перейдите в раздел Свойства. Пример вашего идентификатора ресурса UMI будет выглядеть так: /subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.1",
"parameters": {
"managedInstanceName": {
"type": "String",
"metadata": {
"description": "Enter managed instance name."
}
},
"aad_admin_name": {
"type": "String",
"metadata": {
"description": "The name of the Azure AD admin for the SQL managed instance."
}
},
"aad_admin_objectid": {
"type": "String",
"metadata": {
"description": "The Object ID of the Azure AD admin."
}
},
"aad_admin_tenantid": {
"type": "String",
"defaultValue": "[subscription().tenantId]",
"metadata": {
"description": "The Tenant ID of the Azure Active Directory"
}
},
"aad_admin_type": {
"defaultValue": "User",
"allowedValues": [
"User",
"Group",
"Application"
],
"type": "String"
},
"aad_only_auth": {
"defaultValue": true,
"type": "Bool"
},
"user_identity_resource_id": {
"defaultValue": "",
"type": "String",
"metadata": {
"description": "The Resource ID of the user-assigned managed identity, in the form of /subscriptions/<subscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managedIdentity>."
}
},
"location": {
"defaultValue": "[resourceGroup().location]",
"type": "String",
"metadata": {
"description": "Enter location. If you leave this field blank resource group location would be used."
}
},
"virtualNetworkName": {
"type": "String",
"defaultValue": "SQLMI-VNET",
"metadata": {
"description": "Enter virtual network name. If you leave this field blank name will be created by the template."
}
},
"addressPrefix": {
"defaultValue": "10.0.0.0/16",
"type": "String",
"metadata": {
"description": "Enter virtual network address prefix."
}
},
"subnetName": {
"type": "String",
"defaultValue": "ManagedInstances",
"metadata": {
"description": "Enter subnet name. If you leave this field blank name will be created by the template."
}
},
"subnetPrefix": {
"defaultValue": "10.0.0.0/24",
"type": "String",
"metadata": {
"description": "Enter subnet address prefix."
}
},
"skuName": {
"defaultValue": "GP_Gen5",
"allowedValues": [
"GP_Gen5",
"BC_Gen5"
],
"type": "String",
"metadata": {
"description": "Enter sku name."
}
},
"vCores": {
"defaultValue": 16,
"allowedValues": [
8,
16,
24,
32,
40,
64,
80
],
"type": "Int",
"metadata": {
"description": "Enter number of vCores."
}
},
"storageSizeInGB": {
"defaultValue": 256,
"minValue": 32,
"maxValue": 8192,
"type": "Int",
"metadata": {
"description": "Enter storage size."
}
},
"licenseType": {
"defaultValue": "LicenseIncluded",
"allowedValues": [
"BasePrice",
"LicenseIncluded"
],
"type": "String",
"metadata": {
"description": "Enter license type."
}
}
},
"variables": {
"networkSecurityGroupName": "[concat('SQLMI-', parameters('managedInstanceName'), '-NSG')]",
"routeTableName": "[concat('SQLMI-', parameters('managedInstanceName'), '-Route-Table')]"
},
"resources": [
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2020-06-01",
"name": "[variables('networkSecurityGroupName')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": [
{
"name": "allow_tds_inbound",
"properties": {
"description": "Allow access to data",
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "1433",
"sourceAddressPrefix": "VirtualNetwork",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 1000,
"direction": "Inbound"
}
},
{
"name": "deny_all_inbound",
"properties": {
"description": "Deny all other inbound traffic",
"protocol": "*",
"sourcePortRange": "*",
"destinationPortRange": "*",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Deny",
"priority": 4096,
"direction": "Inbound"
}
},
{
"name": "deny_all_outbound",
"properties": {
"description": "Deny all other outbound traffic",
"protocol": "*",
"sourcePortRange": "*",
"destinationPortRange": "*",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Deny",
"priority": 4096,
"direction": "Outbound"
}
}
]
}
},
{
"type": "Microsoft.Network/routeTables",
"apiVersion": "2020-06-01",
"name": "[variables('routeTableName')]",
"location": "[parameters('location')]",
"properties": {
"disableBgpRoutePropagation": false
}
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2020-06-01",
"name": "[parameters('virtualNetworkName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[variables('routeTableName')]",
"[variables('networkSecurityGroupName')]"
],
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('addressPrefix')]"
]
},
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "[parameters('subnetPrefix')]",
"routeTable": {
"id": "[resourceId('Microsoft.Network/routeTables', variables('routeTableName'))]"
},
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
},
"delegations": [
{
"name": "miDelegation",
"properties": {
"serviceName": "Microsoft.Sql/managedInstances"
}
}
]
}
}
]
}
},
{
"type": "Microsoft.Sql/managedInstances",
"apiVersion": "2020-11-01-preview",
"name": "[parameters('managedInstanceName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[parameters('virtualNetworkName')]"
],
"sku": {
"name": "[parameters('skuName')]"
},
"identity": {
"type": "UserAssigned",
"UserAssignedIdentities": {
"[parameters('user_identity_resource_id')]": {}
}
},
"properties": {
"subnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('virtualNetworkName'), parameters('subnetName'))]",
"storageSizeInGB": "[parameters('storageSizeInGB')]",
"vCores": "[parameters('vCores')]",
"licenseType": "[parameters('licenseType')]",
"PrimaryUserAssignedIdentityId": "[parameters('user_identity_resource_id')]",
"administrators": {
"login": "[parameters('aad_admin_name')]",
"sid": "[parameters('aad_admin_objectid')]",
"tenantId": "[parameters('aad_admin_tenantid')]",
"principalType": "[parameters('aad_admin_type')]",
"azureADOnlyAuthentication": "[parameters('aad_only_auth')]"
}
}
}
]
}