0

我正在通过二头肌模板部署 Cosmos。大多数情况下,一切都是参数化的。我们找到了一种部署多个存储过程的方法,如下所述。

在二头肌中定义一个数组

param storedProcedureData array = []

然后在资源部分循环数据:

resource cosmosStoredProcedures 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/storedProcedures@2021-06-15' = [for storedProcedure in storedProcedureData: {
  parent: cosmosSQLContainers
  name: storedProcedure.name
  properties: {
    resource: {
      id: storedProcedure.name
      body: storedProcedure.body
    }
  }
}]

我有一个带有存储过程代码的 json 文件,如下所示:

[
  {
    "name": "sp1",
    "body": "function sp1 etc"
  },
  {
    "name": "sp2",
    "body": "function sp2 etc"
  }
]

并使用 az 命令从 powershell 中这样调用它:

az deployment group create --resource-group rgname `
--name testdeployment `
--template-file "C:\GitHub\bicep\cosmosdb\main.bicep" `
--parameters "C:\GitHub\bicep\cosmosdb\cosmosMain.parameters.json" `
--parameters storedProcedureData=$storedProcedureData

其中存储过程数据是一个变量:

$storedProcedureData=(Get-Content "C:\GitHub\bicep\cosmosdb\storedproc.json")

问题是 - 有没有更好的方法!!!如果我有多个容器怎么办......

4

1 回答 1

0

我建议您使用 Bicep 的模块来满足您的循环问题,因为 Bicep 本身不能在嵌套循环上循环,但可以在循环中调用模块,该模块本身在循环中执行其他工作。

因此,我是否可以建议以下内容:

// cosmos-CreateStoredProcedure.bicep

@description('The stored procedures to register')
// {name: '<name>', body: '<body>'}
param StoredProcedureData array

@description('The name of the Cosmos account')
param CosmosAccountName string

@description('The name of the Cosmos SQL container')
param CosmosContainerName string

resource CosmosContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2021-10-15' existing = {
  name: '${CosmosAccountName}/${CosmosContainerName}'
}

resource StoredProcs 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/storedProcedures@2021-06-15' = [for sp in StoredProcedureData: {
  parent: CosmosContainer
  name: sp.name
  properties: {
    resource: {
      id: sp.name
      body: sp.body
    }
  }
}]

现在你已经有了一个模块化的 Bicep 文件,你可以向其中传递任意数量的存储过程,它可以在你想要的任何 Cosmos 帐户和容器上运行。

所以现在这意味着你有一个外部模块,它实际上会针对你想要部署到的每组容器运行。如果要使用外部文件,请创建另一个以相同方式映射所有内容的文件。在 Powershell 中创建一个数组,并为您要读取的每个文件路径推送一个包含 containerName 值和 JSON 值的对象,然后传递此数组以在下面的模板中设置 StoredProcedures 值。

这循环遍历数组中的每组存储过程对象以调用内部模块,然后内部模块循环遍历存储过程以实际存储。

// cosmos-registerAllStoredProcedures.bicep

@description('The name of the Cosmos account')
param CosmosAccountName string

param StoredProcedures array = [
{
  containerName: 'containerA'
  storedProcecures: [
    'procedureAText'
    'procedureBText'
    'procedureCText'
  ]
}
{
  containerName: 'containerB'
  filePaths: [
    'procedureAText'
  ]
}
]

module DeployStoredProcedures './cosmos-CreateStoredProcedure.bicep' = [for (set, i) in StoredProcedures: {
  name: 'storedProcedures-${set.containerName}-${i}' //Might need to include the `i` value so the build knows this will yield a unique name
  params: {
    CosmosAccountName: CosmosAccountName 
    CosmosContainerName: set.containerName
    StoredProcedureData: set.filePaths
  }
}]

于 2022-02-09T02:15:12.847 回答