我目前正在将一些基础结构作为代码脚本从 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 调整现有资源的一小部分吗?
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 存在,获取其属性,然后联合或修改模块中的属性。您也许能够做到这一点(取决于您的更改程度),但这在声明性模型中有点反模式。
这种帮助?
| 归档时间: |
|
| 查看次数: |
7643 次 |
| 最近记录: |