使用 Azure 资源管理器模板创建 ASE

概述

重要

本文介绍用于独立应用服务计划的应用服务环境 v2。 应用服务环境 v2 将于 2024 年 8 月 31 日停用。 应用服务环境有新版本,此版本更易于使用并在更强大的基础结构上运行。 若要详细了解该新版本,请先参阅应用服务环境简介。 如果你当前正在使用应用服务环境 v2,请按照本文中的步骤迁移到新版本。

从 2024 年 1 月 29 日起,无法再使用任何可用方法(包括 ARM/Bicep 模板、Azure 门户、Azure CLI 或 REST API)创建新的应用服务环境 v2 资源。 必须在 2024 年 8 月 31 日之前迁移到应用服务环境 v3,以防止资源删除和数据丢失。

可通过能访问 Internet 的终结点或 Azure 虚拟网络内部地址上的终结点创建 Azure 应用服务环境 (ASE)。 使用内部终结点创建时,该终结点由被称为内部负载均衡器 (ILB) 的 Azure 组件提供。 内部 IP 地址上的 ASE 被称为 ILB ASE。 具有公共终结点的 ASE 被称为外部 ASE。

可使用 Azure 门户或 Azure 资源管理器模板创建 ASE。 本文介绍使用资源管理器模板创建外部 ESE 或 ILB ASE 所需的步骤和语法。 若要了解如何在 Azure 门户中创建 ASEv2,请参阅创建外部 ASE创建 ILB ASE

在 Azure 门户中创建 ASE 时,可同时创建自己的虚拟网络,或者选择要部署到的预先存在的虚拟网络。

基于模板创建 ASE 时,必须首先具有:

  • 一个 Azure 虚拟网络。
  • 该虚拟网络中的子网。 建议使用带 256 个地址的大小为 /24 的 ASE 子网,以适应将来的增长和缩放需求。 创建 ASE 后,就无法更改其大小。
  • 要部署到的订阅。
  • 要部署到的位置。

若要自动创建 ASE,请遵循以下部分中的指导原则。 如果要创建具有自定义 dnsSuffix 的 ILB ASEv2(例如 internal.contoso.com),还要执行一些额外操作。

  1. 创建具有自定义 dnsSuffix 的 ILB ASE 后,应上传与 ILB ASE 域匹配的 TLS/SSL 证书。

  2. 上传的 TLS/SSL 证书将分配到 ILB ASE 作为其“默认”TLS/SSL 证书。 当应用使用分配给 ASE 的一般根域(如 https://someapp.internal.contoso.com)时,此证书用于 ILB ASE 上流向应用的 TLS/SSL 流量。

创建 ASE

有关用于创建 ASE 的资源管理器模板及其关联的参数文件,可参阅 GitHub 上的 ASEv2

如果要创建 ASE,请使用此资源管理器模板 ASEv2 示例。 azuredeploy.parameters.json 文件中的大部分参数常用于创建 ILB ASE 和外部 ASE。 使用现有子网创建创建 ILB ASE 时,以下列表会调出特殊注释的参数或唯一的参数。

参数

  • aseName:此参数定义唯一 ASE 名称。
  • location:此参数定义应用服务环境的位置。
  • existingVirtualNetworkName:此参数定义 ASE 将在其中驻留的现有虚拟网络和子网的虚拟网络名称。
  • existingVirtualNetworkResourceGroup:此参数定义 ASE 将在其中驻留的现有虚拟网络和子网的资源组名称。
  • subnetName:此参数定义 ASE 将在其中驻留的现有虚拟网络和子网的子网名称。
  • internalLoadBalancingMode:此属性多数情况下设置为 3,这表示端口 80/443 上的 HTTP/HTTPS 流量以及 ASE 上的 FTP 服务所侦听的控制/数据通道端口将绑定到 ILB 分配的虚拟网络内部地址。 如果此属性设置为 2,则仅将与 FTP 服务相关的端口(包括控制和数据信道)绑定至 ILB 地址。 如果将此属性设置为 0,则 HTTP/HTTPS 流量将保留在公共 VIP 上。
  • dnsSuffix:此参数定义要分配给 ASE 的默认根域。 在 Azure 应用服务的公共变体中,所有 Web 应用的默认根域均为 chinacloudsites.cn。 由于 ILB ASE 位于客户虚拟网络的内部,因此不适合使用公共服务的默认根域。 而应当具有适合在公司的内部虚拟网络中使用的默认根域。 例如,对于只能在 Contoso 虚拟网络内解析和访问的应用,Contoso Corporation 可能会使用默认根域 internal.contoso.com。 若要指定自定义根域,需要使用 API 版本 2018-11-01 或更早版本。
  • ipSslAddressCount:在“azuredeploy.json”文件中,此参数的值自动默认为 0,因为 ILB ASE 只有一个 ILB 地址。 ILB ASE 没有显式 IP-SSL 地址。 因此,ILB ASE 的 IP-SSL 地址池应设置为零。 否则将出现预配错误。

在填充 azuredeploy.parameters.json 文件后,使用 PowerShell 代码片段来创建 ASE。 更改文件路径,以匹配资源管理器模板文件在计算机上的位置。 切记提供自己的资源管理器部署名称值和资源组名称值:

$templatePath="PATH\azuredeploy.json"
$parameterPath="PATH\azuredeploy.parameters.json"

New-AzResourceGroupDeployment -Name "CHANGEME" -ResourceGroupName "YOUR-RG-NAME-HERE" -TemplateFile $templatePath -TemplateParameterFile $parameterPath

创建 ASE 可能需要约两小时。 然后,对于触发部署的订阅,ASE 将显示在门户的 ASE 列表中。

上传和配置“默认”TLS/SSL 证书

TLS/SSL 证书必须与 ASE 关联,作为用于建立应用的 TLS/SSL 连接的“默认”TLS/SSL 证书。 如果 ASE 的默认 DNS 后缀是 internal.contoso.com,则需要对 *.internal.contoso.com 有效的 TLS/SSL 证书才可连接到 https://some-random-app.internal.contoso.com

可通过三种方式获取有效的 TLS/SSL 证书:使用内部证书颁发机构、向外部颁发者购买证书或使用自签名证书。 无论 TLS/SSL 证书的来源如何,都需要正确配置以下证书属性:

  • 使用者:此属性必须设置为 *“your-root-domain-here.com”。
  • 使用者可选名称:此属性必须同时包含 *“your-root-domain-here.com” 和 *“scm.your-root-domain-here.com” 。 以 TLS 方式连接到与每个应用关联的 SCM/Kudu 站点时,使用 your-app-name.scm.your-root-domain-here.com 形式的地址。

备妥有效的 TLS/SSL 证书以后,还需要两个额外的准备步骤。 将 TLS/SSL 证书转换/另存为 .pfx 文件。 请记住,.pfx 文件必须包括所有的中间和根证书。 使用密码进行保护。

需要将 .pfx 文件转换为 base64 字符串,因为将使用资源管理器模板上传 TLS/SSL 证书。 由于资源管理器模板是文本文件,因此必须将 .pfx 文件转换为 base64 字符串。 如此才可将其作为模板的参数包含在内。

通过下列 PowerShell 代码片段:

  • 生成自签名证书。
  • 将证书导出为.pfx 文件。
  • 将 .pfx 文件转换为 base64 编码的字符串。
  • 将 base64 编码的字符串保存到单独的文件。

base64 编码的 PowerShell 代码改写自 PowerShell 脚本博客

$certificate = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname "*.internal.contoso.com","*.scm.internal.contoso.com"

$certThumbprint = "cert:\localMachine\my\" + $certificate.Thumbprint
$password = ConvertTo-SecureString -String "CHANGETHISPASSWORD" -Force -AsPlainText

$fileName = "exportedcert.pfx"
Export-PfxCertificate -cert $certThumbprint -FilePath $fileName -Password $password     

$fileContentBytes = get-content -encoding byte $fileName
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$fileContentEncoded | set-content ($fileName + ".b64")

成功生成 TLS/SSL 证书并将其转换为 base64 编码字符串后,使用 GitHub 上的示例资源管理器模板配置默认 SSL 证书

azuredeploy.parameters.json 文件中的参数如下所列:

  • appServiceEnvironmentName:要配置的 ILB ASE 的名称。
  • existingAseLocation:包含 ILB ASE 部署所在的 Azure 区域的文本字符串。 例如“中国北部 2”。
  • pfxBlobString:.pfx 文件的 based64 编码字符串表示形式。 使用先前所示的代码片段并复制“exportedcert.pfx.b64”中包含的字符串。 将其作为 pfxBlobString 属性的值进行粘贴。
  • password:用于保护 .pfx 文件的密码。
  • certificateThumbprint:证书的指纹。 如果从 Powershell 中检索到此值(例如先前代码片段中的 $certificate.Thumbprint),可按原样使用此值。 如果从 Windows 证书对话框复制此值,请记得去除多余的空格。 certificateThumbprint 应如下所示:AF3143EB61D43F6727842115BB7F17BBCECAECAE。
  • certificateName:用户自己选择的易记字符串标识符,用于标识证书。 此名称用作 Microsoft.Web/certificates 实体(表示 TLS/SSL 证书)的资源管理器唯一标识符的一部分。 名称必须以下述后缀结尾:_yourASENameHere_InternalLoadBalancingASE。 此后缀由 Azure 门户使用,表示证书用于维护启用 ILB 的 ASE 的安全。

azuredeploy.parameters.json 的缩写示例如下所示:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "appServiceEnvironmentName": {
      "value": "yourASENameHere"
    },
    "existingAseLocation": {
      "value": "China North 2"
    },
    "pfxBlobString": {
      "value": "MIIKcAIBAz...snip...snip...pkCAgfQ"
    },
    "password": {
      "value": "PASSWORDGOESHERE"
    },
    "certificateThumbprint": {
      "value": "AF3143EB61D43F6727842115BB7F17BBCECAECAE"
    },
    "certificateName": {
      "value": "DefaultCertificateFor_yourASENameHere_InternalLoadBalancingASE"
    }
  }
}

在填充 azuredeploy.parameters.json 文件后,使用 PowerShell 代码片段来配置默认 TLS/SSL 证书。 更改文件路径,以匹配资源管理器模板文件在计算机上的位置。 切记提供自己的资源管理器部署名称值和资源组名称值:

$templatePath="PATH\azuredeploy.json"
$parameterPath="PATH\azuredeploy.parameters.json"

New-AzResourceGroupDeployment -Name "CHANGEME" -ResourceGroupName "YOUR-RG-NAME-HERE" -TemplateFile $templatePath -TemplateParameterFile $parameterPath

每个 ASE 前端约耗时 40 分钟才能应用此更改。 例如,有一个默认大小的 ASE 使用两个前端,则模板需要大约 1 小时 20 分钟才能完成。 运行模板时无法缩放 ASE。

模板运行完成后,即可通过 HTTPS 访问 ILB ASE 上的应用。 使用默认 TLS/SSL 证书来保护连接安全。 如果 ILB ASE 上的应用使用应用程序名称与默认主机名的组合来寻址,则会使用默认 TLS/SSL 证书。 例如,https://mycustomapp.internal.contoso.com 使用 *.internal.contoso.com 的默认 TLS/SSL 证书。

但是,就像公共多租户服务上运行的应用一样,开发者可为单个应用配置自定义主机名。 还可为单个应用配置唯一的 SNI TLS/SSL 证书绑定。