Azure Functions para IA: hospedagem, escala, gatilhos, vínculos, segurança e MCP
Voltar para a trilha AI-200
AI-200Capítulo 20

Estudo para a Certificação Microsoft AI-200

Azure Functions para IA: hospedagem, escala, gatilhos, vínculos, segurança e MCP

Projete back-ends de IA sem servidor responsivos com o plano de hospedagem correto, escala independente orientada a eventos, desenvolvimento local, padrões HTTP e de mensagens, configuração segura, identidades gerenciadas e ferramentas MCP.

Tempo de estudo sugerido: 130 minutos • Nível intermediário • Reescrita autoral completa com versão resumida de cada tópico, avaliação comentada e laboratório MCP guiado

Escudo neon Microsoft Certified AI-200 para hospedagem do Azure Functions, gatilhos, identidade e servidor MCP

1. Cenário e objetivos de aprendizagem

Considere uma plataforma inteligente de documentos: uma recebe o arquivo, um serviço de IA extrai o texto, a solução classifica o conteúdo e grava o resultado. Máquinas virtuais dimensionadas para o pico ficam ociosas e ainda exigem correções e gestão de capacidade. O troca essa capacidade fixa por execução orientada a eventos, escala automática e cobrança conforme o plano escolhido.

  • Expor uma entrada de baixa latência.
  • Enviar tarefas longas a um processador acionado por fila.
  • Usar vínculos para movimentar dados e SDKs onde não houver vínculo.
  • Proteger configuração com , e .
  • Expor operações selecionadas como ferramentas MCP.
Uma solicitação HTTP entra no Azure Functions, envia um trabalho à fila e um processador independente grava o resultado de IA
A entrada síncrona e o trabalhador assíncrono escalam separadamente, enquanto a fila absorve picos.

Resumo rápido

O objetivo é um back-end de IA responsivo e seguro que separa a aceitação da solicitação do processamento pesado.

2. Partida a frio e seu impacto ampliado pela IA

A partida a frio acontece quando a plataforma aloca uma instância, inicia o host e o trabalhador da linguagem, carrega o aplicativo e prepara dependências antes da primeira invocação. Ela pode ocorrer em planos que escalam até zero e é paga uma vez por nova instância, não a cada solicitação.

SDKs grandes, bibliotecas de inferência, de modelo, resolução de configuração, e pools de rede aumentam esse tempo. Inicialize clientes reutilizáveis no escopo do módulo, mantenha o pacote enxuto e meça separadamente as latências fria e aquecida.

Resumo rápido

A partida a frio é por instância; dependências pesadas a ampliam e invocações aquecidas reutilizam o processo preparado.

3. Consumo Flexível como padrão sem servidor

O plano de Consumo Flexível é a recomendação baseada em Linux para novos aplicativos de funções sem servidor. Oferece escala por função, integração à rede virtual, instâncias configuráveis de 512 MB, 2.048 MB ou 4.096 MB e até 1.000 instâncias sob demanda. Comece em 2.048 MB, use 4.096 MB para cargas intensivas e 512 MB para processadores leves.

Instâncias sempre prontas mantêm uma função ou grupo de escala aquecido. Elas reduzem a partida a frio, mas criam custo básico; reserve-as para sensíveis à latência. A escala sob demanda continua além desse piso.

Resumo rápido

Use Consumo Flexível para economia orientada a eventos e adicione capacidade sempre pronta somente onde a latência justificar.

4. Premium e demais opções de hospedagem

Decisão de hospedagem
OpçãoMelhor usoContrapartida
Consumo Flexível com picos e gatilhos independentesPartida a frio sem instâncias sempre prontas
PremiumLatência baixa constante, trabalhadores maiores, rede virtual ou imagens Linux personalizadasPelo menos um trabalhador aquecido gera custo básico
DedicadoCapacidade existente ociosa ou carga previsívelA equipe administra capacidade e
GPU, pacotes de SO ou serviços em contêineres próximosRéplicas e contêineres entram na operação
Consumo Linux legadoSomente cargas existentesAposentadoria programada após setembro de 2028; migre para Flexível
Mapa de decisão entre Consumo Flexível, Premium, Dedicado e Aplicativos de Contêiner do Azure
Escolha por latência, formato da carga, computação, rede e operação, e não por um único preço.

Resumo rápido

Premium troca um piso aquecido por inicialização previsível; Dedicado e Aplicativos de Contêiner atendem requisitos especializados.

5. Escala por função, concorrência e memória

No Consumo Flexível, gatilhos escalam como um grupo; blobs acionados pela formam outro; Funções Duráveis compartilham um grupo. A maioria dos demais gatilhos, como , filas e temporizadores, escala de modo independente. Assim, um pico na fila não precisa disputar instâncias com a .

Concorrência menor distribui chamadas de IA caras por mais instâncias e dedica mais recursos a cada invocação; concorrência maior usa menos instâncias, mas aumenta a contenção. Ajuste com testes de carga, cotas dos serviços dependentes, memória e latência ponta a ponta.

Resumo rápido

Grupos definem quais funções compartilham instâncias; concorrência e memória definem quanto trabalho cada instância aceita.

6. Tarefas longas e solicitação-resposta assíncrona

Uma função acionada por dispõe de aproximadamente 230 segundos para responder devido ao , mesmo com functionTimeout maior. Consumo Flexível e Premium permitem execuções não sem máximo configurado, porém ainda existem períodos de cortesia em redução de escala e atualizações.

  1. Validar a solicitação e criar o identificador.
  2. Publicar o trabalho no .
  3. Responder 202 Accepted com uma de status.
  4. Processar a mensagem em outra função.
  5. Persistir status e resultado.
import azure.functions as func
import json, uuid

app = func.FunctionApp()

@app.route(route="documents", methods=["POST"], auth_level=func.AuthLevel.FUNCTION)
@app.service_bus_queue_output(
    arg_name="job", queue_name="document-jobs", connection="ServiceBusConnection")
def accept_document(req: func.HttpRequest, job: func.Out[str]) -> func.HttpResponse:
    payload = req.get_json()
    job_id = str(uuid.uuid4())
    job.set(json.dumps({"jobId": job_id, "url": payload["documentUrl"]}))
    return func.HttpResponse(
        json.dumps({"jobId": job_id, "statusUrl": f"/api/jobs/{job_id}"}),
        status_code=202, mimetype="application/json")

Resumo rápido

A resposta 202 e a fila desacoplam a latência do processamento e permitem escala independente.

7. Ferramentas locais e criação do projeto

O Core Tools v4 fornece o host local em disponibilidade geral e o comando func; o CLI v5 ainda está em . A extensão do para acrescenta modelos, depuração com F5, implantação e sincronização de configurações. Crie pelo Command Palette ou com func init, adicione com func new e execute com func start.

  • Core Tools v4
  • e extensão do
  • Python compatível e ambiente virtual
  • Azurite para armazenamento do host
  • curl ou cliente de arquivos .

Resumo rápido

O host local usa o mesmo modelo de gatilhos e vínculos do e encurta o ciclo de desenvolvimento.

8. Estrutura do projeto Python v2

Arquivos essenciais
ArquivoFinalidade
function_app.pyEntrada por decoradores e registro de blueprints
host., , extensões e concorrência globais
local.settings.Configuração local; nunca versione segredos
requirements.txtDependências Python
.vscode/*Depuração e tarefas compartilhadas
.funcignoreExclusões do pacote de implantação

Mantenha funções sem estado, divida projetos grandes em blueprints e versione a configuração de depuração, mas não local.settings..

Resumo rápido

Código, comportamento global e ambiente ficam separados em arquivos com papéis definidos.

9. AzureWebJobsStorage, Azurite e dependências locais

AzureWebJobsStorage também coordena o host, mantém estado de temporizadores e armazena chaves. Uma configuração inválida pode impedir gatilhos não . Localmente, UseDevelopmentStorage=true aponta o host e os vínculos compatíveis para o Azurite, que implementa de Blobs, Filas e Tabelas.

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "ServiceBusConnection__fullyQualifiedNamespace": "<namespace>.servicebus.windows.net"
  }
}

Use o emulador do quando adequado e contêineres locais de PostgreSQL ou Redis. Antes da liberação, teste os serviços reais e jamais implante UseDevelopmentStorage=true.

Resumo rápido

O Azurite atende à dependência local do host; emuladores aceleram o trabalho, mas não substituem o teste final no .

10. Gatilhos e autorização do

Cada função tem exatamente um gatilho. O gatilho recebe método, cabeçalhos, parâmetros e corpo e devolve HttpResponse. Use anonymous apenas quando o acesso público for intencional, function como barreira básica e admin somente com a chave mestra para operações administrativas.

Chaves não identificam o chamador. Use ou Autenticação do quando precisar de , , cotas, transformações ou limitação de taxa.

Resumo rápido

O nível de autorização define a exigência de chave; identidade real requer uma camada de autenticação apropriada.

11. Gatilhos do , locks e dead-letter

O gatilho de fila do recebe em PeekLock. Sucesso conclui a mensagem; falha a abandona para nova entrega, salvo liquidação manual. maxConcurrentCalls controla chamadas paralelas por instância e maxAutoRenewDuration deve cobrir o processamento esperado.

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "maxConcurrentCalls": 1,
      "maxAutoRenewDuration": "00:10:00",
      "autoCompleteMessages": true
    }
  }
}

Ao ultrapassar maxDeliveryCount, o move a mensagem problemática para a subfila de mensagens mortas com . Monitore-a e reprocesse com intenção. Permissão de leitura administrativa também melhora a precisão da escala baseada em destino.

Resumo rápido

Dimensione concorrência e renovação do lock e trate a fila de mensagens mortas como parte da operação.

12. Vínculos de entrada/saída e clientes

O gatilho também é um vínculo de entrada. Vínculos adicionais leem ou escrevem sem código repetitivo de conexão: de Blobs para arquivos, para resultados estruturados e para fan-out. Use quando não houver vínculo adequado ou for necessária a completa.

@app.service_bus_queue_trigger(
    arg_name="msg", queue_name="document-jobs", connection="ServiceBusConnection")
@app.cosmos_db_output(
    arg_name="result", database_name="ai-results",
    container_name="classifications", connection="CosmosDBConnection")
def classify(msg: func.ServiceBusMessage, result: func.Out[func.Document]) -> None:
    job = json.loads(msg.get_body().decode("utf-8"))
    answer = run_document_pipeline(job["url"])
    result.set(func.Document.from_dict({"id": job["jobId"], **answer}))

Crie credenciais e clientes caros no escopo do módulo para que invocações aquecidas reutilizem pools e .

Resumo rápido

Vínculos reduzem código de infraestrutura; SDKs dão controle total e devem ser reutilizados.

13. Configurações do aplicativo e separação de ambientes

Configurações do aplicativo são criptografadas em repouso e injetadas como variáveis de ambiente. Armazene , modelos, limites e sinalizadores em pares simples. Use os.environ para valores obrigatórios e os.getenv para padrões explícitos.

Separe desenvolvimento, homologação e produção. Administre produção com infraestrutura como código ou CLI controlada; baixar configurações pode expor segredos e enviar valores locais pode interromper a produção.

Resumo rápido

O código permanece neutro quando cada ambiente fornece sua própria configuração.

14. Referências do e rotação

Uma referência do resolve o segredo como configuração, sem alteração no código. Conceda Secrets User. A sem versão acompanha a versão mais recente em até 24 horas de ; a versionada permanece fixa. Uma alteração de configuração ou atualização explícita força nova resolução.

AI_SERVICE_KEY=@Microsoft.KeyVault(
  SecretUri=https://<vault>.vault.azure.net/secrets/AiServiceKey/)

from azure.appconfiguration.provider import load
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
config = load(
    endpoint=os.environ["AZURE_APPCONFIG_ENDPOINT"],
    credential=credential,
    keyvault_credential=credential)

Resumo rápido

Mantenha segredos no , use referências sem versão para rotação e conceda apenas leitura.

15. e recursos

A centraliza valores não secretos e sinalizadores compartilhados. Rótulos selecionam cada ambiente; o provedor Python pode atualizar valores e resolver referências do com DefaultAzureCredential.

Guarde rotas de modelo, limites e sinalizadores na e credenciais no .

Resumo rápido

A centraliza comportamento; o continua sendo a origem dos segredos.

16. e menor privilégio

Conexões por identidade trocam cadeias por um prefixo e . A identidade atribuída pelo sistema é padrão; uma identidade atribuída pelo usuário pode ser compartilhada e preparada antes da implantação. Dois sublinhados formam propriedades estruturadas.

AzureWebJobsStorage__accountName=<storage-account>
ServiceBusConnection__fullyQualifiedNamespace=<namespace>.servicebus.windows.net
CosmosDBConnection__accountEndpoint=https://<account>.documents.azure.com:443/

# SDK client created once and reused on warm invocations
credential = DefaultAzureCredential()
client = DocumentIntelligenceClient(
    endpoint=os.environ["DOCUMENT_INTELLIGENCE_ENDPOINT"],
    credential=credential)
Papéis mínimos representativos
ConexãoPapel
AzureWebJobsStorage do host Blob
Gatilho de blobTambém Queue Data Contributor e Account Contributor
Entrada/saída do Data Receiver / Data Sender
Saída do Cosmos DB Built-in Data Contributor
Referência do Secrets User
Search Index Data Reader / Contributor
Identidade gerenciada conecta Azure Functions ao Barramento de Serviço, Azure Cosmos DB, Cofre de Chaves, Configuração de Aplicativos e IA
e substituem credenciais embutidas; o cobre segredos inevitáveis.

Resumo rápido

A identidade remove credenciais armazenadas, mas cada destino ainda precisa do papel mínimo correto.

17. Chaves de acesso, proteção de e laboratório MCP

Chaves de função valem para uma função, chaves de host alcançam todas, chaves de sistema pertencem a extensões e a chave mestra libera administração. Todas são segredos. acrescenta políticas e ; a Autenticação do pode exigir .

A extensão MCP do expõe gatilhos de ferramenta, recurso e prompt. Prefira Streamable em /runtime//mcp; SSE é compatibilidade. No , o normalmente exige a chave de sistema mcp_extension. Python requer -functions 1.24.0 ou posterior e o teste local exige Core Tools 4.0.7030 ou posterior.

{
  "servers": {
    "local-functions-mcp": {
      "type": "http",
      "url": "http://localhost:7071/runtime/webhooks/mcp"
    },
    "remote-functions-mcp": {
      "type": "http",
      "url": "https://<app>.azurewebsites.net/runtime/webhooks/mcp",
      "headers": { "x-functions-key": "${input:mcp-extension-system-key}" }
    }
  }
}
  1. Criar o projeto e um gatilho MCP Tool.
  2. Confirmar o bundle de extensões 4.x.
  3. Implementar uma ferramenta pequena e segura.
  4. Executar Azurite e func start e conectar o cliente.
  5. Implantar, recuperar a chave mcp_extension com segurança e testar Streamable .

Resumo rápido

Chaves são segredos compartilhados; ferramentas MCP devem ser estreitas e remotos precisam de proteção.

18. Avaliação, checklist e referências

Decisões da avaliação
QuestãoMelhor respostaMotivo
Reduzir partida a frio com baixo custoConsumo Flexível com sempre pronta no grupoAquece apenas a superfície sensível
Gatilho local não disparaValidar AzureWebJobsStorageO host sempre precisa do armazenamento
Uma mensagem por instânciamaxConcurrentCalls = 1Limita do
Rotacionar chave sem nova implantaçãoReferência sem versãoAcompanha a versão mais recente
Autorizar gatilho por identidade Data ReceiverConcede recebimento; acrescente leitura administrativa para escala precisa

Checklist final

  • Meça latência fria e aquecida.
  • Escolha plano e memória por testes.
  • Enfileire o que excede o limite .
  • Ajuste concorrência, lock, repetição e dead-letter.
  • Não versione configuração local.
  • Prefira identidade e menor privilégio.
  • Rotacione segredos por referência sem versão.
  • Monitore falhas, escala, dependências e custo.
  • Restrinja ferramentas MCP.
  1. Escala e hospedagem do
  2. Plano de Consumo Flexível
  3. Desenvolvimento local
  4. Gatilho do
  5. Referências do
  6. Vínculos MCP

Resumo rápido

O cenário reúne hospedagem, escala, ferramentas locais, mensageria, configuração segura, identidade e proteção em um único desenho operacional.