在 Azure Batch 帐户或池中使用托管标识
本文介绍如何在 Microsoft Azure Batch 帐户或批处理池中使用托管标识。 本文讨论何时应在批处理帐户和批处理池中配置托管标识。 它还概述了不同的行为方案,因为托管标识使用可能会导致某些故障情况混乱。
先决条件
- Azure Batch 帐户。
- Azure 存储帐户。
- 波斯特曼
设置存储帐户以用于批处理帐户
如果要在批处理帐户中设置托管标识,必须先设置存储帐户,以便将其用作批处理帐户自动存储。 此自动存储用于存储应用程序包和任务资源文件。 若要配置自动存储,必须将存储帐户链接到批处理帐户。 还必须将自动存储帐户设置为使用批处理帐户托管标识作为其身份验证模式。
要完成本设置,请按照以下步骤操作:
在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “设置” 标题,然后选择 “存储帐户”。
在 “存储帐户信息 ”部分下,选择 一个存储帐户。
选择存储帐户后,返回到“存储帐户信息”部分,并将“身份验证模式”字段更改为“Batch 帐户托管标识”。
在批处理帐户中设置托管标识
注意
本节中讨论的交互是在批处理帐户与Azure 存储或 Azure 密钥库之间。 有关批处理节点和其他 Azure 资源之间的交互,请参阅下一部分(在批处理池中设置托管标识)。
通过在批处理帐户上配置托管标识,可以授予批处理帐户仅对其他服务进行身份验证的权限。 此配置不允许对批处理节点或批处理池虚拟机(VM)进行身份验证。
在批处理帐户中配置托管标识时,有两个选项:启用系统分配的托管标识,或 为批处理帐户创建单独的用户分配托管标识 。
若要在批处理帐户中设置托管标识,请执行以下步骤:
在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “设置” 标题,然后选择“ 标识”。
在 “标识类型 ”标题中,选择 “系统分配”(针对系统分配 的托管标识)或 “用户分配 ”(对于用户分配的托管标识)。
完成此配置后,返回到批处理帐户的概述页。 在 页面的“概要” 部分中,选择 “JSON 视图”。 托管标识的 JSON 表示形式将以下列格式之一显示:
系统分配的托管标识
"identity": { "principalId": "<principal-guid>", "tenantId": "<tenant-guid>", "type": "SystemAssigned" }
用户分配的托管标识
"identity": { "type": "UserAssigned", "userAssignedIdentities": { "/subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name>": { "principalId": "<principal-guid>", "clientId": "<client-guid>" } } }
使用托管标识访问 autostorage 帐户
批处理帐户的托管标识功能将用于某些任务,例如将应用程序包上传到批处理帐户。 若要上传应用程序包,请转到Azure 门户中的批处理帐户概述页,选择“应用程序>添加”,然后按照门户说明完成上传。 Azure Batch 将应用程序包存储在其自动存储帐户中。 由于以前将批处理帐户的身份验证模式设置为 Batch 帐户托管标识,因此系统会从批处理帐户的托管标识中检索凭据,以访问自动存储帐户。
可能需要检查托管标识是否对 autostorage 帐户具有足够的权限。 若要检查这些权限,请执行以下步骤:
在Azure 门户中,搜索并选择“存储帐户”。
在存储帐户列表中,选择自动存储帐户的名称。
在存储帐户的导航窗格中,选择访问控制(IAM)。
在访问控制(IAM)页上,选择“检查访问”按钮。
在 “检查访问 ”窗格中,选择 “托管标识 ”选项。
在 “托管标识 ”字段中,选择要查看其权限的托管标识。
在“ 当前角色分配 ”选项卡中,检查是否有分配的角色有足够的权限上传应用程序包。 如果没有此类角色分配,尝试将应用程序包上传到批处理帐户时,Azure 门户通知中会显示以下错误消息:
包名称>上传错误<.zip
文件上传在上传过程中遇到意外错误。
如果遇到此上传错误,请检查上传请求的 HTTP 存档 (.har) 文件。 将有一个 POST 请求,其中包含名称前缀 batch
(例如 batch?api-version=2020-06-01
),你将看到 HTTP 状态为 200。 在有效负载中,你会注意到发送到批处理帐户的实际 PUT 请求。 对 PUT 请求的响应将显示 HTTP 状态为 409。 完整错误响应将类似于以下文本:
{responses: [{name: "<response-guid>", httpStatusCode: 409,...}]}
{responses: [{name: "<response-guid>", httpStatusCode: 409,...}]}
0: {name: "<response-guid>", httpStatusCode, 409,...}
content: {error: {code: "AutoStorageNoPermission",...}}
error: {code: "AutoStorageNoPermission",...}
code: "AutoStorageNoPermission"
message: "The managed identity does not have permission to access auto storage account. Please use Azure RBAC to assign the managed identity access to auto storage."
target: "BatchAccount"
contentLength: 318
此错误意味着批处理帐户中的系统分配或用户分配的托管标识没有足够的权限来对自动存储帐户执行操作。
使用托管标识访问密钥保管库
有关如何使用托管标识访问 Azure 密钥库的信息,请参阅使用 Azure 密钥库 和托管标识为 Azure Batch 帐户配置客户管理的密钥。
在批处理池中设置托管标识
注意
本节中讨论的交互是在批处理节点和其他 Azure 资源之间。 有关批处理帐户与Azure 存储或 Azure 密钥库之间的交互,请参阅上一部分(在批处理帐户中设置托管标识)。
如果想要允许 Azure Batch 节点访问其他 Azure 资源,请使用在 Azure Batch 池中配置的托管标识。
如果自动存储帐户的身份验证模式设置为 Batch 帐户托管标识,Azure Batch 节点将接收托管标识令牌。 节点使用托管标识令牌通过 azure 实例元数据服务(IMDS)通过Microsoft Entra 身份验证进行身份验证。
Azure 批处理池仅支持用户分配的托管标识版本。 因此,必须在 与 Azure Batch 帐户相同的租户中创建用户分配的托管标识 。 此外,必须向用户分配的托管标识授予存储数据平面(例如,通过存储 Blob 数据所有者)的权限。
将托管标识关联到访问 autostorage 帐户的节点
对于计算节点用于访问 autostorage 的用户分配标识,必须将此标识引用分配给具有需要访问自动存储的计算节点的池。 (有关此要求的详细信息,请参阅 REST API 中针对Batch 帐户 - 属性中的 nodeIdentityReference
Update AutoStorageBaseProperties。因此,必须在Azure 门户的两个位置配置节点标识引用:
批处理帐户自动存储帐户中的节点标识引用
批处理池中用户分配的托管标识
重要
可以在池标识中定义多个用户分配的托管标识。 但是,必须在池标识中定义节点标识引用中定义的标识。
设置 autostorage 帐户的节点标识引用
若要在 autostorage 帐户中设置节点标识引用,请执行以下步骤:
在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “设置” 标题,然后选择 “存储帐户”。
在 “存储帐户信息 ”部分下,选择 “选择存储帐户”,然后选择自动存储帐户。
转到 节点标识引用 标题,然后选择“ 添加”。
完成添加新用户分配的节点标识引用的过程。
设置批处理池的用户分配托管标识
若要在批处理池中设置用户分配的托管标识,请执行以下步骤:
在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “功能 ”标题,然后选择“ 池”。
在批处理池页中,选择“ 添加”。
在“ 添加池 ”页中,输入 池 ID。 在 “标识 ”字段中,选择“ 已分配的用户”。
找到“用户分配的托管标识”标题,然后选择“添加”。
完成将之前创建的节点标识引用添加到批处理池的过程。
批处理节点中托管标识的用例
可以通过不同的方式在批处理节点中使用托管标识,例如以下功能:
- 从批处理池下载应用程序包
- 从批处理池下载任务资源文件
从批处理池下载应用程序包
创建批处理池时,可以在池级别指定应用程序包。 应用程序包将从 autostorage 帐户下载,并安装在此池中的所有节点中。 有关详细信息,请参阅 上传和管理应用程序。 在创建批处理池期间引用应用程序包之前,先将应用程序包上传到批处理帐户。 若要将应用程序包添加到批处理池,请转到 批处理帐户的“添加池 ”页,找到 “可选设置” 标题,然后选择“ 应用程序包”。
行为方案
本部分概述了以下托管标识参数的节点操作状态和应用程序包下载状态:
节点标识引用中是否提供托管标识
托管标识在 autostorage 帐户中是否具有足够的权限
批处理池是使用相同的托管标识还是不同的托管标识创建
在Azure 门户中,可以在批处理节点的概述页中找到节点和包下载状态。 若要访问此页面,请找到 批处理池导航窗格的“常规 ”标题,选择 “节点”,然后选择要查看的节点的名称。
下表概述了四种涉及批处理池中的托管标识和应用程序包的行为方案。
方案编号 | 托管标识用法 | autostorage 帐户中的托管标识权限 | 池创建规范 | 节点状态 | 包下载状态 |
---|---|---|---|---|---|
1 | 在节点标识引用中给定 | 足够的权限 | 使用同一托管标识在池中创建 | 已成功启动 | 下载到根/应用程序目录中的节点 |
2 | 在节点标识引用中给定 | 权限不足 | 使用同一托管标识在池中创建 | 已成功启动,但处于 空闲 状态 | 未下载到节点 |
3 | 节点标识引用中未提供 | 足够或没有足够的权限 | 使用相同或不同的托管标识在池中创建 | 无限期停滞在 “开始 ”状态 | 未下载到节点 |
4 | 在节点标识引用中给定 | 足够或没有足够的权限 | 使用其他托管标识在池中创建 | 不可用 状态 | 未下载到节点 |
在方案 3 中,当 Azure Batch 服务尝试启动节点时,节点标识引用将变为 null。 这会导致节点保持停滞在 “正在启动 ”状态。 若要验证此状态,请转到批处理池节点 “概述 ”页,然后选择“ 上传批处理日志”以将批处理日志 上传到存储容器。 在“上传批处理日志”窗格中,选择Azure 存储容器,选择“选取存储容器”按钮,然后从存储容器中选择并下载agent-debug.log文件。 日志文件将包含多个条目,这些条目包含“池尚未完全联接,health=Status.TvmJoinPoolInProgress”消息。
在方案 4 中,可以在创建批处理池时定义多个托管标识。 如果未将节点标识引用中定义的托管标识添加到池标识,该怎么办? 在这种情况下,Azure Batch 服务找不到与节点引用中定义的托管标识匹配的正确托管标识。 相反,该服务将显示以下节点错误消息:
节点有 1 个错误(s)。
节点上遇到错误
代码: ApplicationPackageError
消息:
为池指定的一个或多个应用程序包无效
从批处理池下载任务资源文件
创建任务时,可以指定要在任务中使用的资源文件。 在运行任务命令之前,这些文件会自动从 autostorage 帐户下载到节点。 有关详细信息,请参阅 Azure Batch 中的任务。 若要指定任务资源文件,请执行以下步骤:
在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “功能 ”标题,然后选择“ 作业”。
在 “作业 ”页中,选择“ 添加”。
在“添加作业”窗格中填写必填字段,然后选择“确定”。
在批处理作业的导航窗格中,找到“ 常规 ”标题,然后选择“ 任务”。
在“任务”页上,选择“添加”。
在 “添加任务 ”窗格中,填写任何必填字段。 然后,找到 “高级设置” 标题,然后选择“ 资源文件”。
可以使用下表中所述的方法指定资源文件。
方法 | 备注 |
---|---|
Autostorage 容器 | 标识引用显示为 “无”,无法对其进行修改。 节点访问自动存储帐户以检索资源文件。 |
容器 URL 或 HTTP URL | 如果在该Azure 存储帐户中为标识引用配置了足够的权限,并且标识已添加到批处理池,则可以定义另一个Azure 存储帐户的 URL。 |
如果需要访问 autostorage 帐户,则必须在节点标识引用和池标识中定义标识。
指定资源文件定义时, Blob 前缀 和 文件路径 参数是可选的。 Blob 前缀用于筛选特定 Blob。 文件路径用于在节点中创建用于存储 Blob 文件的子文件夹。 如果未定义文件路径,文件将存储在每个任务的路径中(根/wd)。
资源文件类型 | 值 | Blob 前缀 | 文件路径 | 文件模式(仅限 Linux) | 标识参考 |
---|---|---|---|---|---|
AutoStorageContainerName | <name-of-app> | mypath1 | |||
StorageContainerUrl | <https:// account-name.blob.core.windows.net/con> | mypath2 | /subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name> | ||
HttpUrl | <https:// account-name.blob.core.windows.net/con/api.crt> | mypath3 | /subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name> |
行为方案
下表概述了使用托管标识创建批处理池时可能发生的四种行为方案,然后创建具有资源文件的任务,以便从自动存储容器检索 Blob。
方案编号 | 托管标识用法 | autostorage 帐户中的托管标识权限 | 池创建规范 | Result |
---|---|---|---|---|
1 | 在节点标识引用中给定 | 足够的权限 | 使用同一托管标识在池中创建 | Blob 文件已成功下载到根/wd/<file-path> 目录中的节点,如任务概述页中所示 |
2 | 在节点标识引用中给定 | 权限不足 | 使用同一托管标识在池中创建 | 由于 ResourceContainerAccessDenied 错误,任务失败,错误消息“拒绝某个指定的 Azure Blob 容器的访问” |
3 | 节点标识引用中未提供 | 足够或没有足够的权限 | 使用相同或不同的托管标识在池中创建 | 由于 ResourceContainerAccessDenied 错误,任务失败,错误消息“拒绝某个指定的 Azure Blob 容器的访问” |
4 | 在节点标识引用中给定 | 足够或没有足够的权限 | 使用其他托管标识在池中创建 | 由于 ResourceContainerListMiscError 错误,任务失败,错误消息“列出指定 Azure Blob 容器之一时遇到的杂项错误” |
如果 Blob 检索任务失败,请转到Azure 门户的“任务”页,然后选择错误代码旁边显示的任务的名称。 然后,在任务页的导航窗格中,找到“常规”标题,选择“属性”,然后选择“Json 视图”。 属性的 JSON 显示将显示相应的错误消息和有关失败任务的其他详细信息。 例如,在方案 4 中, ResourceContainerListMiscError 错误由于“HTTP 400 错误请求”错误而失败。 这是因为节点标识引用中定义的托管标识与池标识配置中定义的任何托管标识不匹配。
验证托管标识是否可以访问 Azure 资源
若要在 Windows 中验证分配了 Azure Batch 节点的托管标识是否有足够的权限访问 Azure 资源(例如存储帐户),请执行以下步骤:
注意
此过程模拟需要执行的最后一步,以获取具有有效标识 ID 的令牌来访问存储帐户并检查是否有足够的权限。 如果未在节点标识引用中定义标识,则节点无法获取标识 ID。 在这种情况下,整个进程已被阻止,然后才能执行最后一步。 在执行此过程之前,请验证标识是否在节点标识引用中定义。
使用远程桌面协议(RDP)连接到节点。
在 Postman 中,将包含标头的
Metadata: true
GET 请求发送到以下 URL:http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://storage.azure.com/&mi_res_id=/subscriptions/<subscription-guid>/resourceGroups/<resource-group-name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-assigned-identity-name>
169.254.169.254
IP 地址也称为 Azure 实例元数据服务(IMDS)。 IMDS 提供有关 VM 实例的信息。 如果具有此 VM 实例信息,可以使用 VM 请求托管标识的令牌。mi_res_id
URL 中的参数值加粗。 这是在池标识中定义的用户分配托管标识的资源 ID。 若要查找该资源 ID 以及客户端 ID 和主体 ID,请执行以下步骤:在Azure 门户中,搜索并选择 Batch 帐户。
在批处理帐户列表中,选择批处理帐户的名称。
在批处理帐户的导航窗格中,找到 “功能 ”标题,然后选择“ 池”。
在批处理池列表中,选择批处理池的名称。
在批处理池的导航窗格中,找到“ 常规 ”标题,然后选择“ 属性”。
在“池属性”页上,选择 “Json”视图。
在 JSON 文本中
identity
/userAssignedIdentities
,找到列表。 对于所使用的用户分配的托管标识,请复制以下属性的值:resourceId
clientId
(GUID)principalId
(GUID)
在 Postman 中发送 URL 后, JSON 响应的正文 将包含
access_token
条目(长文本字符串,也称为持有者令牌)和client_id
(GUID)。client_id
响应值应与从批处理池属性页复制的值匹配clientId
。复制完整的持有者令牌,然后通过从 autostorage 帐户检索 Blob 在 Postman 中对其进行测试。 在此示例中,托管标识无权访问存储。 因此,autostorage 帐户会返回 HTTP 403 错误(AuthorizationPermissionMismatch 错误,消息“此请求无权使用此权限执行此操作”)。
注意
检索 Blob 需要 x-ms-version 标头。 有关详细信息,请参阅Azure 存储获取 Blob API。
第三方信息免责声明
本文中提到的第三方产品由 Microsoft 以外的其他公司提供。 Microsoft 对这些产品的性能和可靠性不作任何明示或默示担保。
第三方联系人免责声明
Microsoft 会提供第三方联系信息来帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft 不保证第三方联系信息的准确性。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。