配置存储和数据库

已完成

通常,部署过程中有时需要连接到数据库或存储服务。 此连接有必要应用数据库架构、向数据库表添加某些参考数据或上传一些 Blob。 本单元介绍如何扩展管道以使用数据和存储服务。

从管道配置数据库

许多数据库都拥有架构,这些架构表示数据库中包含的数据的结构。 通常,最好的做法是将架构应用于部署管道中的数据库。 此做法有助于确保解决方案所需的一切都一起部署。 它还确保在应用架构时出现问题的情况下,管道会显示错误。 了解此错误让你可以修复问题并重新部署。

使用 Azure SQL 时,需要使用 SQL 脚本连接到数据库服务器并执行命令,以应用数据库架构。 这些命令是数据平面操作。 管道需要对数据库服务器进行身份验证,然后再执行脚本。 Azure Pipelines 提供可连接到 Azure SQL 数据库服务器并执行命令的 SqlAzureDacpacDeployment 任务。

其他一些数据和存储服务不需要通过使用数据平面 API 进行配置。 例如,使用 Azure Cosmos DB 时,会将数据存储在容器中。 可以直接在 Bicep 文件中使用控制平面配置容器。 同样,Azure 存储 Blob 容器的大部分内容可以在 Bicep 中进行部署和管理。 在下一个练习的示例中,你将了解如何从 Bicep 创建 Blob 容器。

添加数据

许多解决方案要求在工作之前将参考数据添加到其数据库或存储帐户。 管道是添加这些数据的好地方。 管道运行后,环境将完全配置并可供使用。

在数据库中包含示例数据也大有帮助,尤其是对于非生产环境。 示例数据有助于测试人员和使用这些环境的其他人员能够立即测试解决方案。 此类数据可能包括示例产品或虚设的用户帐户等内容。 通常不会将此类数据添加到生产环境中。

用于添加数据的方法取决于使用的服务。 例如:

  • 若要将数据添加到 Azure SQL 数据库,需要执行脚本,这与配置架构非常类似。
  • 若要将数据插入 Azure Cosmos DB,需要访问其数据平面 API,这可能需要你编写一些自定义脚本代码。
  • 若要将 Blob 上传到 Azure 存储 Blob 容器,可以使用管道脚本中的各种工具,包括 AzCopy 命令行应用程序、Azure PowerShell 或 Azure CLI。 其中的每个工具都了解如何代表你对 Azure 存储进行身份验证,以及如何连接到数据平面 API 以上传 Blob。

幂等性

部署管道和基础结构即代码的特征之一在于,应该能够反复重新部署,而不会产生任何负面影响。 例如,当重新部署以前部署的 Bicep 文件时,Azure 资源管理器会将提交的文件与 Azure 资源的现有状态进行比较。 如果没有更改,则资源管理器不会执行任何操作。 重新执行操作的能力称为“幂等性”。 最佳做法是确保脚本和其他管道步骤是幂等的。

与数据服务进行交互时,幂等性尤其重要,因为其可维护状态。 想象将一个示例用户从管道插入到数据库表中。 如果你不小心,则每次运行管道时都会创建一个新的示例用户。 你可能不会希望发生此种结果。

将架构应用于 Azure SQL 数据库时,可以使用数据包(也称为 DACPAC 文件)来部署架构。 和应用程序一样,管道会根据源代码生成 DACPAC 文件并创建管道工件。 然后,管道中的部署阶段会将 DACPAC 文件发布到数据库:

Diagram that shows a pipeline publishing and then referring to an artifact named database.

部署 DACPAC 文件时,它以幂等方式工作。 它将数据库的目标状态与包中定义的状态进行比较。 在许多情况下,这意味着无需编写遵循幂等性原则的脚本,因为工具会为你处理此类操作。 某些用于 Azure Cosmos DB 和 Azure 存储的工具也能正常工作。

但是,在 Azure SQL 数据库或其他不能以幂等方式自动工作的存储服务中创建示例数据时, 最好是编写脚本,以便仅在数据尚不存在时才创建数据。

还必须考虑是否需要回退部署,例如重新运行旧版本的部署管道。 回退对数据所做的更改可能会变得复杂,因此,如果需要回退,请仔细考虑解决方案如何运作。

网络安全性

有时可能需要对某些 Azure 资源应用网络限制。 这些限制可以强制执行有关对资源数据平面发出的请求的规则,例如:

  • 只能从指定的 IP 地址列表访问此数据库服务器。
  • 只能从在特定虚拟网络内部署的资源访问此存储帐户。

网络限制在数据库中很常见,因为似乎 Internet 上的任何内容都不需要连接到数据库服务器。

但是,网络限制也会使部署管道难以处理资源的数据平面。 使用 Microsoft 托管的管道代理时,IP 地址不易事先知道,它可能分配自一个大的 IP 地址池。 此外,不能将 Microsoft 托管的管道代理连接到自己的虚拟网络。

某些有助于执行数据平面操作的 Azure Pipelines 任务可以解决这些问题。 例如,SqlAzureDacpacDeployment 任务:

Diagram that shows the firewall update process.

当使用 SqlAzureDacpacDeployment 任务处理 Azure SQL 逻辑服务器或数据库时,它将使用管道的服务主体来连接到 Azure SQL 逻辑服务器的控制平面。 它会更新防火墙以允许管道代理从其 IP 地址访问服务器。 然后,它可以成功提交 DACPAC 文件或脚本以便执行。 完成后,该任务会自动删除防火墙规则。

在其他情况下,不可能创建这些类型的异常。 在这些情况下,请考虑使用自托管管道代理,该代理在你控制的虚拟机或其他计算资源上运行。 然后,可以根据需要配置此代理。 它可以使用已知的 IP 地址,也可以连接到你自己的虚拟网络。 此模块中不会介绍自托管代理,但本模块结尾的“总结”页面上提供了有关更多信息的链接。

部署管道

在下一练习中,你将更新部署管道,以添加新的作业来构建网站的数据库组件、部署数据库并添加种子数据:

Diagram showing the revised pipeline. Including, a new database build step, a database deployment step, and data seeding steps in the test environment.