Применить пользовательский домен к управлению API Azure

Эта статья была опубликована более года назад. Информация может быть устаревшей.
Azure API Management - это быстрый способ создания согласованного современного API-шлюза для существующих внутренних служб [^1]. В этой статье описывается, как применить пользовательский домен к API Management . Кроме того, мы объясним, как включить SSL с вашим собственным сертификатом. Все ресурсы развертываются с помощью ARM Template [^3] или Azure CLI , чтобы вы могли создавать конвейеры CI / CD из них.
1. Разверните хранилище ключей
Сначала разверните Key Vault для хранения сертификатов.
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "keyVaultName": {6 "type": "string",7 "metadata": {8 "description": "Key Vault Name"9 }10 },11 "apiMgmtName": {12 "type": "string",13 "metadata": {14 "description": "API Management Name"15 }16 },17 "commanderObjectId": {18 "type": "securestring",19 "metadata": {20 "description": "Object id of azure cli command executor."21 }22 }23 },24 "variables": {},25 "resources": [26 {27 "name": "[parameters('apiMgmtName')]",28 "type": "Microsoft.ApiManagement/service",29 "apiVersion": "2019-01-01",30 "properties": {31 "notificationSenderEmail": "apimgmt-noreply@mail.windowsazure.com",32 "hostnameConfigurations": [],33 "publisherEmail": "ch241.sample@example.com",34 "publisherName": "mark241"35 },36 "sku": {37 "name": "Developer"38 },39 "identity": {40 "type": "SystemAssigned"41 },42 "location": "[resourceGroup().location]"43 },44 {45 "name": "[parameters('keyVaultName')]",46 "type": "Microsoft.KeyVault/vaults",47 "apiVersion": "2018-02-14",48 "location": "[resourceGroup().location]",49 "dependsOn": [50 "[resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName'))]"51 ],52 "properties": {53 "tenantId": "[subscription().tenantId]",54 "sku": {55 "family": "A",56 "name": "standard"57 },58 "accessPolicies": [59 {60 "tenantId": "[subscription().tenantId]",61 "objectId": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName')), '2019-01-01', 'Full').identity.principalId]",62 "permissions": {63 "keys": [],64 "secrets": ["get"],65 "certificates": ["get"],66 "storage": []67 }68 },69 {70 "tenantId": "[subscription().tenantId]",71 "objectId": "[parameters('commanderObjectId')]",72 "permissions": {73 "keys": [],74 "secrets": [],75 "certificates": ["import"],76 "storage": []77 }78 }79 ],80 "enabledForDeployment": false,81 "enabledForDiskEncryption": false,82 "enabledForTemplateDeployment": false83 },84 "resources": []85 }86 ]87}Приведенный выше шаблон содержит ресурсы Key Vault и API Management .
Во-первых, давайте посмотрим на API Management .
1{2 "name": "[parameters('apiMgmtName')]",3 "type": "Microsoft.ApiManagement/service",4 "apiVersion": "2019-01-01",5 "properties": {6 "notificationSenderEmail": "apimgmt-noreply@mail.windowsazure.com",7 "hostnameConfigurations": [],8 "publisherEmail": "ch241.sample@example.com",9 "publisherName": "mark241"10 },11 "sku": {12 "name": "Developer"13 },14 "identity": {15 "type": "SystemAssigned"16 },17 "location": "[resourceGroup().location]"18}Вот краткое объяснение того, почему мы сначала создали API Management .
В развертывании Key Vault описанном ниже, вы предоставляете API Management доступ для чтения в Key Vault .
Это для API Management чтобы получить сертификат, хранящийся в Key Vault .
API Management и его Managed Id должны существовать, прежде чем эта авторизация может быть предоставлена.
Для получения дополнительной информации о Managed Id , пожалуйста, обратитесь к официальному документу [^4].
Это идентификатор для идентификации API Management , и управление полномочиями выполняется с использованием этого идентификатора.
1"identity": {2 "type": "SystemAssigned"3 }В приведенной выше части шаблона был создан Managed Id для API Management .
Смотрите официальную документацию [^2] для других деталей.
Далее давайте посмотрим на ресурсы Key Vault .
1{2 "name": "[parameters('keyVaultName')]",3 "type": "Microsoft.KeyVault/vaults",4 "apiVersion": "2018-02-14",5 "location": "[resourceGroup().location]",6 "dependsOn": [7 "[resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName'))]"8 ],9 "properties": {10 "tenantId": "[subscription().tenantId]",11 "sku": {12 "family": "A",13 "name": "standard"14 },15 "accessPolicies": [16 {17 "tenantId": "[subscription().tenantId]",18 "objectId": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName')), '2019-01-01', 'Full').identity.principalId]",19 "permissions": {20 "keys": [],21 "secrets": ["get"],22 "certificates": ["get"],23 "storage": []24 }25 },26 {27 "tenantId": "[subscription().tenantId]",28 "objectId": "[parameters('commanderObjectId')]",29 "permissions": {30 "keys": [],31 "secrets": [],32 "certificates": ["import"],33 "storage": []34 }35 }36 ],37 "enabledForDeployment": false,38 "enabledForDiskEncryption": false,39 "enabledForTemplateDeployment": false40 },41 "resources": []42}Ключевым моментом ресурсов Key Vault является управление правами доступа с помощью accessPolicy .
Вы увидите две цели, перечисленные в accessPolicy .
1{2 "tenantId": "[subscription().tenantId]",3 "objectId": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName')), '2019-01-01', 'Full').identity.principalId]",4 "permissions": {5 "keys": [],6 "secrets": ["get"],7 "certificates": ["get"],8 "storage": []9 }10}Во-первых, предоставить API management получить разрешение на получение сертификата.
1"objectId": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiMgmtName')), '2019-01-01', 'Full').identity.principalId]"В приведенном выше описании укажите Managed Id управления API Management и предоставьте полномочия.
Грант get до secrets и certificates .
1"permissions": {2 "keys": [],3 "secrets": ["get"],4 "certificates": ["get"],5 "storage": []6 }Второе - это разрешение на импорт сертификата в Key Vault .
1{2 "tenantId": "[subscription().tenantId]",3 "objectId": "[parameters('commanderObjectId')]",4 "permissions": {5 "keys": [],6 "secrets": [],7 "certificates": ["import"],8 "storage": []9 }10}В этой статье мы будем использовать Azure CLI для импорта сертификата в Key Vault . Поэтому необходимо предоставить разрешение на импорт исполнителю Azure CLI service principal или пользователю).
Укажите целевой субъект service principal или object ID пользователя в commanderObjectId и предоставьте полномочия на import certificates .
2. Импортируйте сертификат в Key Vault
Затем импортируйте сертификат в Key Vault .
Здесь давайте использовать команды Azure CLI .
1az keyvault certificate import --file $certFile --name $secretName --vault-name $keyVaultName --password $certPass--file: путь к файлу сертификата. Формат.pfx.--name: имя секретного ресурса хранилища ключей для хранения сертификата.--vault-name: имя хранилища ключей, в котором хранится сертификат.--password: пароль сертификата
Здесь, если вы укажете Key Vault вы создали ранее, сертификат будет импортирован.
Выполните указанную выше команду с полномочиями исполнителя, предоставившего полномочия на импорт.
3. Разверните пользовательский домен для API Management
Наконец, повторно API Management .
1{2 "$schema": "https://schema.management.azure.com/schemas/2018-05-01/deploymentTemplate.json#",3 "contentVersion": "1.0.0.0",4 "parameters": {5 "apiMgmtName": {6 "type": "string",7 "metadata": {8 "description": "Service name of API Management"9 }10 },11 "hostName": {12 "type": "string",13 "metadata": {14 "description": "Host name of API Management"15 }16 },17 "keyVaultName": {18 "type": "string",19 "metadata": {20 "description": "Key Vault name"21 }22 },23 "secretName": {24 "type": "string",25 "metadata": {26 "description": "Secret name"27 }28 }29 },30 "variables": {31 "keyVaultResourceId": "[resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), parameters('secretName'))]"32 },33 "resources": [34 {35 "name": "[parameters('apiMgmtName')]",36 "type": "Microsoft.ApiManagement/service",37 "apiVersion": "2019-01-01",38 "properties": {39 "notificationSenderEmail": "apimgmt-noreply@mail.windowsazure.com",40 "hostnameConfigurations": [41 {42 "type": "Proxy",43 "hostName": "[parameters('hostName')]",44 "keyVaultId": "[reference(variables('keyVaultResourceId'), '2018-02-14').secretUriWithVersion]"45 }46 ],47 "publisherEmail": "ch241.sample@example.com",48 "publisherName": "mark241"49 },50 "sku": {51 "name": "Developer"52 },53 "identity": {54 "type": "SystemAssigned"55 },56 "location": "[resourceGroup().location]"57 }58 ]59}Это похоже на то, что мы развернули ранее, за исключением части hostnameConfigurations .
Это был пустой массив, потому что мы не применяли пользовательский домен ранее, но на этот раз он содержит настройки пользовательского домена.
type: тип службы для применения настраиваемого домена. Существует четыре типа:Proxy,Portal,ScmиManagement.hostName: полное доменное имяkeyVaultId:keyVaultIdKey Vaultиз которогоAPI Managementполучает сертификат
Укажем Proxy для типа. Этот тип применяется при применении пользовательского домена к API {api management name}.azure-api.net ( {api management name}.azure-api.net ).
keyVaultId может быть получен свойством secretUtiWithVersion как описано выше.
Общий сценарий
Наконец, вот скрипт, который развертывает все вышеупомянутые шаблоны. Пожалуйста, измените их в соответствии с вашей средой CI / CD.
1Param(2 [parameter(mandatory = $true)][String]$resourceGroup,3 [parameter(mandatory = $true)][String]$keyVaultName,4 [parameter(mandatory = $true)][String]$apiMgmtName,5 [parameter(mandatory = $true)][String]$objectId,6 [parameter(mandatory = $true)][String]$certFile,7 [parameter(mandatory = $true)][String]$certPass,8 [parameter(mandatory = $true)][String]$secretName,9 [parameter(mandatory = $true)][String]$hostName10)11 12# 1. Deploy Key Vault13try{14 az group deployment create --resource-group $resourceGroup --template-file ./keyvault.json --parameters keyVaultName=$keyVaultName apiMgmtName=$apiMgmtName commanderObjectId=$objectId15}16catch {17 $message = $_.Exception.message18 Write-Error "Failed to deploy key vault: ${message}"19}20 21# 2. Import a certificate22try{23 az keyvault certificate import --file $certFile --name $secretName --vault-name $keyVaultName --password $certPass24}25catch {26 $message = $_.Exception.message27 Write-Error "Failed to import certificate: ${message}"28}29 30# 3. Deploy API Management31try {32 az group deployment create --resource-group $resourceGroup --template-file ./apimgmt.json --parameters apiMgmtName=$apiMgmtName hostName=$hostName keyVaultName=$keyVaultName secretName=$secretName33}34catch {35 $message = $_.Exception.message36 Write-Error "Failed to deploy api management: ${message}"37}Резюме
В этой статье описывается, как применить пользовательский домен API Management с помощью ARM Template .
- Развернуть
Key Vault - Импорт сертификатов в
Key Vault - Применить пользовательский домен к
API Management
Мы успешно применили пользовательский домен, используя шаги, описанные выше.
[^1]: API Management documentation [^2]: Microsoft. ApiManagement service template reference [^3]: Azure Resource Manager documentation [^4]: Azure AD-managed identities for Azure resources documentation




