Compartilhar via


Hospedar um aplicativo Durable Functions em Aplicativos de Contêiner do Azure (.NET isolado)

O Azure Functions fornece suporte integrado para desenvolver, implantar e gerenciar aplicativos de funções em contêineres nos Aplicativos de Contêiner do Azure. Use os Aplicativos de Contêiner do Azure para seus aplicativos do Functions quando precisar ser executado no mesmo ambiente que outros microsserviços, APIs, sites, fluxos de trabalho ou qualquer programa hospedado em contêiner. Saiba mais sobre como executar o Azure Functions em Aplicativos de Contêiner.

Observação

Embora o Durable Functions dê suporte a vários provedores de armazenamento ou back-ends, os aplicativos de dimensionamento automático hospedados nos Aplicativos de Contêiner do Azure só estão disponíveis com o back-end do MICROSOFT SQL (MSSQL). Se outro back-end for usado, você precisará configurar a contagem mínima de réplicas como maior que zero.

Neste artigo, você aprenderá a:

  • Crie uma imagem do Docker 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 do Durable Functions

No Visual Studio Code, crie um projeto de funções duráveis isolado do .NET configurado para usar o back-end do 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ções 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 de contêiner

Cria a imagem do Docker. Localize a lista completa de imagens base com suporte para o Azure Functions na Base do Azure Functions pela Microsoft | Hub do Docker

  1. Inicie o daemon do Docker.

  2. Entre no Docker com o docker login comando.

  3. Quando solicitado, faça logon com seu nome de usuário e senha. Uma mensagem "Logon 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> pela ID da conta do Hub do Docker:

    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 por push para o Docker:

    docker push $dockerId/$imageName:$imageVersion
    

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

Criar recursos do Azure

Crie os recursos do Azure necessários para executar o Durable Functions 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ções para armazenar dados relacionados ao aplicativo, como o código do aplicativo.

Configuração inicial

  1. Em um novo terminal, faça logon em sua assinatura 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 em escala zero e pagamento conforme o 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 do 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 a URL do aplicativo, que deve ser semelhante a https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io.

Criar bancos de dados

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

    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 manter 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 do banco de dados (em Configurações adicionais) como Latin1_General_100_BIN2_UTF8.

Observação

Evite habilitar a configuração Permitir que os serviços e recursos do Azure acessem este 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 a autenticação baseada em identidade

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

Nesta seção, você configurará 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 gerenciada.

    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 de RBAC (controle de acesso baseado em função).

    scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"
    
  5. Obtenha a clientId da identidade do 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 ter acesso à 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 as definições da aplicação

Observação

Não há suporte para autenticação no banco de dados MSSQL usando a identidade gerenciada ao hospedar um aplicativo durable functions nos Aplicativos de Contêiner do Azure. Por enquanto, este guia realiza 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 de criação do banco de dados anterior, poderá redefini-la no recurso do SQL Server.

    Captura de tela mostrando o botão redefinir senha.

  2. Armazene a cadeia de conexão do banco de dados SQL como um segredo chamado sqldbconnection no aplicativo de 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
    

Testar localmente

  1. Use uma ferramenta de teste HTTP para enviar uma solicitação POST para o ponto de extremidade de gatilho HTTP, que deve ser 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 do Durable Functions foi iniciada com êxito. Embora a resposta inclua algumas URLs úteis, ela ainda não exibe o resultado final da orquestração.

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

    A solicitação consulta a instância de orquestração do status. Você deverá ver que a instância foi concluída 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óximas etapas

Saiba mais sobre: