Serverlösa kodtolksessioner i Azure Container Apps
Dynamiska sessioner i Azure Container Apps ger snabb och skalbar åtkomst till en kodtolkare. Varje kodtolkarsession är helt isolerad av en Hyper-V-gräns och är utformad för att köra kod som inte är betrodd.
Används för kodtolkarsessioner
Kodtolkarsessioner är idealiska för scenarier där du behöver köra kod som är potentiellt skadlig eller kan orsaka skada för värdsystemet eller andra användare, till exempel:
- Kod som genereras av en stor språkmodell (LLM).
- Kod som skickas av en slutanvändare i ett webb- eller SaaS-program.
För populära LLM-ramverk som LangChain, LlamaIndex eller Semantic Kernel kan du använda verktyg och plugin-program för att integrera AI-appar med kodtolksessioner.
Dina program kan också integreras med kodtolkarsessionen med hjälp av ett REST-API. Med API:et kan du köra kod i en session och hämta resultat. Du kan också ladda upp och ladda ned filer till och från sessionen. Du kan ladda upp och ladda ned körbara kodfiler eller datafiler som koden kan bearbeta.
De inbyggda kodtolkarsessionerna stöder de vanligaste scenarierna för kodkörning utan att behöva hantera infrastruktur eller containrar. Om du behöver fullständig kontroll över kodkörningsmiljön eller har ett annat scenario som kräver isolerade sandbox-miljöer kan du använda anpassade kodtolkarsessioner.
Sessionspool för kodtolkar
Om du vill använda kodtolkarsessioner behöver du en Azure-resurs som kallas en sessionspool som definierar konfigurationen för kodtolkarsessioner. I sessionspoolen kan du ange inställningar som maximalt antal samtidiga sessioner och hur länge en session kan vara inaktiv innan sessionen avslutas.
Du kan skapa en sessionspool med hjälp av mallarna Azure Portal, Azure CLI eller Azure Resource Manager. När du har skapat en sessionspool kan du använda poolens API-slutpunkter för hantering för att hantera och köra kod i en session.
Skapa en sessionspool med Azure CLI
Om du vill skapa en kodtolksessionspool med hjälp av Azure CLI kontrollerar du att du har de senaste versionerna av Azure CLI och Azure Container Apps-tillägget med följande kommandon:
# Upgrade the Azure CLI
az upgrade
# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y
az containerapps sessionpool create
Använd kommandot för att skapa poolen. I följande exempel skapas en Python-kodtolkarsessionspool med namnet my-session-pool
. Ersätt <RESOURCE_GROUP>
med resursgruppens namn innan du kör kommandot.
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
Du kan definiera följande inställningar när du skapar en sessionspool:
Inställning | beskrivning |
---|---|
--container-type |
Vilken typ av kodtolkare som ska användas. Det enda värde som stöds är PythonLTS . |
--max-sessions |
Det maximala antalet tilldelade sessioner som tillåts samtidigt. Maxvärdet är 600 . |
--cooldown-period |
Antalet tillåtna inaktiva sekunder före avslutning. Inaktivitetsperioden återställs varje gång sessionens API anropas. Det tillåtna intervallet är mellan 300 och 3600 . |
--network-status |
Anger om utgående nätverkstrafik tillåts från sessionen. Giltiga värden är EgressDisabled (standard) och EgressEnabled . |
Viktigt!
Om du aktiverar utgående trafik kan kod som körs i sessionen komma åt Internet. Var försiktig när koden inte är betrodd eftersom den kan användas för att utföra skadliga aktiviteter, till exempel överbelastningsattacker.
Hämta API-slutpunkten för poolhantering med Azure CLI
Om du vill använda kodtolkarsessioner med LLM-ramverksintegreringar eller genom att anropa hanterings-API-slutpunkterna direkt behöver du poolens API-slutpunkt för hantering. Slutpunkten är i formatet https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>
.
Använd kommandot för att hämta hanterings-API-slutpunkten för en sessionspool az containerapps sessionpool show
. Ersätt <RESOURCE_GROUP>
med resursgruppens namn innan du kör kommandot.
az containerapp sessionpool show \
--name my-session-pool \
--resource-group <RESOURCE_GROUP> \
--query 'properties.poolManagementEndpoint' -o tsv
Kodkörning i en session
När du har skapat en sessionspool kan ditt program interagera med sessioner i poolen med hjälp av en integrering med ett LLM-ramverk eller med hjälp av poolens hanterings-API-slutpunkter direkt.
Sessionsidentifierare
Viktigt!
Sessionsidentifieraren är känslig information som kräver att du använder en säker process för att hantera dess värde. En del av den här processen kräver att programmet ser till att varje användare eller klient endast har åtkomst till sina egna sessioner. Om du inte kan skydda åtkomsten till sessioner kan det leda till missbruk eller obehörig åtkomst till data som lagras i användarnas sessioner. Mer information finns i Sessionsidentifierare
När du interagerar med sessioner i en pool använder du en sessionsidentifierare för att referera till varje session En sessionsidentifierare är en sträng som du definierar som är unik i sessionspoolen. Om du skapar ett webbprogram kan du använda användarens ID. Om du skapar en chattrobot kan du använda konversations-ID:t.
Om det finns en session som körs med identifieraren återanvänds sessionen. Om det inte finns någon session som körs med identifieraren skapas en ny session automatiskt.
Mer information om sessionsidentifierare finns i Översikt över sessioner.
Autentisering
Autentisering hanteras med hjälp av Microsoft Entra-token (tidigare Azure Active Directory). Giltiga Microsoft Entra-token genereras av en identitet som tillhör Azure ContainerApps sessionskörnings- och deltagarroller i sessionspoolen.
Om du använder en LLM-ramverksintegrering hanterar ramverket tokengenereringen och hanteringen åt dig. Kontrollera att programmet har konfigurerats med en hanterad identitet med nödvändiga rolltilldelningar i sessionspoolen.
Om du använder poolens API-slutpunkter för hantering direkt måste du generera en token och inkludera den Authorization
i rubriken för dina HTTP-begäranden. Utöver de rolltilldelningar som tidigare nämnts måste token innehålla ett målgruppsanspråk (aud
) med värdet https://dynamicsessions.io
.
Mer information finns i Autentisering.
LLM-ramverksintegreringar
I stället för att använda API:et för hantering av sessionspooler direkt tillhandahåller följande LLM-ramverk integreringar med kodtolkarsessioner:
Ramverk | Paket | Självstudie |
---|---|---|
LangChain | Python: langchain-azure-dynamic-sessions |
Handledning |
LlamaIndex | Python: llama-index-tools-azure-code-interpreter |
Handledning |
Semantic Kernel | Python: semantic-kernel (version 0.9.8-b1 eller senare) |
Handledning |
Hanterings-API-slutpunkter
Om du inte använder en LLM-ramverksintegrering kan du interagera med sessionspoolen direkt med hjälp av hanterings-API-slutpunkterna.
Följande slutpunkter är tillgängliga för att hantera sessioner i en pool:
Slutpunktssökväg | Metod | beskrivning |
---|---|---|
code/execute |
POST |
Kör kod i en session. |
files/upload |
POST |
Ladda upp en fil till en session. |
files/content/{filename} |
GET |
Ladda ned en fil från en session. |
files |
GET |
Visa en lista över filerna i en session. |
Skapa den fullständiga URL:en för varje slutpunkt genom att sammanfoga poolens API-slutpunkt för hantering med slutpunktssökvägen. Frågesträngen måste innehålla en identifier
parameter som innehåller sessionsidentifieraren och en api-version
parameter med värdet 2024-02-02-preview
.
Till exempel: https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>
Köra kod i en session
Om du vill köra kod i en session skickar du en POST
begäran till code/execute
slutpunkten med koden som ska köras i begärandetexten. I det här exemplet skrivs "Hello, world!" ut i Python.
Innan du skickar begäran ersätter du platshållarna mellan <>
hakparenteserna med lämpliga värden för sessionspoolen och sessionsidentifieraren.
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!')"
}
}
Om du vill återanvända en session anger du samma sessionsidentifierare i efterföljande begäranden.
Ladda upp en fil till en session
Om du vill ladda upp en fil till en session skickar du en POST
begäran till uploadFile
slutpunkten i en databegäran i flera delar. Inkludera fildata i begärandetexten. Filen måste innehålla ett filnamn.
Uppladdade filer lagras i sessionens filsystem under /mnt/data
katalogen.
Innan du skickar begäran ersätter du platshållarna mellan <>
hakparenteserna med värden som är specifika för din begäran.
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--
Ladda ned en fil från en session
Om du vill ladda ned en fil från en sessions /mnt/data
katalog skickar du en GET
begäran till file/content/{filename}
slutpunkten. Svaret innehåller fildata.
Innan du skickar begäran ersätter du platshållarna mellan <>
hakparenteserna med värden som är specifika för din begäran.
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>
Visa en lista över filerna i en session
Om du vill visa en lista över filerna i en sessions /mnt/data
katalog skickar du en GET
begäran till files
slutpunkten.
Innan du skickar begäran ersätter du platshållarna mellan <>
hakparenteserna med värden som är specifika för din begäran.
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>
Svaret innehåller en lista över filer i sessionen.
I följande lista visas ett exempel på vilken typ av svar du kan förvänta dig av att begära sessionsinnehåll.
{
"$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"
}
}
]
}
Förinstallerade paket
Python-kodtolksessioner innehåller populära Python-paket som NumPy, Pandas och scikit-learn.
Om du vill mata ut listan över förinstallerade paket anropar du code/execute
slutpunkten med följande kod.
Innan du skickar begäran ersätter du platshållarna mellan <>
hakparenteserna med värden som är specifika för din begäran.
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]"
}
}
Loggning
Kodtolkarsessioner stöder inte loggning direkt. Ditt program som interagerar med sessionerna kan logga begäranden till API:et för hantering av sessionspooler och dess svar.
Fakturering
Kodtolkarsessioner faktureras baserat på varaktigheten för varje session. Mer information finns i Fakturering .