模板中的 Azure Bicep 多个范围

2023-12-09

使用 terraform 很长时间后,我决定开始学习 azure bicep。到目前为止,我正在努力掌握逻辑。到目前为止,我已经尝试了存储帐户和密钥库的部署。我在这里所做的事情如下。

  • 创建存储帐户
  • 使用现有密钥保管库将存储帐户连接字符串存储为机密
  • 根据存储帐户名称创建密钥

这正如我所期望的那样。

所以我想向前迈出一步。这就是我有点困惑的地方。

我想做的是使用相同的二头肌模板,在不同的资源组中创建一个新的秘密,并将其放入不同的密钥保管库中。

现在根据我对azure文档的理解,该模板带有默认值scope在我的具体情况下,它以我的默认订阅为目标,并从终端运行我的二头肌模板,我使用命令

az deployment group create -f ./template.bicep -g <resource-group-name>

这是我的模板:

// Default values I'm using to test 
param keyVaultName string = '<keyvault-name>'
param managedIdentityName string = 'test-managed-identity'

param tenantCodes array = [
  'elhm'
  'feor'
]

// I'm using prefix so I dont need to create additional arrays
var keyVaultKeyPrefix = 'Client-Key-'
var storagePrefix = 'sthrideveur'

// Get a reference to key vault
resource keyVault 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
  name: keyVaultName
}

// Create a managed identity
resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: managedIdentityName
  location: resourceGroup().location
}

// Grant permissions to key vault
resource accessPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2019-09-01' = {
  name: '${keyVault.name}/add'
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: managedIdentity.properties.principalId
        permissions: {
          // minimum required permissions
          keys: [
            'get'
            'unwrapKey'
            'wrapKey'
          ]
        }
      }
    ]
  }
}

// Create key vault keys
resource keyVaultKeys 'Microsoft.KeyVault/vaults/keys@2021-06-01-preview' = [for tenantCode in tenantCodes: {
  name: '${keyVault.name}/${keyVaultKeyPrefix}${tenantCode}'
  properties: {
    keySize: 2048
    kty: 'RSA'
    // storage key should only needs these operations
    keyOps: [
      'unwrapKey'
      'wrapKey'
    ]
  }
}]

// Create storage accounts
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-04-01' = [for tenantCode in tenantCodes: {
  name: '${storagePrefix}${tenantCode}'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_RAGRS'
  }
  // Assign the identity
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${managedIdentity.id}': {}
    }
  }
  properties: {
    allowCrossTenantReplication: true
    minimumTlsVersion: 'TLS1_2'
    allowBlobPublicAccess: false
    allowSharedKeyAccess: true
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: []
      ipRules: []
      defaultAction: 'Allow'
    }
    supportsHttpsTrafficOnly: true
    encryption: {
      identity: {
        // specify which identity to use
        userAssignedIdentity: managedIdentity.id
      }
      keySource: 'Microsoft.Keyvault'
      keyvaultproperties: {
        keyname: '${keyVaultKeyPrefix}${tenantCode}'
        keyvaulturi: keyVault.properties.vaultUri
      }
      services: {
        file: {
          keyType: 'Account'
          enabled: true
        }
        blob: {
          keyType: 'Account'
          enabled: true
        }
      }
    }
    accessTier: 'Cool'
  }
}]

// Store the connectionstrings in KV if specified
resource storageAccountConnectionStrings 'Microsoft.KeyVault/vaults/secrets@2019-09-01' = [ for (name, i) in tenantCodes :{
  name: '${keyVault.name}/${storagePrefix}${name}'
  properties: {
    value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount[i].name};AccountKey=${listKeys(storageAccount[i].id, storageAccount[i].apiVersion).keys[0].value};EndpointSuffix=${environment().suffixes.storage}'
  }
}]

根据这里的文档https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/deploy-to-resource-group?tabs=azure-cli

当我需要定位特定资源组时,我可以使用资源中的范围,因此我创建了以下内容:

resource keyvaultApi 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
  name: keyVaultApiName
  scope: resourceGroup('secondresourcegroup')
}

到目前为止没有错误,但是当我必须创建托管身份资源时,问题发生了。

resource keyvaultApi 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
  name: keyVaultApiName
  scope: resourceGroup('secondresourcegroup')
}

resource managedIdentityTwo 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: managedIdentityNameTwo
  location: resourceGroup().location
}

resource accessPolicyApi 'Microsoft.Media/videoAnalyzers/accessPolicies@2021-11-01-preview' = {
  name: '${keyvaultApi.name}/add'
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: managedIdentityTwo.properties.principalId
        permissions: {
          // minimum required permissions
          keys: [
            'get'
            'unwrapKey'
            'wrapKey'
          ]
        }
      }
    ]
  }
}

在密钥保管库中,我可以声明范围,但对于底层资源(例如访问策略等),我无法声明范围。那么二头肌如何理解这些资源需要针对特定​​的资源组和特定的密钥保管库?

因为当我运行终端命令时,我针对的是特定的资源组,所以我不太明白如何使用一个模板来相应地针对不同的资源组和资源。

我希望我已经表达清楚了我的观点,如果我没有表达清楚,请随时向我询问更多信息。

非常感谢您的时间和帮助

更新: 当我尝试按原样运行代码时,出现以下错误:

{"status":"Failed","error":{"code":"DeploymentFailed","message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.","details":[{"code":"NotFound","message":"{\r\n  \"error\": {\r\n    \"code\": \"ParentResourceNotFound\",\r\n    \"message\": \"Can not perform requested operation on nested resource. Parent resource 'secondkeyvault' not found.\"\r\n  }\r\n}"}]}}

更新: 因此,我按照 Daniel 的指导,在第二个模板中部署了第二个模板所需的代码,如下所示:

template2.二头肌

param deploymentIdOne string = newGuid()
param deploymentIdTwo string = newGuid()
output deploymentIdOne string = '${deploymentIdOne}-${deploymentIdTwo}'
output deploymentIdTwo string = deploymentIdTwo

// Default values I'm using to test 
param keyVaultApiName string = 'secondkeyvaultapi'
param managedIdentityNameTwo string = 'second-second-identity'
var keyVaultKeyPrefixTw = 'Client-Key-'
param tenantCodes array = [
  'tgrf'
]
resource keyvaultApi 'Microsoft.KeyVault/vaults@2021-06-01-preview' existing = {
  name: keyVaultApiName
}

resource managedIdentityTwo 'Microsoft.ManagedIdentity/userAssignedIdentities@2018-11-30' = {
  name: managedIdentityNameTwo
  location: resourceGroup().location
}

resource accessPolicyApi 'Microsoft.KeyVault/vaults/accessPolicies@2019-09-01' = {
  name: '${keyvaultApi.name}/add'
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: managedIdentityTwo.properties.principalId
        permissions: {
          // minimum required permissions
          keys: [
            'get'
            'unwrapKey'
            'wrapKey'
          ]
        }
      }
    ]
  }
}

// Store the connectionstrings in KV if specified
resource clientApiKeys 'Microsoft.KeyVault/vaults/secrets@2019-09-01' = [ for name in tenantCodes :{
  name: '${keyvaultApi.name}/${keyVaultKeyPrefixTw}${name}'
  properties: {
    value: '${deploymentIdOne}-${deploymentIdTwo}'
  }
}]

在我的主模板中我添加了模块:

module clientKeyApi 'template2.bicep' = {
  name: 'testfrgs'
  scope: 'secondresourcegroup'
}

但有件事我并不是100%清楚。 它是如何覆盖所有的for我已在 template2.bicep 中声明了循环和参数名称,但该模块需要一个范围subscription,如果我声明范围,这不会覆盖默认值吗?

抱歉大家提出了新手问题,我正在尝试打破我的思维模式,更好地理解二头肌是如何工作的。

任何解释都会令人惊奇且有帮助的


你不能指定scope资源上,但你can在模块上指定它。您需要将向 keyvault 添加访问策略的资源转变为单独的模块,然后指定scope在模块上。您还可以确定部署范围subscription,但是您还需要将针对特定资源组的所有内容分解为模块。

这是由 ARM 部署的工作方式决定的。 ARM 部署的默认范围是资源组级别。您无法将资源指向不同的资源组,因为它超出了部署范围。

然而,模块作为子部署运行,因此可以具有不同的范围集。

在这种情况下,Terraform 更简单,因为它直接调用 Azure API,而不是使用 ARM 部署模型。 Terraform 不关心部署范围,因为它不使用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板中的 Azure Bicep 多个范围 的相关文章

随机推荐

  • lm() 公式中的 rlang 双花括号

    是否可以使用 rlang tidy 求值运算符 在 lm 公式中 我知道您可以使用双花括号来定义一个通用函数 如下所示 my scatter lt function df xvar yvar ggplot df geom point aes
  • 如何将 Task.WhenAny 与 ReadLineAsync 结合使用从任何 TcpClient 获取数据

    通过我的方式完成所有异步 等待 来自线程池 我遇到了一个有趣的挑战 我有一个在 WPF 应用程序中运行的 TCP 服务器 它接受客户端并将它们存储在List lt gt 像这样 private List
  • 如何向 listView 的自定义 BaseAdapter 添加数据 - Android

    我有一个自定义 BaseAdapter 类 用于创建评论 用户名和数字的视图 此 BaseAdapter 从 AsyncTask 接收此信息 当用户到达 listView 的底部时 AsyncTask 就会运行 问题是 BaseAdapte
  • 无法在 C# WEB API REST 服务单元测试中模拟 Owin 上下文

    我试图在 C WEB API REST 服务中模拟 OWIN 上下文 但 OWIN 上下文似乎始终为空 我正在使用最小起订量和 NET Framework 4 5 2 这是我正在尝试测试的控制器方法 public class Custome
  • 提交时如何评估 Git 配置?

    我正在设置我的第一个 Git Repo 并正在运行 git config list 我注意到我有某些配置值的多个条目 core autocrlf input core autocrlf false 我猜这些值会加倍 因为它们出现在多个配置文
  • Shiny downloadHandler 不保存 PNG 文件

    我的下载功能可以正确执行所有操作 当 另存为 屏幕出现时 会出现我指定的文件名 当我单击 保存 时 窗口关闭 但没有保存任何文件 相同的绘图在应用程序中运行良好 唯一的问题是我似乎无法将其保存到 PNG 文件 我在笔记本电脑上运行 Shin
  • 类无需声明变量即可工作?

    我学习了 php 作为函数式和过程语言 现在尝试开始以目标为导向的学习并得到一个重要的问题 我有代码 class car function set car model this gt model model function check m
  • 将长 gtsummary() 表拆分为 n 个较小的表

    在使用 gtsummary 包创建描述性表时 我得到了一个很长的表 是否可以将这样的表拆分为多个较短的表 通过这个示例数据集 我想展示我的意思 library gtsummary make dataset with a few variab
  • Google Play 管理中心中令人困惑的“上传失败”消息

    我想向 Google Play 添加一个新应用程序 我已经签署了一些应用程序并将其发布到 Google Play 全部使用同一把钥匙 现在有了新的 我收到了这样的消息 Upload failed You uploaded an APK th
  • 网络接口,Wifi 还是 LAN?

    在 C 中如何确定网络接口是 Wifi 还是 Lan 卡 有没有安全的方法来确定这一点 您可以使用网络接口类型的财产网络接口 class 它将等于NetworkInterfaceType Wireless80211如果该接口代表 WiFi
  • 页面墙上的 facebook 帖子 - PHP SDK

    我正在尝试创建一个脚本 在 Facebook 页面 作为管理员 发布状态 这是我正在使用的脚本 try access token new FacebookRequest session GET pageID array fields gt
  • 对多维数组进行排序?

    我有一个看起来像这样的数组 Array 0 gt Array filters gt Array filter 1 gt 1 filter 2 gt 1 filter 3 gt 1 filter 4 gt 1 filter 5 gt 1
  • T-SQL - 如何编写查询来获取与多对多联接中的所有记录匹配的记录

    我认为我没有正确地命名这个问题 但我不知道如何描述它 这是我正在尝试做的事情 假设我有一个包含 PersonID 字段的 Person 表 假设一个人可以属于多个组 因此 有一个包含 GroupID 字段的 Group 表和一个 Group
  • 无法识别“gcc” - 如何使 gcc/mingw 在 Windows 中工作?

    Mingw 二进制安装说明 例如these 告诉我改变PATHWindows 中的环境变量 以便使用gcc g 等命令在任何地方 这对于某些编程 IDE 查找编译器可能也是必要的 如果不这样做会产生如下错误 gcc 不被识别为内部或外部命令
  • Highchart 饼图例圆圈

    我使用 highchart 饼图来创建圆环图 但希望图例图标成为圆圈 有什么想法吗 下面是模型和实际的网络版本 谢谢 在最新版本的 Highcharts 中 您可以使用symbolWidth width and symbolRadius w
  • 如何在辅助线程中运行 aiohttp Web 应用程序

    以下代码摘自aiohttp docs https docs aiohttp org en stable 确实有效 from aiohttp import web async def handle request name request m
  • 使用正则表达式将 VS Code 片段中的反斜杠“\”替换为正斜杠“/”

    背景 我在 VS Code 中添加自定义 JavaScript 代码段以插入当前文件的文件路径 VS代码提供变量获取文件路径 但文件路径在路径中包含反斜杠 我想用 而不是 获取路径 例如 hello world js gt hello wo
  • 在 JTextField 中使用自定义插入符以实现可访问性

    我正在编写一个 Swing 应用程序 我有一个朋友读了很多圣经 该应用程序可以按文本或段落进行搜索 但我的朋友只能看到大字体 and 对比色 我改变插入符号的颜色textField with setCaretColor 用户在其中输入要搜索
  • 自然排序 SQL ORDER BY

    谁能帮我看看我应该在 ORDER BY 语句中附加什么内容来自然地对这些值进行排序 1 10 2 22 20405 109 20405 101 20404 100 X Z D 理想情况下 我想要类似的东西 1 2 10 22 20404 1
  • 模板中的 Azure Bicep 多个范围

    使用 terraform 很长时间后 我决定开始学习 azure bicep 到目前为止 我正在努力掌握逻辑 到目前为止 我已经尝试了存储帐户和密钥库的部署 我在这里所做的事情如下 创建存储帐户 使用现有密钥保管库将存储帐户连接字符串存储为