Compartir a través de


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.

Pasos siguientes