用过Azure的同学都知道如何将虚拟机加入虚拟网络,也非常简单,但是对于将应用(WebSite)集成到虚拟网络中却很少听到。今天我要讲的就是如何直接将我们部署在WebSite中的应用加入到虚拟网络。
1、先决条件:
- 安装 Azure Powershell(download)
Azure 订阅账号(Azure Portal)
- 在标准或高级 SKU 中运行的 Azure App Service 中的应用
2、创建虚拟网络
因为将WebSite加入到虚拟网络中是Point to Site,所以我们创建虚拟网络时需要启用点到站点连接,当然也可以创建完成再启用。
输入虚拟网络名称并选择网络位置
添加网关子网
创建网关,这一步骤时间有点长(大概20分钟)
3、创建WebSite
因为我们创建的WebSite SKU默认为“免费”,而能和虚拟网络进行集成的WebSite SKU需要是标准或高级,所以我们需要手动缩放下。
3、将应用连接到虚拟网络
使用Powershell命令登录Azure账号和订阅
Login-AzureRmAccount -EnvironmentName AzureChinaCloud
选中WebSite所在订阅
Select-AzureRmSubscription -SubscriptionName [WebAppSubscriptionName]
或者
Select-AzureRmSubscription -SubscriptionId [WebAppSubscriptionId]
- 使用Powershell设置WebSite连接到虚拟网络的配置信息
$Configuration = @{}
$Configuration.WebAppResourceGroup = "[Your web app resource group]"
$Configuration.WebAppName = "[Your web app name]"
$Configuration.VnetSubscriptionId = "[Your vnet subscription id]"
$Configuration.VnetResourceGroup = "[Your vnet resource group]"
$Configuration.VnetName = "[Your vnet name]"
#国内Azure有两个数据中心:chinaeast、chiannorth
$Configuration.WebAppLocation = "[Your web app Location]"
$Configuration.GeneratedCertificatePath = "C:\Users\Crazy\Desktop\Certificate.cer"
查看刚才设置的配置
- 向应用中申明虚拟网络
$vnet = New-AzureRmResource -Name "$($Configuration.WebAppName)/$($Configuration.VnetName)" -ResourceGroupName $Configuration.WebAppResourceGroup -ResourceType "Microsoft.Web/sites/virtualNetworkConnections" -PropertyObject @{"VnetResourceId" = "/subscriptions/$($Configuration.VnetSubscriptionId)/resourceGroups/$($Configuration.VnetResourceGroup)/providers/Microsoft.ClassicNetwork/virtualNetworks/$($Configuration.VnetName)"} -Location $Configuration.WebAppLocation -ApiVersion 2015-07-01
如果此命令成功,$vnet 中应该包含 Properties 变量。Properties 变量应该包含证书指纹和证书数据。
- 将证书下载到本地
$certBytes = [System.Convert]::FromBase64String($vnet.Properties.certBlob)
[System.IO.File]::WriteAllBytes("$($Configuration.GeneratedCertificatePath)", $certBytes)
将下载的证书上载到虚拟网络
- 获取点到站点包,并将其提供给WebSite应用
将以下模板保存到计算机上某个位置中的名为 GetNetworkPackageUri.json 的文件
{
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"certData": {
"type": "string"
},
"certThumbprint": {
"type": "string"
},
"networkName": {
"type": "string"
}
},
"variables": {
"legacyVnetName": "[concat('Group ', resourceGroup().name, ' ', parameters('networkName'))]"
},
"resources": [
],
"outputs" : {
"PackageUri" :
{
"value" : "[listPackage(resourceId('Microsoft.ClassicNetwork/virtualNetworks/gateways/clientRootCertificates', parameters('networkName'), 'primary', parameters('certThumbprint')), '2014-06-01').packageUri]", "type" : "string"
}
}
}
设置输入参数:
$parameters = @{"certData" = $vnet.Properties.certBlob ;
certThumbprint = $vnet.Properties.certThumbprint ;
"networkName" = $Configuration.VnetName }
- 调用ARM模板
$output = New-AzureRmResourceGroupDeployment -Name unused -ResourceGroupName $Configuration.VnetResourceGroup -TemplateParameterObject $parameters -TemplateFile C:\PATH\TO\GetNetworkPackageUri.json
变量 $output.Outputs.packageUri 现在包含要提供给 Web 应用的包 URI。
- 将点到站点包上载到应用
$vnet = New-AzureRmResource -Name "$($Configuration.WebAppName)/$($Configuration.VnetName)/primary" -ResourceGroupName $Configuration.WebAppResourceGroup -ResourceType "Microsoft.Web/sites/virtualNetworkConnections/gateways" -ApiVersion 2015-07-01 -PropertyObject @{"VnetName" = $Configuration.VnetName ; "VpnPackageUri" = $($output.Outputs.packageUri).Value } -Location $Configuration.WebAppLocation
此命令成功之后,应用现在应会连接到虚拟网络
4、确认应用是否连接到虚拟网络
下载WebSite发布配置文件
登录到应用Kudu管理平台,打开浏览器输入下图选中的Url并登录。
进入命令行界面
输入以下命令
SET WEBSITE_
我们可以看到WEBSITE_VNETNAME 的环境变量值就是连接的虚拟网络。