Sesiones de intérprete de código sin servidor en Azure Container Apps
Las sesiones dinámicas de Azure Container Apps proporcionan a un intérprete de código acceso rápido y escalable. Cada sesión de intérprete de código está totalmente aislada por un límite de Hyper-V y está diseñada para ejecutar código que no es de confianza.
Usos de las sesiones de intérprete de código
Las sesiones de intérprete de código son ideales para escenarios en los que es necesario ejecutar código potencialmente malintencionado o que podría causar daños en el sistema host u otros usuarios, como:
- Código generado por un modelo de lenguaje de gran tamaño (LLM).
- Código enviado por un usuario final en una aplicación web o SaaS.
En el caso de los marcos LLM populares, como LangChain, LlamaIndex o Semantic Kernel, puede usar herramientas y complementos para integrar aplicaciones de inteligencia artificial con sesiones de intérprete de código.
Las aplicaciones también se pueden integrar con la sesión de intérprete de código mediante una API de REST. La API permite ejecutar código en una sesión y recuperar resultados. También puede cargar y descargar archivos en la sesión y desde ella. Puede cargar y descargar archivos de código ejecutables o archivos de datos que el código puede procesar.
Las sesiones de intérprete de código integradas admiten los escenarios de ejecución de código más comunes sin necesidad de administrar la infraestructura ni los contenedores. Si necesita un control total sobre el entorno de ejecución de código o tiene un escenario diferente que requiere espacios aislados, puede usar sesiones de intérprete de código personalizadas.
Grupo de sesiones de intérprete de código
Para usar sesiones de intérprete de código, necesita un recurso de Azure denominado grupo de sesiones que define la configuración de las sesiones de intérprete de código. En el grupo de sesiones, puede especificar la configuración, como el número máximo de sesiones simultáneas y cuánto tiempo puede estar inactiva una sesión antes de que finalice.
Puede crear un grupo de sesiones mediante Azure Portal, la CLI de Azure o plantillas de Azure Resource Manager. Después de crear un grupo de sesiones, puede usar los puntos de conexión de la API de administración del grupo para administrar y ejecutar código dentro de una sesión.
Creación de un grupo de sesiones con la CLI de Azure
Para crear un grupo de sesiones de intérprete de código mediante la CLI de Azure, asegúrese de tener las versiones más recientes de la CLI de Azure y la extensión Azure Container Apps con los siguientes comandos:
# Upgrade the Azure CLI
az upgrade
# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y
Use el comando az containerapps sessionpool create
para crear el grupo. En el ejemplo siguiente se crea un grupo de sesiones de intérprete de código de Python denominado my-session-pool
. Asegúrese de reemplazar <RESOURCE_GROUP>
por el nombre del grupo de recursos antes de ejecutar el comando.
az containerapp sessionpool create \
--name my-session-pool \
--resource-group <RESOURCE_GROUP> \
--location westus2 \
--container-type PythonLTS \
--max-sessions 100 \
--cooldown-period 300 \
--network-status EgressDisabled
Puede definir la siguiente configuración al crear un grupo de sesiones:
Configuración | Descripción |
---|---|
--container-type |
El tipo de intérprete de código que se va a usar. El único valor admitido es PythonLTS . |
--max-sessions |
El número máximo de sesiones asignadas permitidas simultáneamente. El valor máximo es 600 . |
--cooldown-period |
El número de segundos de inactividad permitidos antes de la finalización. El período de inactividad se restablece cada vez que se llama a la API de la sesión. El intervalo permitido está entre 300 y 3600 . |
--network-status |
Designa si se permite el tráfico de red saliente desde la sesión. Los valores válidos son EgressDisabled (predeterminado) y EgressEnabled . |
Importante
Si habilita la salida, el código que se ejecuta en la sesión puede acceder a Internet. Tenga cuidado cuando el código no sea de confianza, ya que se puede usar para realizar actividades malintencionadas, como ataques por denegación de servicio.
Obtención del punto de conexión de API de administración de grupos con la CLI de Azure
Para usar sesiones de intérprete de código con integraciones del marco de LLM o mediante una llamada directamente a los puntos de conexión de la API de administración, necesita el punto de conexión de la API de administración del grupo. El punto de conexión tiene el formato https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>
.
Para recuperar el punto de conexión de la API de administración de un grupo de sesiones, use el comando az containerapps sessionpool show
. Asegúrese de reemplazar <RESOURCE_GROUP>
por el nombre del grupo de recursos antes de ejecutar el comando.
az containerapp sessionpool show \
--name my-session-pool \
--resource-group <RESOURCE_GROUP> \
--query 'properties.poolManagementEndpoint' -o tsv
Ejecución de código en una sesión
Después de crear un grupo de sesiones, la aplicación puede interactuar con las sesiones del grupo mediante una integración con un marco de LLM o mediante los puntos de conexión de la API de administración del grupo directamente.
Identificadores de sesión
Importante
El identificador de sesión es información confidencial que requiere que use un proceso seguro para administrar su valor. Parte de este proceso requiere que la aplicación garantice que cada usuario o inquilino solo tenga acceso a sus propias sesiones. Si no se protege el acceso a las sesiones, se puede producir un acceso incorrecto o no autorizado a los datos almacenados en las sesiones de los usuarios. Para obtener más información, consulte Identificadores de sesión
Al interactuar con sesiones de un grupo, se usa un identificador de sesión para hacer referencia a cada sesión. Un identificador de sesión es una cadena que define que es única dentro del grupo de sesiones. Si va a compilar una aplicación web, puede usar el identificador del usuario. Si va a crear un bot de chat, puede usar el identificador de conversación.
Si hay una sesión en ejecución con el identificador, se reutiliza la sesión. Si no hay ninguna sesión en ejecución con el identificador, se crea automáticamente una nueva sesión.
Para obtener más información sobre los identificadores de sesión, consulte Información general sobre los identificadores de sesión.
Autenticación
Autenticación mediante tokens de Microsoft Entra (anteriormente Azure Active Directory) Los tokens válidos de Microsoft Entra se generan mediante una identidad que pertenece a los roles ejecutor y colaborador de sesión de Azure ContainerApps en el grupo de sesiones.
Si usa una integración del marco de LLM, el marco controla la generación y administración de tokens. Asegúrate de que la aplicación está configurada con una identidad administrada con las asignaciones de roles necesarias en el grupo de sesiones.
Si usas directamente los puntos de conexión de la API de administración del grupo, debes generar un token e incluirlo en el encabezado Authorization
de las solicitudes HTTP. Además de las asignaciones de roles mencionadas anteriormente, el token debe contener una notificación de audiencia (aud
) con el valor https://dynamicsessions.io
.
Para más información, consulte Autenticación.
Integraciones del marco de LLM
En lugar de usar directamente la API de administración del grupo de sesiones, los marcos de LLM siguientes proporcionan integraciones con sesiones de intérprete de código:
marco | Paquete | Tutorial |
---|---|---|
LangChain | Python: langchain-azure-dynamic-sessions |
Tutorial |
LlamaIndex | Python: llama-index-tools-azure-code-interpreter |
Tutorial |
Kernel semántico | Python: semantic-kernel (versión 0.9.8-b1 o cualquier versión posterior) |
Tutorial |
Puntos de conexión de API de administración
Si no usa una integración de marco de LLM, puede interactuar directamente con el grupo de sesiones mediante los puntos de conexión de la API de administración.
Los siguientes puntos de conexión están disponibles para administrar sesiones en un grupo:
Ruta de acceso del punto de conexión | Method | Descripción |
---|---|---|
code/execute |
POST |
Ejecute el código en una sesión. |
files/upload |
POST |
Cargue un archivo en una sesión. |
files/content/{filename} |
GET |
Descargue un archivo desde una sesión. |
files |
GET |
Enumere los archivos de una sesión. |
Compile la dirección URL completa de cada punto de conexión mediante la concatenación del punto de conexión de la API de administración del grupo con la ruta de acceso del punto de conexión. La cadena de consulta debe incluir un parámetro identifier
que contenga el identificador de sesión y un parámetro api-version
con el valor 2024-02-02-preview
.
Por ejemplo: https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>
Ejecución de un código en una sesión
Para ejecutar código en una sesión, envíe una solicitud POST
al punto de conexión code/execute
con el código que se va a ejecutar en el cuerpo de la solicitud. En este ejemplo se imprime "Hola mundo" en Python.
Antes de enviar la solicitud, reemplace los marcadores de posición entre los corchetes <>
por los valores adecuados para el grupo de sesiones y el identificador de sesión.
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>
{
"properties": {
"codeInputType": "inline",
"executionType": "synchronous",
"code": "print('Hello, world!')"
}
}
Para reutilizar una sesión, especifique el mismo identificador de sesión en las solicitudes posteriores.
Carga de un archivo en una sesión
Para cargar un archivo en una sesión, envíe una solicitud POST
al punto de conexión uploadFile
en una solicitud de datos de formulario de varias partes. Incluya los datos del archivo en el cuerpo de la solicitud. El archivo debe incluir un nombre de archivo.
Los archivos cargados se almacenan en el sistema de archivos de la sesión en el directorio /mnt/data
.
Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <>
por valores específicos de la solicitud.
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream
(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
Descarga de un archivo desde una sesión
Para descargar un archivo desde el directorio /mnt/data
de una sesión, envíe una solicitud GET
al punto de conexión file/content/{filename}
. La respuesta incluye los datos del archivo.
Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <>
por valores específicos de la solicitud.
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
Enumeración de los archivos de una sesión
Para enumerar los archivos en el directorio /mnt/data
de una sesión, envíe una solicitud GET
al punto de conexión files
.
Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <>
por valores específicos de la solicitud.
GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>
La respuesta contiene una lista de archivos en la sesión.
En la lista siguiente se muestra un ejemplo del tipo de respuesta que puede esperar al solicitar el contenido de la sesión.
{
"$id": "1",
"value": [
{
"$id": "2",
"properties": {
"$id": "3",
"filename": "test1.txt",
"size": 16,
"lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
}
},
{
"$id": "4",
"properties": {
"$id": "5",
"filename": "test2.txt",
"size": 17,
"lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
}
}
]
}
Paquetes preinstalados
Las sesiones de intérprete de código de Python incluyen paquetes de Python populares, como NumPy, pandas y scikit-learn.
Para generar la lista de paquetes preinstalados, llame al punto de conexión code/execute
con el código siguiente.
Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <>
por valores específicos de la solicitud.
POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>
{
"properties": {
"codeInputType": "inline",
"executionType": "synchronous",
"code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
}
}
Registro
Las sesiones de intérprete de código no admiten el registro directamente. La aplicación que interactúa con las sesiones puede registrar solicitudes en la API de administración del grupo de sesiones y sus respuestas.
Facturación
Las sesiones de intérprete de código se facturan en función de la duración de cada sesión. Consulte Facturación para obtener más información.