如何访问/转换模块输出到二头肌中的特定对象?

Posted

技术标签:

【中文标题】如何访问/转换模块输出到二头肌中的特定对象?【英文标题】:How to access/cast the module output to spefic object in bicep? 【发布时间】:2021-12-03 15:37:33 【问题描述】:

我的二头肌下方正在返回 keyvault。我喜欢访问父二头肌的 keyvault 中的属性/功能。但是不知道作为模块使用时如何实现。

    我有 keyvault.bicep
    resource kv 'Microsoft.KeyVault/vaults@2019-09-01' existing = 
         name: kvName
         scope: resourceGroup(subscriptionId, kvResourceGroup )
       
       output kv1 object=kv
    我有 parent.bicep(其中 keyvault.bicep 作为模块包含)
   module kv './keyvault.bicep' = 
     name: 'get Secrets'
     params: 
       subscriptionId: subscriptionId
       kvResourceGroup: resourceGroupName
       kvName: keyVaultName
     
   
   var pwd= kv.outputs.kv1.getSecret('key')
    但 getSecret 方法在父二头肌中是未知的

请建议如何进行?

【问题讨论】:

您真的需要密钥库二头肌文件吗?您可以直接在父二头肌文件中引用密钥库吗? 你将如何在模板的其余部分使用这个pwd 变量?问题是getSecret 函数对如何使用有一些特殊要求。 @Thomas 这里的 Keyvault 只是一个例子。它可以是存储帐户或资源组。 @ochzhen 我同意你的观点,它不能分配给变量。它只能分配给模块的安全参数。正如我所说,密钥库就是一个例子。我从下面的答案中了解到,二头肌目前不支持此功能。 我不知道为什么它被否决了。请评论为什么它被否决? 【参考方案1】:

简短的回答是不支持。

在您的parent.bicep 文件中,kv 是模块引用,而不是资源。为了正确理解父子资源层次结构,Bicep 需要在 parent 属性值中有正确父类型的资源引用。

虽然有一个简化资源引用的建议:

https://github.com/Azure/bicep/issues/2246

假设您有 keyvault.bicep 模块来创建密钥库

resource kv 'Microsoft.KeyVault/vaults@2019-09-01' = 
  name: kvName
  ...


output name string = kv.name

在 parent.bicep 中,您可以像这样获得对密钥库的引用:

module kvModule './keyvault.bicep' = 
  name: 'key-vault-$keyVaultName'
  params: 
    kvName: keyVaultName
    ...
  


resource kv 'Microsoft.KeyVault/vaults@2019-09-01' existing = 
  name: kvModule.outputs.name

在你的例子中,有几件事:

密钥保管库模块只是获取对密钥保管库的引用,因此您实际上并不需要模块,您可以直接在 parent.bicep 文件中引用密钥保管库。 getSecret function 是一个非常具体的函数,您只能使用它来将安全参数传递给另一个模块:

从 Azure Key Vault 返回一个机密。 getSecret 函数只能在 Microsoft.KeyVault/vaults 资源上调用。使用此函数将秘密传递给二头肌模块的安全字符串参数。该函数只能与具有@secure() 装饰器的参数一起使用。

【讨论】:

谢谢...所以意味着如果parent bicep 中存在资源,则无法使用getSecret 函数...它只能作为安全参数传递给模块。如果我的理解有误,请纠正我。 这行不通:resource kv 'Microsoft.KeyVault/vaults@2019-09-01' existing = name: kvModule..outputs.name 此表达式用于分配给“Microsoft.KeyVault/vaults”类型的“name”属性,它需要一个可以在部署开始时计算的值。 keyVaultModule 可以在开始时计算的属性包括 "name".bicep(BCP120)

以上是关于如何访问/转换模块输出到二头肌中的特定对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 访问 JSON 中的特定对象?

Swift 如何访问 Struct 对象字典中的特定变量

如何使用 loc[i,j] 根据索引值访问数据框中的特定值

I/O(输入/输出)---序列化与反序列化

将Powershell中的输入/输出编码强制转换为特定的区域设置/代码页?

如何加载 JSON 文件并将其转换为特定类型的对象?