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

Azure 容器应用动态会话概述

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

会话具有以下属性:

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

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

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

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

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

注意

Azure 容器应用动态会话目前以预览版提供。

会话类型

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

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

代码解释器

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

自定义容器

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

概念

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

会话池

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

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

会话

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

会话标识符

与池中的会话交互时,必须定义一个会话标识符来管理每个会话。 会话标识符是一个自由格式的字符串,这意味着可以使用适合应用程序需求的任何方式来定义它。 此标识符是确定会话行为的关键元素:

  • 重用现有会话:如果已经存在与标识符匹配的正在运行的会话,则会重复使用此会话。
  • 分配新会话:如果没有正在运行的会话与标识符匹配,则会自动从池中分配新会话。

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

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

向会话发出请求时,可在 URL 中名为 identifier 的查询参数中传递会话标识符。

对于代码解释器会话,还可以使用与 LLM 框架的集成。 该框架会为你处理令牌生成和管理。 确保为应用程序配置了托管标识,并在会话池中对其进行了所需的角色分配。

保护会话标识符

会话标识符是敏感信息,需要通过一个安全的过程来创建和管理它的值。 要保护此值,应用程序必须确保每个用户或租户仅有权访问其自己的会话。

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

示例策略包括:

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

重要

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

身份验证

使用 Microsoft Entra(以前称为 Azure Active Directory)令牌处理身份验证。 有效的 Microsoft Entra 令牌由属于会话池上的“Azure 容器应用会话执行者”和“参与者”角色的标识生成

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

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

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

预览版限制

Azure 容器应用动态会话目前以预览版提供。 适用以下限制:

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

    区域 代码解释器 自定义容器
    东亚
    美国东部
    德国中西部
    意大利北部
    波兰中部
    美国中北部 -
    北欧
    美国西部 2
  • 不支持日志记录。 应用程序可以记录对会话池管理 API 的请求及其响应。

后续步骤