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

Fab*_*ied 6 azure azure-bicep

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

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

resource azureSqlServer 'Microsoft.Sql/servers@2021-05-01-preview' existing = {
  name: azureSqlServerName
  
  resource vnetRule 'virtualNetworkRules' = {
    name: azureSqlServerVnetRuleName
    properties: {
      virtualNetworkSubnetId: subnetId
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

以下不起作用,因为existing不能与 结合使用properties

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

  properties: {
    networkAcls: {
      virtualNetworkRules: [
        {
          id: subnetId
          action: 'Allow'
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

bmo*_*sft 3

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

您的第一个片段相当于:

resource vnetRule 'Microsoft.Sql/servers/virtualNetworkRules@2021-05-01-preview' = {
  name: '${azureSqlServerName}/${azureSqlServerVnetRuleName}'
  properties: {
    virtualNetworkSubnetId: subnetId
  }
}
Run Code Online (Sandbox Code Playgroud)

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

也就是说,如果您想部署到二头肌中的另一个作用域,您可以使用具有 scope 属性的模块。例如

module updateStorage 'storage.bicep' = {
  scope: resourceGroup(storageResourceGroupName)
  name: 'updateStorage'
}
Run Code Online (Sandbox Code Playgroud)

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

这种帮助?