你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 容器应用动态会话概述

Azure 容器应用动态会话可提供对安全沙盒环境的快速访问,这些环境非常适合运行需要与其他工作负载进行强隔离的代码或应用程序。

会话具有以下属性:

  • 强隔离:会话彼此隔离,并且与主机环境隔离。 每个会话在其自己的 Hyper-V 沙盒中运行,提供企业级安全性和隔离。 (可选)可以启用网络隔离以进一步增强安全性。

  • 简单访问:通过 REST API 访问会话。 每个会话由一个唯一标识符标记。 如果不存在具有给定标识符的会话,则会自动分配新会话。

  • 完全托管:会话的生命周期完全由平台管理。 自动清理不再使用的会话。

  • 快速启动:在几毫秒内分配新会话。 通过自动维护准备就绪但未分配的会话池来实现快速启动。

  • 可缩放:可以大规模运行会话。 可以并发运行数百或数千个会话。

会话类型

Azure 容器应用支持两种类型的会话:

类型 描述 计费模式
代码解释器 完全托管代码解释器 每个会话(消耗)
自定义容器 自带容器 容器应用专用计划

代码解释器

使用代码解释器会话可在预安装了常用库的沙盒中运行代码。 它们非常适合运行不受信任的代码,例如应用程序用户提供的代码或大型语言模型 (LLM) 生成的代码。 详细了解代码解释器会话

自定义容器

使用自定义容器会话可在安全的隔离沙盒中运行自己的容器映像。 可以使用它们运行并非可直接支持的语言的自定义代码解释器,或运行需要强隔离的工作负载。 详细了解自定义容器会话

概念

Azure 容器应用动态会话的关键概念是会话池和会话。

会话池

为了提供亚秒级的会话分配时间,Azure 容器应用维护了一个已准备就绪但尚未分配的会话池。 向新会话提交请求时,平台会将池中的会话分配给你。 分配会话后,平台会自动补充该池,以维持恒定数量的就绪会话。

可以配置池,通过 maxConcurrentSessions 属性设置可并发分配的最大会话数。 可以通过 cooldownPeriodInSeconds 属性设置从最后一个请求到删除会话之前的等待时间。 对于自定义容器会话,还可以指定要用于池中会话的容器映像和设置,包括通过 readySessionInstances 指定在池中保持的就绪目标会话数。

会话

会话是运行代码或应用程序的沙盒环境。 每个会话都通过 Hyper-V 沙盒与其他会话和主机环境隔离。 (可选)可以启用网络隔离以进一步增强安全性。

你通过发送 HTTP 请求与会话池中的会话进行交互。 每个会话池都有一个唯一的池管理终结点。

对于代码解释器会话,还可以使用与 LLM 框架的集成。

会话标识符

若要向会话发送 HTTP 请求,你必须在请求中提供会话标识符。 向会话发出请求时,可在 URL 中名为 identifier 的查询参数中传递会话标识符。

  • 如果具有该标识符的会话已存在,则请求将被发送到现有会话。
  • 如果不存在具有该标识符的会话,则会在将请求发送到会话之前自动分配一个新会话。

会话池和会话使用情况的屏幕截图。

标识符格式

会话标识符是一个自由格式的字符串,这意味着可以使用适合应用程序需求的任何方式来定义它。

会话标识符是由你定义的字符串,它在会话池中是唯一的。 如果你正在构建 Web 应用程序,则可以使用用户的 ID 作为会话标识符。 如果你正在生成聊天机器人,则可以使用对话 ID。

标识符必须是长度为 4 到 128 个字符的字符串,并且只能包含下列字母数字字符和特殊字符:|-&^%$#(){}[];<>

保护会话标识符

会话标识符是你必须安全地管理的敏感信息。 你的应用程序需要确保每个用户或租户仅有权访问其自己的会话。

根据应用的设计和体系结构,阻止滥用会话标识符的具体策略有所不同。 但是,你的应用必须始终完全控制会话标识符的创建和使用,以阻止恶意用户访问其他用户的会话。

示例策略包括:

  • 每个用户一个会话:如果应用对每个用户使用一个会话,则必须对每个用户进行安全身份验证,并且应用必须为每个已登录用户使用唯一的会话标识符。
  • 每个代理对话一个会话:如果应用为每个 AI 代理对话使用一个会话,请确保应用为每个对话使用唯一的会话标识符,并且该标识符不能被最终用户修改。

重要

如果未能保护对会话的访问,可能会导致滥用或未经授权地访问存储在用户会话中的数据。

身份验证和授权

使用池管理 API 将请求发送到会话时,将使用 Microsoft Entra(之前为 Azure Active Directory)令牌来处理身份验证。 只有在会话池上具有“Azure ContainerApps 会话执行者”角色的标识提供的 Microsoft Entra 令牌才有权调用池管理API。

若要将该角色分配给标识,请使用以下 Azure CLI 命令:

az role assignment create \
    --role "Azure ContainerApps Session Executor" \
    --assignee <PRINCIPAL_ID> \
    --scope <SESSION_POOL_RESOURCE_ID>

如果使用 LLM 框架集成,该框架会为你处理令牌生成和管理。 确保为应用程序配置了托管标识,并在会话池中进行了所需的角色分配。

如果直接使用池的管理 API 终结点,则必须生成令牌并将其包含在 HTTP 请求的 Authorization 标头中。 除了前面提到的角色分配之外,令牌还需要包含一个值为 https://dynamicsessions.io 的受众 (aud) 声明。

若要使用 Azure CLI 生成令牌,请运行以下命令:

az account get-access-token --resource https://dynamicsessions.io

重要

有效的令牌可用于创建和访问池中的任何会话。 确保令牌安全,不要将其与不受信任的一方共享。 最终用户应该通过应用程序访问会话,而不是直接访问。 他们永远不应该有权访问用来对发送到会话池的请求进行身份验证的令牌。

生命周期

容器应用运行时会自动管理会话池中每个会话的生命周期。

  • 挂起:当会话启动时,它处于挂起状态。 会话处于挂起状态的时间取决于容器映像和为会话池指定的设置。 挂起的会话不会添加到就绪会话池。

  • 就绪:当会话启动完毕并准备就绪后,它就会添加到池中。 此状态下的会话可供分配。 对于自定义容器会话,可以指定要在池中保留的目标就绪会话数。 如果会话的分配速度快于池的补充速度,请增加此数字。

  • 已分配:向未处于运行状态的会话发送请求时,池会提供一个新会话并将其置于已分配状态。 具有相同会话标识符的后续请求会被路由到同一会话。

  • 删除:当会话在 cooldownPeriodInSeconds 设置定义的时间内停止接收请求时,该会话及其 Hyper-V 沙盒会被安全地完全删除。

安全性

Azure 容器应用动态会话专用于在安全的隔离环境中运行不受信任的代码和应用程序。 虽然会话彼此隔离,但单个会话中的任何内容(包括文件和环境变量)都可供会话用户访问。 仅当信任会话用户时,才应配置敏感数据或将敏感数据上传到会话。

默认情况下,会阻止会话发出出站网络请求。 可以通过在会话池上配置网络状态设置来控制网络访问。

此外,请遵循身份验证和授权部分中的指导以确保只有经授权的用户才能访问会话,并遵循保护会话标识符部分中的指导以确保会话标识符安全。

预览版限制

以下限制适用于动态会话:

  • 它仅在以下区域中可用:

    区域 代码解释器 自定义容器
    澳大利亚东部
    美国中部 EUAP
    美国东部 2 EUAP
    美国东部
    东亚
    德国中西部
    意大利北部
    美国中北部 -
    波兰中部
    瑞士北部
    美国中西部
    美国西部 2

后续步骤