Pourquoi Deployer .NET sur AWS ?
Le déploiement d'applications .NET sur Amazon Web Services (AWS) est un choix populaire pour plusieurs raisons. D'une part, AWS offre une grande variété de services et de capacités qui peuvent être utilisées pour améliorer les performances, l'échelle et la sécurité des applications .NET. En outre, AWS fournit également un environnement cloud sécurisé et résilient, ce qui permet aux développeurs de se concentrer sur le développement de leurs applications plutôt que sur la gestion des infrastructures.
Un cas d'usage concret est le déploiement d'une application web à grande échelle nécessitant une haute disponibilité et un large éventail de fonctionnalités. Par exemple, une application e-commerce qui doit traiter les paiements en temps réel, gérer des millions de transactions chaque jour, et être accessible à partir du monde entier.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
- Connaissance de base de .NET Core ou .NET 5+
- Un compte AWS avec les droits nécessaires pour créer des instances EC2, des groupes de sécurité et des volumes EBS.
- Visual Studio (pour le développement .NET) ou tout autre éditeur de code compatible avec C#.
Concepts fondamentaux
1. Instance EC2
L'Instance EC2 est la base de l'hébergement dans AWS. Elle fournit un environnement virtuel où vous pouvez exécuter vos applications.
## Créez une instance EC2 en utilisant la ligne de commande AWS CLI
aws ec2 run-instances --image-id ami-0c55b159cbfafe1f0 --count 1 --instance-type t2.micro --key-name mon-cle-publique --security-group-ids sg-0e78a6c4d3a1b2c3d
2. Groupes de Sécurité
Les groupes de sécurité sont des listes de règles qui définissent les ports et les protocoles réseau autorisés à accéder à votre instance EC2.
## Créez un groupe de sécurité en utilisant la ligne de commande AWS CLI
aws ec2 create-security-group --group-name mon-groupe-sécurité --description "Groupe de sécurité pour mes applications .NET"
3. Bucket S3
S3 (Simple Storage Service) est un service d'objets stockage à grande échelle, utilisé pour stocker des fichiers et des données.
## Créez un bucket S3 en utilisant la ligne de commande AWS CLI
aws s3 mb s3://mon-bucket-s3
4. IAM (Identity and Access Management)
IAM permet de gérer les identités et les autorisations dans AWS, ce qui vous permet de contrôler qui peut accéder à vos ressources.
## Créez un rôle IAM en utilisant la ligne de commande AWS CLI
aws iam create-role --role-name mon-rôle-iam --assume-role-policy-document file://trust-policy.json
Mise en pratique : projet fil rouge
Pour cet exemple, nous allons créer une application .NET Core simple qui expose une API RESTful pour gérer des tâches.
Étape 1 : Créer le Projet .NET
Commencez par créer un nouveau projet .NET Core dans Visual Studio ou à partir de la ligne de commande :
dotnet new webapi -n TodoApp
cd TodoApp
Étape 2 : Ajouter des Modèles et Services
Créez une classe pour représenter les tâches :
// Models/TodoItem.cs
public class TodoItem
{
public long Id { get; set; }
public string Name { get; set; }
public bool IsComplete { get; set; }
}
Ajoutez un service pour gérer les tâches :
// Services/TodoService.cs
using System.Collections.Generic;
using System.Linq;
public class TodoService
{
private static List<TodoItem> _todoItems = new List<TodoItem>();
public IEnumerable<TodoItem> GetAll()
{
return _todoItems;
}
public TodoItem GetById(long id)
{
return _todoItems.FirstOrDefault(t => t.Id == id);
}
public TodoItem Create(TodoItem item)
{
item.Id = _todoItems.Count + 1;
_todoItems.Add(item);
return item;
}
public void Update(TodoItem item)
{
var index = _todoItems.FindIndex(t => t.Id == item.Id);
if (index >= 0)
{
_todoItems[index] = item;
}
}
public void Delete(long id)
{
_todoItems.RemoveAll(t => t.Id == id);
}
}
Étape 3 : Configurer le Contrôleur API
Ajoutez un contrôleur pour gérer les requêtes HTTP :
// Controllers/TodoController.cs
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase
{
private readonly TodoService _todoService = new TodoService();
[HttpGet]
public IEnumerable<TodoItem> GetAll()
{
return _todoService.GetAll();
}
[HttpGet("{id}")]
public ActionResult<TodoItem> GetById(long id)
{
var item = _todoService.GetById(id);
if (item == null) return NotFound();
return item;
}
[HttpPost]
public ActionResult<TodoItem> Create(TodoItem item)
{
var newItem = _todoService.Create(item);
return CreatedAtAction(nameof(GetById), new { id = newItem.Id }, newItem);
}
[HttpPut("{id}")]
public IActionResult Update(long id, TodoItem item)
{
if (item.Id != id) return BadRequest();
_todoService.Update(item);
return NoContent();
}
[HttpDelete("{id}")]
public IActionResult Delete(long id)
{
_todoService.Delete(id);
return NoContent();
}
}
Étape 4 : Publier l'Application sur AWS S3
Publiez votre application sur un bucket S3 :
## Construisez le projet .NET Core
dotnet publish -c Release -o ./publish
## Copiez les fichiers publiés dans un bucket S3
aws s3 sync ./publish s3://mon-bucket-s3 --acl public-read
Étape 5 : Configurer l'Instance EC2 pour Exécuter l'Application
Connectez-vous à votre instance EC2 et installez .NET Core sur elle :
## Connectez-vous à votre instance EC2 via SSH
ssh -i "mon-cle-publique.pem" ec2-user@your-ec2-ip
## Installez .NET Core
wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x ./dotnet-install.sh
./dotnet-install.sh --channel 5.0
Étape 6 : Exécutez l'Application sur l'Instance EC2
Exécutez votre application .NET Core :
## Changez le répertoire et exécutez l'application
cd /home/ec2-user/mon-bucket-s3/publish
dotnet TodoApp.dll
Étape 7 : Accédez à l'API depuis l'Instance EC2
Vous pouvez maintenant accéder à votre API RESTful via le navigateur ou en utilisant un client HTTP :
http://your-ec2-ip/api/todo
Erreurs frequentes et debugging
1. Erreur : "No such file or directory"
## ❌ Mauvais
var filePath = "/nonexistent/file.txt";
using (var reader = File.OpenText(filePath))
{
// ...
}
net
## ✅ Correct
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "file.txt");
if (File.Exists(filePath))
{
using (var reader = File.OpenText(filePath))
{
// ...
}
}
else
{
Console.WriteLine("File not found.");
}
2. Erreur : "The type or namespace name 'TodoService' could not be found"
## ❌ Mauvais
var service = new TodoService();
net
## ✅ Correct
var service = new Services.TodoService();
3. Erreur : "Access to the path '/home/ec2-user/mon-bucket-s3/publish' is denied"
## ❌ Mauvais
var directoryPath = "/home/ec2-user/mon-bucket-s3/publish";
Directory.CreateDirectory(directoryPath);
net
## ✅ Correct
var directoryPath = Path.Combine(Directory.GetCurrentDirectory(), "publish");
if (!Directory.Exists(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
Pour aller plus loin
Utilisation de Docker pour le déploiement : Découvrez comment utiliser Docker pour containeriser votre application .NET et faciliter son déploiement sur AWS.
Intégration Continue (CI) et Intégration Continuë (CD) avec AWS CodePipeline : Automatisez le processus de construction, de test et de déploiement de votre application en utilisant AWS CodePipeline.
Utilisation de AWS Lambda pour des microservices serverless : Apprenez à transformer vos applications .NET en microservices serverless en utilisant AWS Lambda et API Gateway.
Défis pratiques :
- Créez une application .NET Core qui utilise Entity Framework Core pour accéder à une base de données Azure SQL Database.
- Utilisez AWS RDS pour déployer une instance MySQL et configurez votre application .NET pour y accéder.