有关使用 Azure 资源管理器模板部署 Web 应用的指南

本文提供创建 Azure 资源管理器模板以部署 Azure 应用服务解决方案的建议。 这些建议可帮助你避免常见问题。

定义依赖关系

为 Web 应用定义依赖项需要了解 Web 应用中的资源如何进行交互。 如果以错误的顺序指定依赖项,则可能会导致部署错误或者创建造成停止部署的争用条件。

Warning

如果在模板中包括了 MSDeploy 站点扩展,则必须将任何配置资源设置为依赖于 MSDeploy 资源。 配置更改会导致站点以异步方式重启。 通过使配置资源依赖于 MSDeploy,可确保 MSDeploy 在站点重启前完成。 如果没有这些依赖关系,则站点可能会在 MSDeploy 的部署过程中重启。 有关示例模板,请参阅具有 Web 部署依赖项的 WordPress 模板

下图显示了各种应用服务资源的依赖顺序:

Web 应用依赖关系

按以下顺序部署资源:

第 1 层

  • 应用服务计划。
  • 任何其他相关资源,例如数据库或存储帐户。

第 2 层

  • Web 应用 - 依赖于应用服务计划。

第 3 层

  • 源代码管理 - 依赖于 Web 应用。
  • MSDeploy 站点扩展 - 依赖于 Web 应用。

第 4 层

  • 应用服务证书 - 依赖于存在的源代码管理或 MSDeploy; 若都不存在,则依赖于 Web 应用。
  • 配置设置(连接字符串、web.config 值、应用设置)- 依赖于存在的源代码管理或 MSDeploy; 若都不存在,则依赖于 Web 应用。

第 5 层

  • 主机名绑定 - 依赖于如果存在的证书; 若不存在,则依赖于较高级别的资源。
  • 站点扩展 - 依赖于存在的配置设置; 若不存在,则依赖于较高级别的资源。

通常,解决方案仅包括上述某些资源和层。 对于缺少的层,请将较低的资源映射到下一个较高的层。

以下示例显示了模板的一部分。 连接字符串配置值依赖于 MSDeploy 扩展。 MSDeploy 扩展依赖于 Web 应用和数据库。

{
    "name": "[parameters('appName')]",
    "type": "Microsoft.Web/Sites",
    ...
    "resources": [
      {
          "name": "MSDeploy",
          "type": "Extensions",
          "dependsOn": [
            "[concat('Microsoft.Web/Sites/', parameters('appName'))]",
            "[concat('Microsoft.Sql/servers/', parameters('dbServerName'), '/databases/', parameters('dbName'))]",
          ],
          ...
      },
      {
          "name": "connectionstrings",
          "type": "config",
          "dependsOn": [
            "[concat('Microsoft.Web/Sites/', parameters('appName'), '/Extensions/MSDeploy')]"
          ],
          ...
      }
    ]
}

有关使用上述代码的现成示例,请参阅模板:构建简单的 Umbraco Web 应用

查找有关 MSDeploy 错误的信息

如果你的资源管理器模板使用了 MSDeploy,则部署错误消息可能难以理解。 若要在部署失败后获取更多信息,请尝试以下步骤:

  1. 转到站点的 Kudu 控制台
  2. 浏览到 D:\home\LogFiles\SiteExtensions\MSDeploy 上的文件夹。
  3. 查找 appManagerStatus.xml 和 appManagerLog.xml 文件。 第一个文件记录了状态。 第二个文件记录了有关错误的信息。 如果不明白该错误,可将它发布到论坛上来寻求帮助。

选择唯一的 Web 应用名称

Web 应用的名称必须全局唯一。 可以使用某个可能唯一的命名约定,也可以使用 uniqueString 函数来帮助生成唯一名称。

{
  "apiVersion": "2016-08-01",
  "name": "[concat(parameters('siteNamePrefix'), uniqueString(resourceGroup().id))]",
  "type": "Microsoft.Web/sites",
  ...
}

部署来自 Key Vault 的 Web 应用证书

Note

本文进行了更新,以便使用新的 Azure PowerShell Az 模块。 若要详细了解新的 Az 模块和 AzureRM 兼容性,请参阅新 Azure Powershell Az 模块简介。 有关安装说明,请参阅安装 Azure PowerShell

在 Azure 中,应用服务服务主体所拥有的 ID 为 abfa0a7c-a6b6-4736-8310-5855508787cd。 若要为应用服务服务主体授予对 Key Vault 的访问权限,请使用:

Set-AzKeyVaultAccessPolicy `
  -VaultName KEY_VAULT_NAME `
  -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd `
  -PermissionsToSecrets get `
  -PermissionsToCertificates get

在 Key Vault 中,选择“证书”和“生成/导入”以上传证书。

导入证书

在模板中,向 keyVaultSecretName 提供证书名称。

有关示例模板,请参阅 Deploy a Web App certificate from Key Vault secret and use it for creating SSL binding(部署来自 Key Vault 机密的 Web 应用证书并将其用于创建 SSL 绑定)。

后续步骤