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

时间:2017-09-18 11:19:45

标签: azure-resource-manager azure-msi

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

enter image description here

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

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

3 个答案:

答案 0 :(得分:29)

我自己也在努力解决这个问题。在我的评论here中深入找到了对我有用的解决方案。

基本上,您可以使用MSI支持创建一个针对您正在创建的资源的变量。然后,您可以使用该变量来获取特定的tenantId和principalId值。不理想,但它的工作原理。在我的示例中,我为功能应用配置了密钥保管库权限。

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

"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]"
}

希望这有助于任何遇到同样问题的人!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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]",