在 ARM 模板部署中引用托管服务标识

Posted

技术标签:

【中文标题】在 ARM 模板部署中引用托管服务标识【英文标题】:Referencing a Managed Service Identity in ARM-template deploy 【发布时间】:2018-02-26 22:00:42 【问题描述】:

使用新的 MSI 功能部署 Microsoft.Web 资源时,已创建用户的 principalId GUID 在部署后可见。下面的屏幕截图显示了 ARM 模板中的结构。

稍后在管道中获取此 GUID 以便能够在(例如)Data Lake Store 中分配访问权限的最佳方法是什么?

是否可以使用任何现有的 ARM 模板函数来执行此操作?

【问题讨论】:

【参考方案1】:

以下是一些示例模板:https://github.com/rashidqureshi/MSI-Samples,其中显示 a) 如何授予 RBAC 对 ARM 资源的访问权限 b) 如何使用 MSI 的 OID 为 keyvault 创建访问策略

【讨论】:

我似乎无法使 [reference(resource,apiversion,'Full')] (即'Full')部分工作 - 似乎是无效的语法? Arm 模板被拒绝-使用重载的“完整”参数我缺少什么?在 ARM 文档中也找不到? 你找到解决方案了吗?【参考方案2】:

我自己也为此苦苦挣扎。在 cmets here 深处找到了对我有用的解决方案。

本质上,您创建了一个针对您正在使用 MSI 支持创建的资源的变量。然后,您可以使用该变量来获取特定的tenantId 和 principalId 值。不理想,但它有效。在我的示例中,我正在为函数应用配置 Key Vault 权限。

要创建变量,请使用以下语法。

"variables": 
    "identity_resource_id": "[concat(resourceId('Microsoft.Web/sites', variables('appName')), '/providers/Microsoft.ManagedIdentity/Identities/default')]"

要获取tenantId 和 principalId 的实际值,请使用以下语法引用它们:


    "tenantId": "[reference(variables('identity_resource_id'), '2015-08-31-PREVIEW').tenantId]",
    "objectId": "[reference(variables('identity_resource_id'), '2015-08-31-PREVIEW').principalId]"

希望这对遇到同样问题的人有所帮助!

【讨论】:

值得更多点赞!!在敲打访问策略更新后解决了我的问题:) 谢谢!为了完整起见,如果不想使用变量,也可以直接使用以下"tenantId": "[reference(concat('Microsoft.Web/sites/', parameters('webSiteName')), '2018-02-01', 'Full').identity.tenantId]", 使用resource id functions 会更好:"[reference(resourceId('Microsoft.Web/sites', variables('appName')), parameters('apiVersion'), 'Full').identity.tenantId]" 我是这样使用的:"tenantId": "[subscription().tenantId]", "objectId": "[reference(concat('Microsoft.Web/sites/', variables('app_name_backend')), '2016-08-01', 'Full').identity.principalId]" 我想知道为什么当我尝试使用上述任何包含使用“完整”的示例时,我收到一条错误消息,指出“参考”函数只接受 1 到 2 个参数?? 【参考方案3】:

有new way获取身份信息。您可以直接从支持 Azure 资源的托管标识(过去为托管服务标识)的资源中获取它们。


  "tenantId": "[reference(resourceId('Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",
  "objectId": "[reference(resourceId('Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.principalId]",

您还可以获取其他资源组或/和订阅中资源的主体 ID。 ResourceId支持可选参数:

  "tenantId": "[reference(resourceId(variables('resourceGroup'), 'Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",

"tenantId": "[reference(resourceId(variables('subscription'), variables('resourceGroup'), 'Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",

【讨论】:

以上是关于在 ARM 模板部署中引用托管服务标识的主要内容,如果未能解决你的问题,请参考以下文章

系统分配的托管标识的 Azure ARM 角色分配第一次运行失败

用于部署和禁用 Azure 流分析服务的 ARM 模板

Azure ARM 模板“找不到带有名称的托管环境

如何使用 REST API 或 ARM 模板通过私有 GitHub 存储库在应用服务中部署应用?

如何使用 Azure ARM 模板将 VM 部署到资源组“A”并引用资源组“B”中的现有密钥保管库?

无法使用已装载存储的 Linux 部署 Azure 应用服务的 ARM 模板