名称生成模式

在 Bicep 文件中,使用字符串内插和 Bicep 函数为部署到的每个环境创建唯一、确定性、有意义且不同的资源名称。

上下文和问题

在 Azure 中,为资源提供的名称非常重要。 名称可帮助你和团队识别资源。 对于许多服务,资源名称构成了用于访问资源的 DNS 名称的一部分。 创建资源后,无法轻易更改名称。

计划资源的名称时,需要确保:

  • 唯一:Azure 资源名称需要唯一,但唯一性的范围取决于资源。
  • 确定性:无需重新创建现有资源即可重复部署 Bicep 文件,这一点很重要。 使用相同参数重新部署 Bicep 文件时,资源应保留相同的名称。
  • 有意义:名称会为你和团队提供有关资源用途的重要信息。 如果可能,请使用提供资源用途指示的名称。
  • 每个环境都不同:在推出过程中,通常部署到多个环境,例如测试、过渡和生产。
  • 对特定资源有效:每个 Azure 资源都有一组在创建有效资源名称时必须遵循的准则。其中包括最大长度、允许的字符,以及资源名称是否必须以字母开头。

备注

你的组织可能还有自己的命名约定,你需要遵循该约定。 Azure 云采用框架提供了有关如何为组织创建命名策略的指南。 如果你有需要严格遵循的命名约定,并且它生成的名称具有独特性且唯一,则无需遵循本模式。

解决方案

使用 Bicep 的字符串内插生成作为变量的资源名称。 如果资源需要全局唯一名称,请使用 uniqueString() 函数生成资源名称部分。 追加有意义的信息,以确保资源可以轻松识别。

备注

某些 Azure 资源(例如 Azure RBAC 角色定义和角色分配)需要具有全局唯一标识符 (GUID) 作为其名称。 使用 guid () 函数生成这些资源的名称。

如果要创建可重用的 Bicep 代码,应考虑将名称定义为参数。 使用默认参数值定义可以替代的默认名称。 默认值有助于使 Bicep 文件更具可重用性,确保文件的用户在需要遵循其他命名约定时可以定义自己的名称。

示例 1:组织命名约定

以下示例生成应用服务应用和计划的名称。 它遵循以下组织约定:包含一个资源类型代码(appplan)、应用程序或工作负载名称 (contoso)、环境名称(由参数指定)以及一个字符串(通过使用 uniqueString() 函数和资源组 ID 的种子值确保唯一性)。

尽管应用服务计划不需要全局唯一的名称,但计划名称是使用相同的格式构造的,以确保符合组织策略。

param location string = resourceGroup().location
param environmentName string
param appServiceAppName string = 'app-contoso-${environmentName}-${uniqueString(resourceGroup().id)}'
param appServicePlanName string = 'plan-contoso-${environmentName}-${uniqueString(resourceGroup().id)}'

resource appServiceApp 'Microsoft.Web/sites@2018-11-01' = {
  name: appServiceAppName
  // ...
}

resource appServicePlan 'Microsoft.Web/serverfarms@2020-12-01' = {
  name: appServicePlanName
  // ...
}

示例 2

以下示例为其他组织的两个存储帐户生成名称,但没有命名约定。 此示例再次将 uniqueString() 函数与资源组的 ID 一起使用。 在生成的名称前会添加一个短字符串,以确保这两个存储帐户都有不同的名称。 这还有助于确保名称以字母开头,这是存储帐户的要求。

param primaryStorageAccountName string = 'contosopri${uniqueString(resourceGroup().id)}'
param secondaryStorageAccountName string = 'contososec${uniqueString(resourceGroup().id)}'

resource primaryStorageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: primaryStorageAccountName
  // ...
}

resource secondaryStorageAccount 'Microsoft.Storage/storageAccounts@2021-02-01' = {
  name: secondaryStorageAccountName
  // ...
}

注意事项

  • 确保验证资源名称的唯一性的范围。 对 uniqueString() 函数使用适当的种子值,以确保可以在 Azure 资源组和订阅中重复使用 Bicep 文件。

    提示

    在大多数情况下,完全限定的资源组 ID 是 uniqueString 函数的种子值的良好选项:

    var uniqueNameComponent = uniqueString(resourceGroup().id)
    

    资源组的名称 (resourceGroup().name) 可能不够唯一,因此无法跨订阅重复使用该文件。

  • 避免在部署资源后更改 uniqueString() 函数的种子值。 更改种子值会生成新名称,并可能会影响生产资源。

后续步骤

了解共享变量文件模式。