Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
- O Visual Studio Code instalado.
- SDK DO .NET 8.0.
- Docker e ID do Docker
- CLI do Azureversão 2.47 ou posterior.
- Ferramentas principais do Azure Functions
- Conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- Uma ferramenta de teste para HTTP que mantém seus dados seguros. Para obter mais informações, confira Ferramentas de teste HTTP.
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.
Adicionar arquivos relacionados ao Docker
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.
No diretório raiz do projeto, crie um novo arquivo chamado Dockerfile.
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"]Salve o arquivo.
Adicione um arquivo .dockerignore com o seguinte conteúdo:
local.settings.jsonSalve 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
Inicie o daemon do Docker.
Entre no Docker com o
docker logincomando.Quando solicitado, faça logon com seu nome de usuário e senha. Uma mensagem "Logon bem-sucedido" confirma que você está conectado.
Navegue até o diretório raiz do projeto.
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/amd64em vez disso.Envie a imagem por push para o Docker:
docker push $dockerId/$imageName:$imageVersionDependendo 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
Em um novo terminal, faça logon em sua assinatura do Azure:
az login az account set -s <subscription_name>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
Criar aplicativo de contêiner e recursos relacionados
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.
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>Crie um grupo de recursos.
az group create --name $resourceGroup --location $locationCrie o ambiente do aplicativo de contêiner.
az containerapp env create \ --enable-workload-profiles \ --resource-group $resourceGroup \ --name $containerAppEnv \ --location $location \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.fqdnAnote a URL do aplicativo, que deve ser semelhante a
https://<APP_NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io.
Criar bancos de dados
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_LRSNo 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.
Defina as variáveis de ambiente.
subscription=<SUBSCRIPTION_ID> identity=<IDENTITY_NAME>Crie um recurso de identidade gerenciada.
echo "Creating $identity" az identity create -g $resourceGroup -n $identity --location "$location"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 $identityDefina o escopo das permissões de RBAC (controle de acesso baseado em função).
scope="/subscriptions/$subscription/resourceGroups/$resourceGroup/providers/Microsoft.Storage/storageAccounts/$storage"Obtenha a
clientIdda identidade do usuário.# Get the identity's ClientId clientId=$(az identity show --name $identity --resource-group $resourceGroup --query 'clientId' --output tsv)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.
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.
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.
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=$connStrAdicione 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
Use uma ferramenta de teste HTTP para enviar uma solicitação
POSTpara o ponto de extremidade de gatilho HTTP, que deve ser semelhante a:https://<APP NAME>.<ENVIRONMENT_IDENTIFIER>.<REGION>.azurecontainerapps.io/api/DurableFunctionsOrchestrationCSharp1_HttpStartA 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.
Copie/cole o valor da URL para
statusQueryGetUrina 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çãoGET.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:
- Hospedagem dos Aplicativos de Contêiner do Azure do Azure Functions.
- Arquitetura, configuração e comportamento da carga de trabalho do provedor de armazenamento MSSQL.
- O back-end de armazenamento gerenciado pelo Azure, Agendador de Tarefas Duráveis.