Trabalhar com contêineres e o Azure Functions

Este artigo demonstra o suporte que o Azure Functions oferece para trabalhar com os aplicativos de função nos contêineres executados em um ambiente do Aplicativos de Contêiner do Azure. O suporte para hospedar os aplicativos de funções nos Aplicativos de Contêiner do Azure está atualmente em versão prévia. Para obter mais informações, consulte Aplicativos de Contêiner do Azure que hospedam o Azure Functions.

Este artigo demonstra o suporte que o Azure Functions fornece para trabalhar com aplicativos de funções em execução em contêineres do Linux.

Escolha o ambiente de hospedagem para seu aplicativo de funções em contêineres na parte superior do artigo.

Se você quiser entrar diretamente, o artigo a seguir mostra como criar sua primeira função em execução em um contêiner do Linux e implantar a imagem de um registro de contêiner em um serviço de hospedagem do Azure com suporte:

Criando aplicativos de funções em contêineres

O Functions facilita a implantação e a execução de seus aplicativos de funções como contêineres do Linux, que você cria e mantém. O Functions mantém um conjunto de imagens base específicas da linguagem que você pode usar ao criar aplicativos de funções em contêineres.

Importante

Ao criar seus próprios contêineres, será necessário manter a imagem base do contêiner atualizada para a imagem base com suporte mais recente. As imagens base com suporte para o Azure Functions são específicas a uma linguagem e encontradas nos repositórios de imagem base do Azure Functions.

A equipe do Functions está comprometida em publicar atualizações mensais para essas imagens base. As atualizações regularem incluem as atualizações de versão secundária mais recentes e as correções de segurança para linguagens e runtime do Functions. Você deve atualizar regularmente o contêiner a partir da imagem base mais recente e reimplantar a versão atualizada do contêiner.

Para obter um exemplo completo de como criar o aplicativo de funções em contêineres local a partir da linha de comando e publicar a imagem em um registro de contêiner, consulte Criar um aplicativo de funções em um contêiner local.

Gerar o Dockerfile

As ferramentas do Functions fornecem uma opção do Docker que gera um Dockerfile com seu projeto de código de funções. Você pode usar esse arquivo com o Docker para criar suas funções em um contêiner que deriva da imagem base correta (linguagem e versão).

A maneira como você cria um Dockerfile depende de como você cria seu projeto.

  • Ao criar um projeto do Functions usando o Azure Functions Core Tools, inclua a opção --docker ao executar o comando func init, como no exemplo a seguir:

    func init --docker
    
  • Você também pode adicionar um Dockerfile a um projeto existente usando a opção --docker-only ao executar o comando func init em uma pasta de projeto existente, como no exemplo a seguir:

    func init --docker-only
    

Para obter um exemplo completo, consulte Criar um aplicativo de funções em um contêiner local.

Criando seu aplicativo de funções em um contêiner

Com um Dockerfile gerado pelo Core Tools em seu projeto de código, você pode usar o Docker para criar o aplicativo de funções em contêineres no computador local. O comando docker build a seguir cria uma imagem de suas funções em contêineres a partir do projeto no diretório local:

docker build --tag <DOCKER_ID>/<IMAGE_NAME>:v1.0.0 .

Para obter um exemplo de como criar o contêiner, consulte Criar a imagem de contêiner e verificar localmente.

Atualizar uma imagem no Registro

Ao fazer alterações no projeto de código de funções ou precisar atualizar a imagem base mais recente, será necessário recompilar o contêiner localmente e republicar a imagem atualizada no registro de contêiner escolhido. O comando a seguir recompila a imagem a partir da pasta raiz com um número de versão atualizado e o envia por push para o registro:

az acr build --registry <REGISTRY_NAME> --image <LOGIN_SERVER>/azurefunctionsimage:v1.0.1 .

Substitua <REGISTRY_NAME> pela instância do Registro de Contêiner e <LOGIN_SERVER> pelo nome do servidor de logon.

Neste ponto, você precisa atualizar a implantação para usar a nova imagem. O exemplo a seguir atualiza o aplicativo de funções para usar a nova imagem:

az functionapp config container set --image <IMAGE_NAME> --registry-password <SECURE_PASSWORD>--registry-username <USER_NAME> --name <APP_NAME> --resource-group <RESOURCE_GROUP>

Neste exemplo, <IMAGE_NAME> é o nome completo da nova imagem com a versão. Os registros privados exigem que você forneça um nome de usuário e uma senha. Armazene essas credenciais com segurança.

Você também deve considerar habilitar a implantação contínua.

Criar usando contêineres no portal do Azure

Ao criar um aplicativo de funções no Portal do Azure, você pode optar por implantar o aplicativo de funções de uma imagem em um registro de contêiner. Para saber como criar um aplicativo de funções em contêiner em um registro de contêiner, veja Criando seu aplicativo de funções em um contêiner.

As etapas a seguir criam e implantam um aplicativo de funções em contêiner existente de um registro de contêiner.

  1. No menu do portal do Azure ou na Página inicial, selecione Criar um recurso.

  2. Na página Novo, selecione Computação>Aplicativo de Funções.

  3. Na página Informações básicas, use as configurações do aplicativo de funções conforme especificado na seguinte tabela:

    Configuração Valor sugerido Descrição
    Assinatura Sua assinatura A assinatura com a qual você cria seu aplicativo de funções.
    Grupo de Recursos myResourceGroup Nome do novo grupo de recursos no qual você cria o aplicativo de funções. Você deve criar um grupo de recursos porque há limitações conhecidas ao criar novos aplicativos de funções em um grupo de recursos existente.
    Nome do aplicativo de funções Nome exclusivo* Nome que identifica seu novo aplicativo de funções. Os caracteres válidos são a-z (não diferencia maiúsculas de minúsculas), 0-9 e -.
    Deseja implantar o código ou a imagem de contêiner? Imagem de contêiner Implantar um aplicativo de funções em contêineres a partir de um registro. Para criar um aplicativo de funções no registro, consulte Criar um aplicativo de funções em um contêiner local.
    Região Região preferencial Selecione uma região perto de você ou perto de outros serviços que suas funções podem acessar.

*O nome do aplicativo deve ser globalmente exclusivo entre todos os aplicativos hospedados no Azure Functions.

  1. Em Opções e planos de hospedagem, escolha Functions Premium.

    Screenshot of the Basics tab in the Azure portal when creating a function app for hosting a container in a Functions Premium plan.

    Isso cria um aplicativo de funções hospedado pelo Azure Functions no plano Premium, que dá suporte à escala dinâmica. Você também pode optar por executar um plano do Serviço de Aplicativo, mas nesse tipo de plano dedicado é necessário gerenciar a escala do seu aplicativo de funções.

*O nome do aplicativo deve ser exclusivo no ambiente dos Aplicativos de Contêiner do Azure. Nem todas as regiões têm suporte na versão prévia. Para obter mais informações, consulte Considerações sobre a hospedagem dos Aplicativos de Contêiner.

  1. Em Opções e planos de hospedagem, escolha Plano de Ambiente dos Aplicativos de Contêiner do Azure.

    Portal create Basics tab for a containerized function app hosted in Azure Container Apps.

    Isso cria um novo recurso de Ambiente de Aplicativos de Contêiner do Azure para hospedar o contêiner do aplicativo de funções. Para obter mais informações, consulte Aplicativos de Contêiner do Azure que hospedam o Azure Functions.

    Por padrão, o ambiente é criado em um plano de Consumo sem redundância de zona, para minimizar os custos. Você também pode escolher um ambiente de Aplicativos de Contêiner existente. Para saber mais sobre ambientes, consulte Ambientes dos Aplicativos de Contêiner do Azure.

  1. Aceite as opções padrão de criação de uma nova conta de armazenamento na guia Armazenamento e uma nova instância do Application Insights na guia Monitoramento. Você também pode optar por usar uma conta de armazenamento existente ou uma instância do Application Insights.
  1. Selecione a guia Implantação e desmarque Usar imagem de início rápido. Se você não fizer isso, o aplicativo de funções será implantado a partir da imagem base para a linguagem do aplicativo de funções.

  2. Escolha seu Tipo de imagem, público ou privado. Escolha Privado se estiver usando o Registro de Contêiner do Azure ou algum outro registro privado. Forneça o nome da Imagem, incluindo o prefixo do registro. Se você estiver usando um registro privado, forneça as credenciais de autenticação do registro de imagem.

  3. Selecione Examinar + criar para examinar as seleções de configuração do aplicativo.

  4. Na página Examinar + criar, examine suas configurações e selecione Criar para provisionar o aplicativo de funções e implantar sua imagem de contêiner no registro.

  1. Selecione Examinar + criar para examinar as seleções de configuração do aplicativo.

  2. Na página Examinar + criar, examine as configurações e, em seguida, selecione Criar para provisionar o aplicativo de funções usando uma imagem base padrão.

  3. Depois que o recurso do aplicativo de funções for criado, selecione Ir para o recurso e, na página do aplicativo de funções, selecione Centro de Implantação.

  4. No Centro de Implantação, você pode conectar o registro de contêiner como a origem da imagem. Você também pode habilitar o GitHub Actions ou o Azure Pipelines para uma implantação contínua mais robusta de atualizações para seu contêiner no registro.

Trabalhar com imagens no Azure Functions

Quando o contêiner do aplicativo de funções é implantado de um registro, o Functions mantém informações sobre a imagem de origem. Use os comandos a seguir para obter dados sobre a imagem ou alterar a imagem de implantação usada:

Perfis de carga de trabalho dos Aplicativos de Contêiner

Os perfis de carga de trabalho são um recurso dos Aplicativos de Contêiner que permitem controlar melhor os recursos de implantação. O Azure Functions nos Aplicativos de Contêiner do Azure também dá suporte a perfis de carga de trabalho. Para obter mais informações, confira Perfis de carga de trabalho nos Aplicativos de Contêiner do Azure.

Você pode criar e gerenciar perfis de carga de trabalho usando a CLI do Azure ou no portal do Azure.

Você habilita perfis de carga de trabalho ao criar o ambiente de aplicativo de contêiner. Para obter um exemplo, consulte Criar um aplicativo de contêiner em um perfil.

Você pode adicionar, editar e excluir perfis em seu ambiente. Para obter um exemplo, consulte Adicionar perfis.

Ao criar um aplicativo de funções em contêineres em um ambiente com perfis de carga de trabalho habilitados, especifique o perfil no qual executar. Faça isso usando o parâmetro --workload-profile-name do comando az functionapp create, como neste exemplo:

az functionapp create --name <APP_NAME> --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --resource-group AzureFunctionsContainers-rg --functions-version 4 --runtime <LANGUAGE_STACK> --image <IMAGE_URI>  --workload-profile-name  PROFILE_NAME> --cpu <CPU_COUNT> --memory <MEMORY_SIZE> 

No comando az functionapp create, o parâmetro --environment especifica o ambiente de Aplicativos de Contêiner e o parâmetro --image especifica a imagem a ser usada para o aplicativo de funções. Neste exemplo, substitua <STORAGE_NAME> pelo nome usado na seção anterior para a conta de armazenamento. Além disso, substitua <APP_NAME> pelo nome globalmente exclusivo apropriado para você.

Além disso, substitua <CPU_COUNT> pelo número desejado de CPUs virtuais, com um mínimo de 0,5 até o máximo permitido pelo perfil. Para <MEMORY_SIZE>, escolha uma quantidade de memória dedicada de 1 GB até o máximo permitido pelo perfil.

Configurações do aplicativo

O Azure Functions permite que você trabalhe com as configurações de aplicativo para aplicativos de funções em contêineres da maneira padrão. Para obter mais informações, confira Usar as configurações de aplicativo.

Habilitar a implantação contínua no Azure

Importante

No momento, não há suporte para implantação baseada em webhook ao executar seu contêiner em um plano Elastic Premium. Se você precisar usar o método de implantação contínua descrito nesta seção, em vez disso, implante seu contêiner em um plano do Serviço de Aplicativo. Ao executar em um plano Elastic Premium, você precisa reiniciar manualmente seu aplicativo sempre que fizer atualizações no contêiner no repositório.

Você pode habilitar o Azure Functions para atualizar automaticamente sua implantação de uma imagem sempre que você atualizar a imagem no Registro.

  1. Use o seguinte comando para habilitar a implantação contínua e obter a URL do webhook:

    az functionapp deployment container config --enable-cd --query CI_CD_URL --output tsv --name <APP_NAME> --resource-group AzureFunctionsContainers-rg
    

    O comando az functionapp deployment container config permite a implantação contínua e retorna a URL do webhook de implantação. Você pode recuperar essa URL a qualquer momento usando o comando az functionapp deployment container show-cd-url.

    Como feito anteriormente, substitua <APP_NAME> pelo nome do aplicativo de funções.

  2. Copie a URL do webhook de implantação para a área de transferência.

  3. Abra o Docker Hub, entre e selecione Repositórios na barra de navegação. Localize e selecione a imagem, selecione a guia Webhooks, especifique um Nome do webhook, cole a URL em URL do Webhook e, em seguida, selecione Criar.

    Screenshot showing how to add the webhook in your Docker Hub window.

  4. Com o webhook definido, o Azure Functions reimplanta sua imagem sempre que você a atualiza no Docker Hub.

Habilitar conexões SSH

O SSH permite a comunicação segura entre um contêiner e um cliente. Com o SSH habilitado, você pode se conectar ao contêiner usando as Ferramentas Avançadas do Serviço de Aplicativo (Kudu). Para facilitar a conexão com o contêiner usando SSH, o Azure Functions fornece uma imagem base que já tem o SSH habilitado. Você só precisa editar o Dockerfile e, em seguida, recompilar e reimplantar a imagem. Em seguida, você pode se conectar ao contêiner usando as Ferramentas Avançadas (Kudu).

  1. No Dockerfile, acrescente a cadeia de caracteres -appservice à imagem base na instrução FROM, como no exemplo a seguir:

    FROM mcr.microsoft.com/azure-functions/node:4-node18-appservice
    

    Este exemplo usa a versão habilitada para SSH da imagem base do Node.js versão 18. Acesse os repositórios de imagem base do Azure Functions para verificar se você está usando a versão mais recente da imagem base habilitada para SSH.

  2. Recompile a imagem usando o comando docker build e substitua <DOCKER_ID> pela ID da conta do Docker Hub, como no exemplo a seguir.

    docker build --tag <DOCKER_ID>/azurefunctionsimage:v1.0.0 .
    
  3. Envie por push a imagem atualizada para o Docker Hub, o que deve levar bem menos tempo do que o primeiro push. Somente os segmentos atualizados da imagem precisam ser carregados agora.

    docker push <DOCKER_ID>/azurefunctionsimage:v1.0.0
    
  4. O Azure Functions reimplanta automaticamente a imagem em seu aplicativo de funções. O processo leva menos de um minuto.

  5. Em um navegador, abra https://<app_name>.scm.azurewebsites.net/ e substitua <app_name> pelo seu nome exclusivo. Essa URL é o ponto de extremidade das Ferramentas Avançadas (Kudu) para seu contêiner do aplicativo de funções.

  6. Entre em sua conta do Azure e selecione SSH para estabelecer uma conexão com o contêiner. A conexão poderá levar algum tempo se o Azure ainda estiver atualizando a imagem de contêiner.

  7. Depois que a conexão com o contêiner for estabelecida, execute o comando top para exibir os processos em execução.

    Screenshot that shows Linux top command running in an SSH session.

Próximas etapas

Os artigos a seguir fornecem mais informações sobre como implantar e gerenciar contêineres: