Partilhar via


Sessões de interpretador de código sem servidor em Aplicativos de Contêiner do Azure

As sessões dinâmicas dos Aplicativos de Contêiner do Azure fornecem acesso rápido e escalável a um interpretador de código. Cada sessão do interpretador de código é totalmente isolada por um limite do Hyper-V e foi projetada para executar código não confiável.

Usos para sessões de interpretador de código

As sessões de interpretador de código são ideais para cenários em que você precisa executar código potencialmente mal-intencionado ou que pode causar danos ao sistema host ou a outros usuários, como:

  • Código gerado por um modelo de linguagem grande (LLM).
  • Código enviado por um usuário final em um aplicativo web ou SaaS.

Para estruturas LLM populares, como LangChain, LlamaIndex ou Semantic Kernel, você pode usar ferramentas e plugins para integrar aplicativos de IA com sessões de interpretador de código.

Seus aplicativos também podem se integrar com a sessão do interpretador de código usando uma API REST. A API permite que você execute código em uma sessão e recupere resultados. Também pode carregar e descarregar ficheiros de e para a sessão. Você pode carregar e baixar arquivos de código executáveis ou arquivos de dados que seu código pode processar.

As sessões internas do interpretador de código suportam os cenários de execução de código mais comuns sem a necessidade de gerenciar infraestrutura ou contêineres. Se você precisar de controle total sobre o ambiente de execução de código ou tiver um cenário diferente que exija áreas restritas isoladas, poderá usar sessões personalizadas de interpretador de código.

Pool de sessões do interpretador de código

Para usar sessões de interpretador de código, você precisa de um recurso do Azure chamado pool de sessões que define a configuração para sessões de interpretador de código. No pool de sessões, você pode especificar configurações como o número máximo de sessões simultâneas e por quanto tempo uma sessão pode ficar ociosa antes que a sessão seja encerrada.

Você pode criar um pool de sessões usando o portal do Azure, a CLI do Azure ou os modelos do Azure Resource Manager. Depois de criar um pool de sessões, você pode usar os pontos de extremidade da API de gerenciamento do pool para gerenciar e executar código dentro de uma sessão.

Criar um pool de sessões com a CLI do Azure

Para criar um pool de sessões do interpretador de código usando a CLI do Azure, verifique se você tem as versões mais recentes da CLI do Azure e da extensão Aplicativos de Contêiner do Azure com os seguintes 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 o az containerapps sessionpool create comando para criar o pool. O exemplo a seguir cria um pool de sessões do interpretador de código Python chamado my-session-pool. Certifique-se de substituir <RESOURCE_GROUP> pelo nome do grupo de recursos antes de executar o 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

Você pode definir as seguintes configurações ao criar um pool de sessões:

Definição Descrição
--container-type O tipo de interpretador de código a ser usado. O único valor suportado é PythonLTS.
--max-sessions O número máximo de sessões alocadas permitidas simultaneamente. O valor máximo é 600.
--cooldown-period O número de segundos ociosos permitidos antes da rescisão. O período ocioso é redefinido cada vez que a API da sessão é chamada. O intervalo permitido é entre 300 e 3600.
--network-status Designa se o tráfego de rede de saída é permitido a partir da sessão. Os valores válidos são EgressDisabled (padrão) e EgressEnabled.

Importante

Se você habilitar a saída, o código em execução na sessão poderá acessar a internet. Tenha cuidado quando o código não for confiável, pois ele pode ser usado para executar atividades maliciosas, como ataques de negação de serviço.

Obter o ponto de extremidade da API de gerenciamento de pool com a CLI do Azure

Para usar sessões de interpretador de código com integrações de estrutura LLM ou chamando os pontos de extremidade da API de gerenciamento diretamente, você precisa do ponto de extremidade da API de gerenciamento do pool. O ponto de extremidade está no formato https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>.

Para recuperar o ponto de extremidade da API de gerenciamento para um pool de sessões, use o az containerapps sessionpool show comando. Certifique-se de substituir <RESOURCE_GROUP> pelo nome do grupo de recursos antes de executar o comando.

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

Execução de código em uma sessão

Depois de criar um pool de sessões, seu aplicativo pode interagir com sessões no pool usando uma integração com uma estrutura LLM ou usando diretamente os pontos de extremidade da API de gerenciamento do pool.

Identificadores de sessão

Importante

O identificador de sessão é uma informação confidencial que requer que você use um processo seguro para gerenciar seu valor. Parte desse processo requer que seu aplicativo garanta que cada usuário ou locatário tenha acesso apenas às suas próprias sessões. A falha em proteger o acesso às sessões pode resultar em uso indevido ou acesso não autorizado aos dados armazenados nas sessões dos usuários. Para obter mais informações, consulte Identificadores de sessão

Ao interagir com sessões em um pool, você usa um identificador de sessão para fazer referência a cada sessão Um identificador de sessão é uma cadeia de caracteres que você define que é exclusiva dentro do pool de sessões. Se estiver a criar uma aplicação Web, pode utilizar o ID do utilizador. Se você estiver criando um chatbot, poderá usar o ID da conversa.

Se houver uma sessão em execução com o identificador, a sessão será reutilizada. Se não houver uma sessão em execução com o identificador, uma nova sessão será criada automaticamente.

Para saber mais sobre identificadores de sessão, consulte Visão geral das sessões.

Autenticação

A autenticação é tratada usando tokens do Microsoft Entra (anteriormente Azure Ative Directory). Os tokens válidos do Microsoft Entra são gerados por uma identidade pertencente às funções Executor de Sessão e Colaborador do Azure ContainerApps no pool de sessões.

Se você estiver usando uma integração de estrutura LLM, a estrutura lida com a geração e o gerenciamento de tokens para você. Verifique se o aplicativo está configurado com uma identidade gerenciada com as atribuições de função necessárias no pool de sessões.

Se você estiver usando os pontos de extremidade da API de gerenciamento do pool diretamente, deverá gerar um token e incluí-lo no Authorization cabeçalho de suas solicitações HTTP. Além das atribuições de função mencionadas anteriormente, o token precisa conter uma declaração de audiência (aud) com o valor https://dynamicsessions.io.

Para saber mais, consulte Autenticação.

Integrações de framework LLM

Em vez de usar a API de gerenciamento do pool de sessões diretamente, as seguintes estruturas LLM fornecem integrações com sessões de interpretador de código:

Estrutura Pacote Tutorial
LangChain Python: langchain-azure-dynamic-sessions Tutoriais
LlamaIndex Python: llama-index-tools-azure-code-interpreter Tutoriais
Kernel Semântico Python: semantic-kernel (versão 0.9.8-b1 ou posterior) Tutoriais

Pontos de extremidade da API de gerenciamento

Se você não estiver usando uma integração de estrutura LLM, poderá interagir com o pool de sessões diretamente usando os pontos de extremidade da API de gerenciamento.

Os seguintes pontos de extremidade estão disponíveis para gerenciar sessões em um pool:

Caminho do ponto de extremidade Método Description
code/execute POST Execute código em uma sessão.
files/upload POST Carregue um ficheiro para uma sessão.
files/content/{filename} GET Baixe um arquivo de uma sessão.
files GET Liste os arquivos em uma sessão.

Crie a URL completa para cada ponto de extremidade concatenando o ponto de extremidade da API de gerenciamento do pool com o caminho do ponto de extremidade. A cadeia de caracteres de consulta deve incluir um identifier parâmetro contendo o identificador de sessão e um api-version parâmetro com o valor 2024-02-02-preview.

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

Executar código em uma sessão

Para executar código em uma sessão, envie uma POST solicitação para o code/execute ponto de extremidade com o código a ser executado no corpo da solicitação. Este exemplo imprime "Hello, world!" em Python.

Antes de enviar a solicitação, substitua os espaços reservados entre <> os colchetes pelos valores apropriados para o pool de sessões e o identificador de sessão.

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 uma sessão, especifique o mesmo identificador de sessão em solicitações subsequentes.

Carregar um ficheiro para uma sessão

Para carregar um arquivo para uma sessão, envie uma POST solicitação para o uploadFile ponto de extremidade em uma solicitação de dados de formulário com várias partes. Inclua os dados do arquivo no corpo da solicitação. O arquivo deve incluir um nome de arquivo.

Os arquivos carregados são armazenados no sistema de arquivos da sessão sob o /mnt/data diretório.

Antes de enviar a solicitação, substitua os espaços reservados entre <> colchetes por valores específicos para sua solicitação.

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

Baixar um arquivo de uma sessão

Para baixar um arquivo do diretório de uma sessão /mnt/data , envie uma GET solicitação para o file/content/{filename} ponto de extremidade. A resposta inclui os dados do arquivo.

Antes de enviar a solicitação, substitua os espaços reservados entre <> colchetes por valores específicos para sua solicitação.

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>

Listar os arquivos em uma sessão

Para listar os arquivos no diretório de uma sessão, envie uma GET solicitação para o files ponto de /mnt/data extremidade.

Antes de enviar a solicitação, substitua os espaços reservados entre <> colchetes por valores específicos para sua solicitação.

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>

A resposta contém uma lista de arquivos na sessão.

A listagem a seguir mostra um exemplo do tipo de resposta que você pode esperar da solicitação de conteúdo da sessão.

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

Pacotes pré-instalados

As sessões de interpretador de código Python incluem pacotes Python populares como NumPy, pandas e scikit-learn.

Para gerar a lista de pacotes pré-instalados, chame o code/execute ponto de extremidade com o código a seguir.

Antes de enviar a solicitação, substitua os espaços reservados entre <> colchetes por valores específicos para sua solicitação.

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

Registo

As sessões do interpretador de código não suportam o registro em log diretamente. Seu aplicativo que está interagindo com as sessões pode registrar solicitações na API de gerenciamento do pool de sessões e suas respostas.

Faturação

As sessões do intérprete de código são cobradas com base na duração de cada sessão. Consulte Faturação para obter mais informações.

Próximos passos