Partager via


Sessions d'interpréteur de code sans serveur dans Azure Container Apps

Les sessions dynamiques Azure Container Apps offrent un accès rapide et scalable à un interpréteur de code. Chaque session d’interpréteur de code est entièrement isolée par une limite Hyper-V et est conçue pour exécuter du code non approuvé.

Utilisations des sessions d’interpréteur de code

Les sessions d’interpréteur de code sont idéales dans les scénarios où vous devez exécuter du code potentiellement malveillant ou susceptible d’endommager le système hôte ou d’autres utilisateurs, par exemple :

  • Code généré par un grand modèle de langage (LLM).
  • Code envoyé par un utilisateur final dans une application web ou SaaS.

Pour les frameworks LLM populaires comme LangChain, LlamaIndex ou Semantic Kernel, vous pouvez utiliser des outils et plug-ins pour intégrer des applications d’IA aux sessions d’interpréteur de code.

Vos applications peuvent également s’intégrer à une session d’interpréteur de code avec une API REST. L’API vous permet d’exécuter du code dans une session et de récupérer les résultats. Vous pouvez également charger et télécharger des fichiers dans la session. Vous pouvez charger et télécharger des fichiers de code exécutables ou des fichiers de données que votre code peut traiter.

Les sessions de l’interpréteur de code intégré prennent en charge les scénarios d’exécution de code les plus courants sans avoir à gérer l’infrastructure ni les conteneurs. Si vous avez besoin d’un contrôle total sur l’environnement d’exécution de code ou si vous avez un autre scénario nécessitant des bacs à sable isolés, vous pouvez utiliser des sessions d’interpréteur de code personnalisé.

Pool de sessions d’interpréteur de code

Pour utiliser des sessions d’interpréteur de code, vous avez besoin d’une ressource Azure appelée pool de sessions qui définit la configuration des sessions d’interpréteur de code. Dans le pool de sessions, vous pouvez spécifier des paramètres comme le nombre maximal de sessions simultanées et la durée pendant laquelle une session peut être inactive avant son arrêt.

Vous pouvez créer un pool de sessions en utilisant le portail Azure, Azure CLI ou des modèles Azure Resource Manager. Après avoir créé un pool de sessions, vous pouvez utiliser les points de terminaison de l’API de gestion du pool pour gérer et exécuter le code à l’intérieur d’une session.

Créer un pool de sessions avec Azure CLI

Pour créer un pool de sessions d’interpréteur de code avec Azure CLI, vérifiez que vous avez les dernières versions d’Azure CLI et de l’extension Azure Container Apps en utilisant les commandes suivantes :

# Upgrade the Azure CLI
az upgrade

# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y

Utilisez la commande az containerapps sessionpool create pour créer le pool. L’exemple suivant crée un pool de sessions d’interpréteur de code Python nommé my-session-pool. Veillez à remplacer <RESOURCE_GROUP> par le nom de votre groupe de ressources avant d’exécuter la commande.

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

Vous pouvez définir les paramètres suivants quand vous créez un pool de sessions :

Setting Description
--container-type Type d’interpréteur de code à utiliser. La seule valeur possible est PythonLTS.
--max-sessions Nombre maximal de sessions allouées autorisées simultanément. La valeur maximale est 600.
--cooldown-period Nombre de secondes d’inactivité autorisées avant l’arrêt. La période d’inactivité est réinitialisée chaque fois que l’API de la session est appelée. La plage autorisée se trouve entre 300 et 3600.
--network-status Indique si le trafic réseau sortant est autorisé à partir de la session. Les valeurs valides sont EgressDisabled (valeur par défaut) et EgressEnabled.

Important

Si vous activez la sortie, le code exécuté dans la session peut accéder à Internet. Soyez prudent quand le code n’est pas approuvé, car il peut être utilisé pour effectuer des activités malveillantes comme des attaques par déni de service.

Obtenir le point de terminaison de l’API de gestion du pool avec Azure CLI

Pour utiliser des sessions d’interpréteur de code avec des intégrations de framework LLM ou en appelant directement les points de terminaison de l’API de gestion, vous avez besoin du point de terminaison de l’API de gestion du pool. Le point de terminaison est au format https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>.

Pour récupérer le point de terminaison de l’API de gestion d’un pool de sessions, utilisez la commande az containerapps sessionpool show. Veillez à remplacer <RESOURCE_GROUP> par le nom de votre groupe de ressources avant d’exécuter la commande.

az containerapp sessionpool show \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --query 'properties.poolManagementEndpoint' -o tsv

Exécution de code dans une session

Une fois que vous avez créé un pool de sessions, votre application peut interagir avec des sessions du pool en utilisant une intégration à un framework LLM ou directement les points de terminaison de l’API de gestion du pool.

Identificateurs de session

Important

L’identificateur de session est une information sensible qui nécessite que vous utilisiez un processus sécurisé pour gérer sa valeur. Une partie de ce processus nécessite que votre assure que chaque utilisateur ou locataire n’a accès qu’à ses propres sessions. La non-sécurisation de l’accès aux sessions peut entraîner une mauvaise utilisation ou un accès non autorisé aux données stockées dans les sessions de vos utilisateurs. Pour plus d’informations, consultez Identificateurs de session.

Quand vous interagissez avec des sessions dans un pool, vous utilisez un identificateur de session pour référencer chaque session. Un identificateur de session est une chaîne que vous définissez dans le pool de sessions de manière unique. Si vous créez une application web, vous pouvez utiliser l’ID de l’utilisateur. Si vous créez un chatbot, vous pouvez utiliser l’ID de conversation.

S’il y a une session en cours d’exécution avec l’identificateur, la session est réutilisée. S’il n’y a pas de session en cours d’exécution avec l’identificateur, une session est créée automatiquement.

Pour en savoir plus sur les identificateurs de session, consultez la section de vue d’ensemble des sessions.

Authentification

L’authentification est gérée avec des jetons Microsoft Entra (anciennement Azure Active Directory). Les jetons Microsoft Entra valides sont générés par une identité appartenant aux rôles Exécuteur de session Azure Container Apps et Contributeur sur le pool de sessions.

Si vous utilisez une intégration de framework LLM, le framework se charge de la génération et la gestion des jetons pour vous. Vérifiez que l’application est configurée avec une identité managée dotée des attributions de rôle nécessaires sur le pool de sessions.

Si vous utilisez directement les points de terminaison de l’API de gestion du pool, vous devez générer un jeton et l’inclure dans l’en-tête Authorization de vos requêtes HTTP. En plus des attributions de rôle mentionnées précédemment, le jeton doit contenir une revendication d’audience (aud) avec la valeur https://dynamicsessions.io.

Pour plus d’informations, consultez la section Authentification.

Intégrations de framework LLM

Au lieu d’utiliser directement l’API de gestion du pool de sessions, les frameworks LLM suivants fournissent des intégrations aux sessions d’interpréteur de code :

Infrastructure Package Didacticiel
LangChain Python : langchain-azure-dynamic-sessions Tutoriel
LlamaIndex Python : llama-index-tools-azure-code-interpreter Tutoriel
Noyau sémantique Python : semantic-kernel (version 0.9.8-b1 ou ultérieure) Tutoriel

Points de terminaison de l’API de gestion

Si vous n’utilisez pas d’intégration de framework LLM, vous pouvez interagir directement avec le pool de sessions en utilisant les points de terminaison de l’API de gestion.

Les points de terminaison suivants sont disponibles pour gérer les sessions dans un pool :

Chemin du point de terminaison Méthode Description
code/execute POST Exécuter du code dans une session.
files/upload POST Charger un fichier dans une session.
files/content/{filename} GET Télécharger un fichier à partir d’une session.
files GET Lister les fichiers dans une session.

Générez l’URL complète de chaque point de terminaison en concaténant le point de terminaison d’API de gestion du pool avec le chemin du point de terminaison. La chaîne de requête doit inclure un paramètre identifier contenant l’identificateur de session, et un paramètre api-version avec la valeur 2024-02-02-preview.

Par exemple : https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>

Exécuter du code dans une session

Pour exécuter du code dans une session, envoyez une requête POST au point de terminaison code/execute avec le code à exécuter dans le corps de la demande. Cet exemple imprime « Hello, world! » en Python.

Avant d’envoyer la demande, remplacez les espaces réservés entre crochets <> par les valeurs appropriées pour votre pool de sessions et l’identificateur de session.

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!')"
    }
}

Pour réutiliser une session, spécifiez le même identificateur de session dans les demandes suivantes.

Charger un fichier dans une session

Pour charger un fichier dans une session, envoyez une requête POST au point de terminaison uploadFile dans une demande de données de formulaire en plusieurs parties. Ajoutez les données de fichier dans le corps de la demande. Le fichier doit inclure un nom de fichier.

Les fichiers chargés sont stockés dans le système de fichiers de la session sous le répertoire /mnt/data.

Avant d’envoyer la demande, remplacez les espaces réservés entre crochets <> par les valeurs propres à votre demande.

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--

Télécharger un fichier à partir d’une session

Pour télécharger un fichier à partir du répertoire /mnt/data d’une session, envoyez une requête GET au point de terminaison file/content/{filename}. La réponse inclut les données de fichier.

Avant d’envoyer la demande, remplacez les espaces réservés entre crochets <> par les valeurs propres à votre demande.

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>

Lister les fichiers dans une session

Pour lister les fichiers du répertoire /mnt/data d’une session, envoyez une requête GET au point de terminaison files.

Avant d’envoyer la demande, remplacez les espaces réservés entre crochets <> par les valeurs propres à votre demande.

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 réponse contient la liste des fichiers de la session.

La liste suivante montre un exemple de type de réponse pour une demande de contenu de la session.

{
    "$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"
            }
        }
    ]
}

Packages préinstallés

Les sessions d’interpréteur de code Python incluent des packages Python populaires comme NumPy, pandas et scikit-learn.

Pour générer la liste des packages préinstallés, appelez le point de terminaison code/execute avec le code suivant.

Avant d’envoyer la demande, remplacez les espaces réservés entre crochets <> par les valeurs propres à votre demande.

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]"
    }
}

Logging

Les sessions d’interpréteur de code ne prennent pas en charge directement la journalisation. Votre application qui interagit avec les sessions peut journaliser les requêtes effectuées auprès de l’API de gestion du pool de sessions et ses réponses.

Billing

Les sessions d’interpréteur de code sont facturées en fonction de la durée de chaque session. Pour plus d’informations, consultez Facturation.

Étapes suivantes