Partilhar via


Hospedar um aplicativo de Funções Duráveis em Aplicativos de Contêiner do Azure (.NET isolado)

O Azure Functions fornece suporte integrado para desenvolver, implantar e gerenciar Aplicativos de Função em contêineres em Aplicativos de Contêiner do Azure. Use os Aplicativos de Contêiner do Azure para seus aplicativos do Functions quando precisar executar no mesmo ambiente que outros microsserviços, APIs, sites, fluxos de trabalho ou quaisquer programas hospedados em contêiner. Saiba mais sobre como executar o Azure Functions em Aplicativos de Contêiner.

Observação

Embora o Durable Functions ofereça suporte a vários provedores de armazenamento ou back-ends, o dimensionamento automático de aplicativos hospedados em Aplicativos de Contêiner do Azure só está disponível com o back-end do Microsoft SQL (MSSQL). Se outro back-end for usado, será necessário definir a contagem mínima de réplicas como maior que zero.

Neste artigo, você aprenderá a:

  • Crie uma imagem do Docker a partir de um projeto local do Durable Functions.
  • Crie um Aplicativo de Contêiner do Azure e recursos relacionados.
  • Implante a imagem no Aplicativo de Contêiner do Azure e configure a autenticação.

Pré-requisitos

Criar um projeto local de Funções Duráveis

No Visual Studio Code, crie um projeto de funções duráveis isolado do .NET configurado para usar o back-end MSSQL.

Teste o aplicativo localmente e retorne a este artigo.

Crie um Dockerfile na raiz do projeto que descreva o ambiente mínimo necessário para executar o aplicativo de função em um contêiner.

  1. No diretório raiz do projeto, crie um novo arquivo chamado Dockerfile.

  2. Copie/cole o seguinte conteúdo no Dockerfile.

    FROM mcr.microsoft.com/dotnet/sdk:8.0 AS installer-env
    
    COPY . /src/dotnet-function-app
    RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot
    
    # To enable ssh & remote debugging on app service change the base image to the one below
    # FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice
    FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0
    ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
        AzureFunctionsJobHost__Logging__Console__IsEnabled=true
    
    COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]
    
  3. Salve o arquivo.

  4. Adicione um arquivo .dockerignore com o seguinte conteúdo:

    local.settings.json
    
  5. Salve o arquivo .dockerignore .

Criar a imagem do contentor

Crie a imagem do Docker. Encontre a lista completa de imagens base suportadas para o Azure Functions na Base de Funções do Azure da Microsoft | Hub do Docker

  1. Inicie o daemon do Docker.

  2. Faça login no Docker com o docker login comando.

  3. Quando solicitado, inicie sessão com o seu nome de utilizador e palavra-passe. Uma mensagem "Login bem-sucedido" confirma que você está conectado.

  4. Navegue até o diretório raiz do projeto.

  5. Execute o seguinte comando para criar a imagem, substituindo <DOCKER_ID> pelo ID da conta do Docker Hub:

    dockerId=<DOCKER_ID>
    imageName=IMAGE_NAME>
    imageVersion=v1.0.0
    
    docker build --tag $dockerId/$imageName:$imageVersion .
    

    Observação

    Se você estiver executando em um Mac da série M, use --platform linux/amd64 em vez disso.

  6. Envie a imagem para o Docker:

    docker push $dockerId/$imageName:$imageVersion
    

    Dependendo da velocidade da rede, o envio inicial da imagem pode levar alguns minutos. Enquanto espera, prossiga para a próxima seção.

Criar recursos do Azure

Crie os recursos do Azure necessários para executar Funções Duráveis em um aplicativo de contêiner.

  • Grupo de recursos do Azure: Grupo de recursos que contém todos os recursos criados.
  • Ambiente do Aplicativo de Contêiner do Azure: Ambiente que hospeda o aplicativo de contêiner.
  • Aplicativo de contêiner do Azure: A imagem que contém o aplicativo Durable Functions é implantada neste aplicativo.
  • Conta de Armazenamento do Azure: Exigido pelo aplicativo de função para armazenar dados relacionados ao aplicativo, como o código do aplicativo.

Configuração inicial

  1. Num novo terminal, inicie sessão na sua subscrição do Azure:

    az login  
    
    az account set -s <subscription_name>
    
  2. Execute os comandos necessários para configurar a extensão da CLI dos Aplicativos de Contêiner do Azure:

    az upgrade
    
    az extension add --name containerapp --upgrade
    
    az provider register --namespace Microsoft.App
    
    az provider register --namespace Microsoft.OperationalInsights
    

Um perfil de carga de trabalho determina a quantidade de recursos de computação e memória disponíveis para os aplicativos de contêiner implantados em um ambiente. Crie um perfil de carga de trabalho de consumo para suporte de escala até zero e pagamento por uso.

  1. Defina as variáveis de ambiente.

    location=<REGION>
    resourceGroup=<RESOURCE_GROUP_NAME>
    storage=<STORAGE_NAME>
    containerAppEnv=<CONTAINER_APP_ENVIRONMNET_NAME>
    functionApp=<APP_NAME>
    vnet=<VNET_NAME>
    
  2. Crie um grupo de recursos.

    az group create --name $resourceGroup --location $location
    
  3. Crie o ambiente do aplicativo de contêiner.

    az containerapp env create \
      --enable-workload-profiles \
      --resource-group $resourceGroup \
      --name $containerAppEnv \
      --location $location \
    
  4. Crie um aplicativo de contêiner com base na imagem Durable Functions.

    az containerapp create --resource-group $resourceGroup \
    --name $functionApp \
    --environment $containerAppEnv \
    --image $dockerId/$imageName:$imageVersion \
    --ingress external \
    --kind functionapp \
    --query properties.outputs.fqdn
    
  5. Anote o URL do aplicativo, que deve ser semelhante ao https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io.

Criar bases de dados

  1. Crie uma conta de Armazenamento do Azure, que é exigida pelo aplicativo de função.

    az storage account create --name $storage --location $location --resource-group $resourceGroup --sku Standard_LRS
    
  2. No portal do Azure, crie um banco de dados SQL do Azure para persistir as informações de estado. Durante a criação:

    • Habilitar os serviços e recursos do Azure para acessar este servidor (em Rede)
    • Defina o valor para Agrupamento de banco de dados (em Configurações adicionais) como Latin1_General_100_BIN2_UTF8.

Observação

Abster-se de habilitar a configuração Permitir que os serviços e recursos do Azure acessem esse servidor para cenários de produção. Os aplicativos de produção devem implementar abordagens mais seguras, como restrições de firewall mais fortes ou configurações de rede virtual.

Configurar autenticação baseada em identidade

As identidades gerenciadas tornam seu aplicativo mais seguro, eliminando segredos de seu aplicativo, como credenciais nas cadeias de conexão. Embora você possa escolher entre identidade gerenciada atribuída ao sistema e atribuída pelo usuário, a identidade gerenciada atribuída pelo usuário é recomendada, pois não está vinculada ao ciclo de vida do aplicativo.

Nesta seção, você configura a identidade gerenciada atribuída pelo usuário para o Armazenamento do Azure.

  1. Defina as variáveis de ambiente.

    subscription=<SUBSCRIPTION_ID>
    identity=<IDENTITY_NAME>
    
  2. Crie um recurso de identidade gerenciado.

    echo "Creating $identity"
    az identity create -g $resourceGroup -n $identity --location "$location"
    
  3. Atribua a identidade do usuário ao aplicativo de contêiner.

    echo "Assigning $identity to app"
    az containerapp identity assign --resource-group $resourceGroup --name $functionApp --user-assigned $identity
    
  4. Defina o escopo das permissões RBAC (controle de acesso baseado em função).

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Obtenha a identidade do clientId usuário.

    # Get the identity's ClientId 
    clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)
    
  6. Atribua a função Proprietário de Dados do Blob de Armazenamento para acessar a conta de armazenamento.

    echo "Assign Storage Blob Data Owner role to identity"
    az role assignment create --assignee "$clientId" --role "Storage Blob Data Owner" --scope "$scope"
    

Configurar definições da aplicação

Observação

Não há suporte para autenticação no banco de dados MSSQL usando identidade gerenciada ao hospedar um aplicativo Durable Functions em Aplicativos de Contêiner do Azure. Por enquanto, este guia faz a autenticação usando cadeias de conexão.

  1. No recurso do banco de dados SQL no portal do Azure, navegue até Configurações>Cadeias de conexão para localizar a cadeia de conexão.

    Captura de tela mostrando a cadeia de conexão do banco de dados.

    A cadeia de conexão deve ter um formato semelhante a:

    dbserver=<SQL_SERVER_NAME>
    sqlDB=<SQL_DB_NAME>
    username=<DB_USER_LOGIN>
    password=<DB_USER_PASSWORD>
    
    connStr="Server=tcp:$dbserver.database.windows.net,1433;Initial Catalog=$sqlDB;Persist Security Info=False;User ID=$username;Password=$password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
    

    Se você esquecer a senha da etapa anterior de criação do banco de dados, poderá redefini-la no recurso do SQL Server.

    Captura de ecrã a mostrar o botão de redefinição de palavra-passe.

  2. Armazene a cadeia de conexão do banco de dados SQL como um segredo chamado sqldbconnection no aplicativo contêiner.

    az containerapp secret set \
    --resource-group $resourceGroup \
    --name $functionApp \
    --secrets sqldbconnection=$connStr
    
  3. Adicione as seguintes configurações ao aplicativo:

    az containerapp update \
    -n $functionApp \
    -g $resourceGroup \
    --set-env-vars SQLDB_Connection=secretref:sqldbconnection \
    AzureWebJobsStorage__accountName=$storage \
    AzureWebJobsStorage__clientId=$clientId \
    AzureWebJobsStorage__credential=managedidentity \
    FUNCTIONS_WORKER_RUNTIME=dotnet-isolated
    

Teste localmente

  1. Utilize uma ferramenta de teste HTTP para enviar uma solicitação para o endpoint de gatilho HTTP POST, que deve ser algo semelhante a:

    https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStart
    

    A resposta é o resultado inicial da função HTTP, informando que a orquestração de Funções Duráveis foi iniciada com êxito. Embora a resposta inclua alguns URLs úteis, ela ainda não exibe o resultado final da orquestração.

  2. Copie/cole o valor do URL na barra de endereço do seu navegador statusQueryGetUri e pressione Enter. Como alternativa, você pode continuar a usar a ferramenta de teste HTTP para emitir a GET solicitação.

    A solicitação consulta a instância de orquestração para obter o status. Você deve ver que a instância terminou e as saídas ou resultados do aplicativo Durable Functions.

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

Próximos passos

Saiba mais sobre: