如何使用 Azure Bicep 调整现有资源?

How can I adapt an existing resource with Azure Bicep?

我目前正在将一些基础结构作为代码脚本从 Azure CLI 移植到 Azure Bicep。除其他事项外,Bicep 文件应创建一个子网并允许从该子网访问现有的 Azure SQL 服务器和现有的存储帐户。

对于 SQL 服务器,这很简单 - 我可以引用现有服务器资源并声明表示 VNET 规则的子资源:

resource azureSqlServer 'Microsoft.Sql/servers@2021-05-01-preview' existing = {
  name: azureSqlServerName
  
  resource vnetRule 'virtualNetworkRules' = {
    name: azureSqlServerVnetRuleName
    properties: {
      virtualNetworkSubnetId: subnetId
    }
  }
}

但是,对于存储帐户,网络规则不是子资源,而是存储帐户资源 (properties.networkAcls.virtualNetworkRules) 的 属性。我无法在我的 Bicep 文件中声明存储帐户的所有详细信息,因为该资源超出了我当前正在处理的部署的范围。本质上,我想调整现有资源,只是确保存在单个规则。

以下不起作用,因为 existing 不能与 properties 组合:

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
  name: storageAccountName

  properties: {
    networkAcls: {
      virtualNetworkRules: [
        {
          id: subnetId
          action: 'Allow'
        }
      ]
    }
  }
}

有什么方法可以使用 Bicep 调整现有资源的一小部分吗?

bicep 中的 existing 关键字用于告诉 bicep 该资源已经存在,您只需要在代码中对该资源进行符号引用。如果资源不存在,部署可能会以某种方式失败。

您的第一个片段相当于:

resource vnetRule 'Microsoft.Sql/servers/virtualNetworkRules@2021-05-01-preview' = {
  name: '${azureSqlServerName}/${azureSqlServerVnetRuleName}'
  properties: {
    virtualNetworkSubnetId: subnetId
  }
}

在您的第二个代码段中,由于您要更新属性,您必须提供资源的完整声明,IOW,您必须定义和部署 storageAccount。这不是二头肌独有的,它是 Azure 中声明性模型的工作方式。

也就是说,如果你想部署到 bicep 中的另一个范围,你可以使用范围为 属性 的模块。例如

module updateStorage 'storage.bicep' = {
  scope: resourceGroup(storageResourceGroupName)
  name: 'updateStorage'
}

缺点是您需要确保 define/declare 该 storageAccount 所需的所有属性并不理想。您可以通过一些方法来解决这个问题,但如果 storageAccount 不存在,部署肯定会失败。例如,您可以断言 storageAccount 存在,获取其属性,然后合并或修改模块中的属性。您也许能够完成这项工作(取决于您的更改程度),但它有点像声明性模型中的 anti-pattern。

有帮助吗?

更新:我刚刚意识到你 来自 Azure CLI 并试图在二头肌中找到一种方法 - 很抱歉没有回答你的实际问题 - 无论如何你的 post让我以二头肌以外的另一种方式思考这个问题,所以我的“答案”就是我想出的...

...听起来我们以同样的方式考虑过这个问题;使用 bicep 拉皮条现有的存储帐户,授予新的子网访问权限。但是我最终使用了 AzureCLI az storage account network-rule add

例如

newSubnet='/subscriptions/<subscr-guid>/resourceGroups/<rg-name-where-vnet-resides>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>'

az storage account network-rule add -g <rg-name-where-sa-resides> --account-name <storage-account-name> --subnet $newSubnet

运行 从终端或将其放入 devops 管道中的 AzureCLI 任务(这正是我需要的)