Azure Bicep - 引用无法在开始时计算的变量

问题描述 投票:0回答:2

我需要:

  • 创建数据工厂
  • 创建存储帐户
  • 创建一个函数应用程序
  • 将数据工厂的角色分配添加到存储帐户
  • 将函数应用的角色分配添加到存储帐户

数据工厂是在与“主”二头肌不同的模块中创建的。这是为了防止“主”模板太大而难以使用 - 这是二头肌相对于手臂模板的主要优点之一。创建函数应用程序也是如此。

对于角色分配,我有:

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2020-08-01-preview' = {
  name: guid(storageAccount.id, contributorRoleId, adfDeploy.outputs.dfId)

VSCode 然后出现以下“问题”:

此表达式用于对“name”属性的赋值 “Microsoft.Authorization/roleAssignments”类型,这需要 可以在部署开始时计算的值。 可以在开始时计算的 adfDeploy 属性包括 “名字”。

我无法从字符串(订阅/rg/资源等)组成 storageAccount Id,因为订阅 id 也是在运行时确定的,因为调用同一个主二头肌来部署到多个订阅。

有没有什么方法可以实现所需的功能,而无需将数据工厂和功能应用程序的创建拉回到“主”二头肌?

azure azure-resource-manager azure-bicep
2个回答
5
投票

您可以创建一个用于存储角色分配的通用模块:

// storage-account-role-assignment.bicep
param storageAccountName string
param principalId string
param roleId string

// Get a reference to the storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2019-06-01' existing = {
  name: storageAccountName
}

// Grant permissions to the storage account
resource storageAccountAppRoleAssignment 'Microsoft.Authorization/roleAssignments@2020-04-01-preview' =  {
  name: guid(storageAccount.id, roleId, principalId)
  scope: storageAccount
  properties: {
    roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', roleId)
    principalId: principalId
  }
}

然后从您创建数据工厂或函数应用程序的位置调用此模块:

// function-app.bicep
...
resource functionApp 'Microsoft.Web/sites@2021-03-01' = {
  name: functionAppName
  kind: 'functionapp'
  identity: {
    type: 'SystemAssigned'
  }
  ...
}

// Create role assignment
module roleAssignment 'storage-account-role-assignment.bicep' = {
  name: 'function-storage-account-role-assignment'
  scope: resourceGroup()
  params:{
    storageAccountName: storageAccountName
    roleId: '<role-id>'
    principalId: functionApp.identity.principalId
  }
}

// data-factory.bicep
...
resource dataFactory 'Microsoft.DataFactory/factories@2018-06-01' = {
  name: name
  identity: {
    type: 'SystemAssigned'
  }
  ...
}

// Create role assignment
module roleAssignment 'storage-account-role-assignment.bicep' = {
  name: 'data-facory-storage-account-role-assignment'
  scope: resourceGroup()
  params:{
    storageAccountName: storageAccountName
    roleId: '<role-id>'
    principalId: dataFactory.identity.principalId
  }
}

0
投票

我联系了支持人员。 这是 EastUS2 的容量问题。我将其移至美国中部并且正在运行。

© www.soinside.com 2019 - 2024. All rights reserved.