Implantação de aplicações .NET no Azure: guia completo
Aprenda a implantar de forma eficiente suas aplicações .NET na plataforma de nuvem Azure com este guia passo a passo que cobre App Service, Functions, Containers e DevOps.
InSkillCoach
Implantação de aplicações .NET no Azure: guia completo
Introdução
O Microsoft Azure oferece um ecossistema rico e de alto desempenho para hospedar suas aplicações .NET. Graças à integração nativa entre .NET e Azure, você pode implantar suas aplicações com facilidade e aproveitar escalabilidade automática, alta disponibilidade e segurança reforçada. Este guia apresenta as diferentes opções de implantação e as melhores práticas para otimizar suas aplicações .NET na nuvem.
Pré-requisitos
Antes de começar, certifique-se de ter:
- Uma conta Azure (você pode criar uma conta gratuita em azure.microsoft.com)
- O SDK do .NET instalado na sua máquina de desenvolvimento
- Azure CLI ou Azure PowerShell instalado (opcional, mas recomendado)
- Visual Studio 2022 ou Visual Studio Code com a extensão do Azure
- Git para controle de versão
Azure App Service para aplicações web .NET
O Azure App Service é a solução PaaS (Platform as a Service) ideal para hospedar suas aplicações web ASP.NET e ASP.NET Core.
Criação de um App Service pelo portal do Azure
- Faça login no Portal do Azure
- Clique em “Criar um recurso” > “Web” > “App Service”
- Preencha as informações básicas:
- Grupo de recursos: crie um novo ou use um existente
- Nome do aplicativo: deve ser único em todo o Azure
- Publicar: selecione “Código”
- Pilha de runtime: escolha ”.NET 6” (ou a versão que você utiliza)
- Sistema operacional: Windows ou Linux
- Região: escolha a mais próxima dos seus usuários
- Plano do App Service: selecione um plano existente ou crie um novo
- Clique em “Revisar + criar” e depois em “Criar”
Implantação pelo Visual Studio
- Abra sua solução no Visual Studio
- Clique com o botão direito no projeto web e selecione “Publicar”
- Escolha “Azure” como destino
- Selecione “Azure App Service” e depois a instância que você acabou de criar
- Configure os parâmetros de implantação e clique em “Publicar”
Implantação via Azure DevOps
# azure-pipelines.yml
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
buildConfiguration: 'Release'
webAppName: 'votre-app-service'
steps:
- task: UseDotNet@2
inputs:
packageType: 'sdk'
version: '6.x'
- script: dotnet build --configuration $(buildConfiguration)
displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
zipAfterPublish: true
- task: AzureWebApp@1
inputs:
azureSubscription: 'votre-connexion-azure'
appName: '$(webAppName)'
package: '$(Build.ArtifactStagingDirectory)/*.zip'
Configuração do ambiente
Use as configurações do aplicativo para configurar sua aplicação sem recompilação:
- No portal do Azure, acesse seu App Service
- Em “Configuração” > “Configurações do aplicativo”, adicione suas variáveis de ambiente
- Por exemplo, para uma cadeia de conexão com um banco de dados:
- Nome: ConnectionStrings__DefaultConnection
- Valor: sua cadeia de conexão
Azure Functions para microsserviços serverless
O Azure Functions permite executar trechos de código sem gerenciar a infraestrutura subjacente.
Criação de uma Function App
// Function App simples que responde a requisições HTTP
public static class HttpExample
{
[FunctionName("HttpExample")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "Cette fonction HTTP a été exécutée avec succès. Passez un nom dans la requête pour obtenir un message personnalisé."
: $"Bonjour, {name}. Cette fonction HTTP a été exécutée avec succès.";
return new OkObjectResult(responseMessage);
}
}
Implantação de Azure Functions
Pelo Visual Studio
- Crie um projeto Azure Functions
- Desenvolva suas funções
- Clique com o botão direito no projeto > “Publicar”
- Escolha Azure como destino
- Selecione ou crie uma Function App
Usando o Azure CLI
# Fazer login no Azure
az login
# Criar um grupo de recursos (se necessário)
az group create --name MonGroupeDeRessources --location francecentral
# Criar uma Function App
az functionapp create --resource-group MonGroupeDeRessources --consumption-plan-location francecentral --runtime dotnet --functions-version 4 --name MonAppDeFonctions --storage-account monstockage
# Implantar o código
func azure functionapp publish MonAppDeFonctions
Conteinerização com Docker e Azure Container Registry
A conteinerização das suas aplicações .NET oferece portabilidade e consistência entre os ambientes.
Criação de um Dockerfile para ASP.NET Core
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MonApp.csproj", "./"]
RUN dotnet restore "MonApp.csproj"
COPY . .
RUN dotnet build "MonApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MonApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MonApp.dll"]
Criação e uso do Azure Container Registry (ACR)
# Criar um registro de contêineres
az acr create --resource-group MonGroupeDeRessources --name monregistre --sku Basic
# Fazer login no registro
az acr login --name monregistre
# Construir a imagem Docker
docker build -t monapp:v1 .
# Marcar a imagem com a tag para o ACR
docker tag monapp:v1 monregistre.azurecr.io/monapp:v1
# Enviar a imagem para o ACR
docker push monregistre.azurecr.io/monapp:v1
Implantação no Azure App Service com contêineres
# Habilitar o acesso de administrador para o registro
az acr update -n monregistre --admin-enabled true
# Obter as credenciais do registro
az acr credential show -n monregistre
# Criar um App Service Plan que oferece suporte a contêineres
az appservice plan create --resource-group MonGroupeDeRessources --name MonPlanAppService --is-linux --sku B1
# Criar um App Service que usa o contêiner
az webapp create --resource-group MonGroupeDeRessources --plan MonPlanAppService --name MonAppWeb --deployment-container-image-name monregistre.azurecr.io/monapp:v1
# Configurar as credenciais do registro
az webapp config container set --name MonAppWeb --resource-group MonGroupeDeRessources --docker-custom-image-name monregistre.azurecr.io/monapp:v1 --docker-registry-server-url https://monregistre.azurecr.io --docker-registry-server-user monregistre --docker-registry-server-password <mot-de-passe>
Azure Kubernetes Service (AKS) para aplicações .NET
O AKS é ideal para aplicações complexas que exigem orquestração avançada de contêineres.
Implantação de uma aplicação .NET no AKS
- Crie um cluster AKS:
az aks create --resource-group MonGroupeDeRessources --name MonClusterAKS --node-count 2 --enable-addons monitoring --generate-ssh-keys
- Conecte-se ao cluster:
az aks get-credentials --resource-group MonGroupeDeRessources --name MonClusterAKS
- Crie um arquivo de implantação do Kubernetes (deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: monapp
spec:
replicas: 3
selector:
matchLabels:
app: monapp
template:
metadata:
labels:
app: monapp
spec:
containers:
- name: monapp
image: monregistre.azurecr.io/monapp:v1
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: monapp
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: monapp
- Implante a aplicação no AKS:
kubectl apply -f deployment.yaml
- Verifique se o serviço está acessível:
kubectl get services monapp
Bancos de dados do Azure para aplicações .NET
Azure SQL Database com Entity Framework Core
-
Crie um banco de dados Azure SQL pelo portal do Azure
-
Configure a cadeia de conexão na sua aplicação:
// appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=tcp:monserveur.database.windows.net,1433;Database=maBaseDeDonnees;User ID=monutilisateur;Password=monMotDePasse;Encrypt=true;Connection Timeout=30;"
}
}
- Use o Entity Framework Core para se conectar:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
// ...
}
Azure Cosmos DB para NoSQL
// Configuração do cliente Cosmos DB
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<CosmosClient>(serviceProvider => {
var configuration = serviceProvider.GetRequiredService<IConfiguration>();
var cosmosDbSection = configuration.GetSection("CosmosDb");
var endpoint = cosmosDbSection["Endpoint"];
var key = cosmosDbSection["Key"];
return new CosmosClient(endpoint, key);
});
services.AddSingleton<IDocumentRepository, CosmosDbRepository>();
}
CI/CD para aplicações .NET com GitHub Actions
Workflow do GitHub Actions para App Service
# .github/workflows/azure-webapps-dotnet.yml
name: .NET Core CI/CD pour Azure Web App
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
AZURE_WEBAPP_NAME: votre-app-service
AZURE_WEBAPP_PACKAGE_PATH: '.'
DOTNET_VERSION: '6.0.x'
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configurer .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Restaurer les dépendances
run: dotnet restore
- name: Build
run: dotnet build --configuration Release --no-restore
- name: Test
run: dotnet test --no-restore --verbosity normal
- name: Publish
run: dotnet publish -c Release -o ${{env.AZURE_WEBAPP_PACKAGE_PATH}}/myapp
- name: Déployer sur Azure Web App
uses: azure/webapps-deploy@v2
with:
app-name: ${{ env.AZURE_WEBAPP_NAME }}
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
package: ${{env.AZURE_WEBAPP_PACKAGE_PATH}}/myapp
Monitoramento e diagnósticos
Application Insights para monitoramento
-
Crie um recurso Application Insights no portal do Azure
-
Integre o Application Insights na sua aplicação:
// Program.cs (.NET 6)
var builder = WebApplication.CreateBuilder(args);
// Adicionar o Application Insights
builder.Services.AddApplicationInsightsTelemetry();
// ...
var app = builder.Build();
- Adicione logs personalizados:
// Em um controller ou serviço
public class MonController : Controller
{
private readonly ILogger<MonController> _logger;
public MonController(ILogger<MonController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("La page d'accueil a été visitée");
return View();
}
}
- Visualize as métricas no portal do Azure Application Insights
Segurança das aplicações .NET no Azure
Uso do Azure Key Vault
-
Crie um cofre de chaves no portal do Azure
-
Conceda as permissões à sua aplicação:
az keyvault set-policy --name MonCoffre --object-id <object-id-de-votre-app> --secret-permissions get list
- Integre o Key Vault na sua aplicação:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// Adicionar a configuração do Azure Key Vault
builder.Configuration.AddAzureKeyVault(
new Uri($"https://{builder.Configuration["KeyVault:VaultName"]}.vault.azure.net/"),
new DefaultAzureCredential());
Configuração do Azure AD B2C para autenticação
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
// ...
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
Otimização de custos
Dicas para reduzir os custos no Azure
-
Escolher o nível de preço adequado:
- Use os níveis Free e Shared para desenvolvimento
- Considere Basic/Standard para produção de pequeno a médio porte
-
Escalar automaticamente:
- Configure o autoscaling de acordo com as necessidades
az monitor autoscale create --resource-group MonGroupeDeRessources --resource monappservice --resource-type "Microsoft.Web/sites" --name autoscale-config --min-count 1 --max-count 5 --count 1 -
Usar instâncias reservadas para economias de longo prazo
-
Ativar o Azure Cost Management para monitorar e otimizar os gastos
-
Limpar regularmente os recursos não utilizados
Boas práticas para .NET no Azure
-
Arquitetura cloud-native:
- Projete para resiliência e escalabilidade
- Use arquiteturas serverless quando apropriado
-
Configuração externalizada:
- Armazene os parâmetros no Azure App Configuration ou no Key Vault
- Use variáveis de ambiente para configurações específicas
-
Monitoramento completo:
- Integre o Application Insights desde o início
- Configure alertas para as métricas críticas
-
Testes automatizados:
- Inclua testes de carga específicos para o Azure
- Use ambientes de teste/pré-produção
-
Infrastructure as Code (IaC):
- Utilize Azure Resource Manager (ARM) ou Terraform
// exemplo de template ARM { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "appServiceName": { "type": "string", "metadata": { "description": "Nom de l'App Service" } } }, "resources": [ { "type": "Microsoft.Web/serverfarms", "apiVersion": "2020-06-01", "name": "[parameters('appServiceName')]", "location": "[resourceGroup().location]", "sku": { "name": "B1", "tier": "Basic" } } ] }
Conclusão
O Azure oferece um ecossistema rico e integrado para suas aplicações .NET, permitindo cobrir todo o ciclo de vida de desenvolvimento. Ao combinar os serviços do Azure com as boas práticas de desenvolvimento .NET, você pode criar aplicações robustas, de alto desempenho e escaláveis.
As ferramentas e os serviços apresentados neste guia são apenas o começo do que o Azure pode oferecer aos desenvolvedores .NET. Não hesite em explorar mais e combinar diferentes serviços para atender às necessidades específicas da sua aplicação.
Recursos adicionais
Sobre InSkillCoach
Especialista em treinamento e tecnologias
Coach especializado em tecnologias avançadas e IA, apoiado pela GNeurone Inc.
Certificações:
- AWS Certified Solutions Architect – Professional
- Certificações Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentários
Os comentários são alimentados pelo GitHub Discussions
Conecte-se com o GitHub para participar da discussão