civil-and-structural-engineering
Déployer des applications sans serveur avec des conteneurs Docker
Table of Contents
Le changement vers les déploiements sans serveur de conteneur-natif
En abstractionnant la gestion de l'infrastructure, il permet aux développeurs de se concentrer uniquement sur le code tandis que les fournisseurs de cloud gèrent l'échelle, le patching et la disponibilité. Les conteneurs Docker, qui ont commencé comme un outil pour le développement local et CI/CD, sont maintenant un citoyen de première classe dans les environnements sans serveur. Cette convergence offre portabilité, cohérence et contrôle d'exécution personnalisé que les fonctions sans serveur traditionnelles ne peuvent pas correspondre.
Alors que les organisations adoptent des stratégies multicloud et hybrides, la possibilité de charger une application une fois et de l'exécuter à travers AWS Lambda, Azure Fun, ou Google Cloud Run devient un avantage stratégique. Cet article explore comment déployer des applications sans serveur à l'aide de conteneurs Docker, couvrant les concepts de base, les processus de déploiement étape par étape, les nuances spécifiques à la plate-forme et les meilleures pratiques opérationnelles pour les charges de production.
Comprendre les applications sans serveur en profondeur
Sans serveur ne signifie pas "pas de serveurs". Cela signifie que le développeur ne fournit plus, ne configure plus ou ne gère plus de serveurs. La plate-forme cloud alloue dynamiquement des ressources, des échelles en réponse à la demande et ne facture que pour le temps de calcul consommé.
Les principales caractéristiques sont les suivantes:
- Échelle d'auto-scalage:[ Les instances s'échelonnent de zéro à des milliers sur la base de déclencheurs tels que les requêtes HTTP, les messages de file d'attente ou les changements de base de données.
- Paiement par exécution:[ Vous payez le nombre d'invocations et la durée, pas pour la capacité de repos.
- Apatridie:[ Les fonctions sont éphémères; l'état persistant doit être stocké de l'extérieur (p. ex. bases de données, stockage d'objets).
- Gérer l'infrastructure :[ Le perfectionnement, les mises à jour de sécurité et la planification des capacités sont la responsabilité du fournisseur.
Les fonctions traditionnelles sans serveur (par exemple AWS Lambda utilisant le Node.js ou Python runtime) imposent des limites aux versions d'exécution, à la disponibilité des bibliothèques et à la taille des paquets.
Pourquoi Docker Containers dans l'architecture sans serveur ?
Les conteneurs Docker encapsulent une application avec son environnement d'exécution entier et son ampère;mdash;bibliothèques, fichiers de configuration et outils système. Lorsqu'ils sont utilisés dans des déploiements sans serveur, les conteneurs offrent plusieurs avantages architecturaux.
Portabilité entre les fournisseurs
Les images de conteneurs respectent les spécifications de l'Open Container Initiative (OCI). Une image construite pour AWS Lambda peut être testée localement, déployée sur Google Cloud Run, ou exécutée dans une instance de conteneurs Azure avec des changements minimes.
Contrôle personnalisé du temps d'exécution
Certaines applications nécessitent des versions Python spécifiques, des extensions C compilées ou des dépendances héritées que les fournisseurs de cloud n'offrent pas comme des exécutables gérés. Avec des conteneurs, vous pouvez installer n'importe quel paquet, définir des variables d'environnement et configurer le point d'entrée exactement au besoin.
Cohérence dans les milieux
Les développeurs rencontrent souvent des problèmes « ça fonctionne sur ma machine ». Les conteneurs garantissent que la même image fonctionne de façon identique sur un ordinateur portable, un pipeline CI/CD et la plate-forme sans serveur de production.
Début rapide du froid avec des images optimisées
Contrairement à ce que l'on croit souvent, les fonctions sans serveur peuvent atteindre des temps de démarrage froids comparables aux temps d'exécution intégrés lorsque les images sont optimisées (petites images de base, couches minimales, caches appropriées).
Déployer des applications sans serveur avec des conteneurs Docker
Le workflow de déploiement intègre la conteneurisation avec les API de plate-forme sans serveur. Ci-dessous est une approche structurée qui s'applique aux principaux fournisseurs de cloud.
Étape 1: Container la demande
Commencez par un qui définit l'environnement d'exécution. Utilisez des constructions multi-étapes pour garder les images de production maigres. Par exemple, compilez les dépendances dans une première étape et copiez seulement les artefacts à l'image finale.
FROM python:3.11-slim as builder
COPY requirements.txt .
RUN pip install --user -r requirements.txt
FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY app.py .
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
Vérifiez la documentation du fournisseur pour les points d'entrée requis (p. ex., AWS Lambda s'attend à ce que le invoque le client de l'interface d'exécution).
Étape 2: Construire et tester localement
Utilisez les commandes Docker pour construire l'image et vérifier le comportement avant de pousser vers un registre. De nombreux fournisseurs offrent des outils de test locaux:
- AWS: SAM CLI & Lambda Récipient d'interface (RIE)
- Azure: Fonctions d'azur Outils de base
- Google Cloud: Module de module de code Cloud ou émulateur local
Tester avec des événements échantillonnés (p. ex. ou ) pour confirmer que le gestionnaire entre correctement.
Étape 3: Poussez vers un registre de conteneurs
Appuyez sur l'image pour accéder à un registre tel que Docker Hub, Amazon ECR, Azure Container Registry ou Google Artifact Registry. Étiquetez l'image avec un identifiant de version unique (p. ex. ] ou un SHA de commit). Utilisez des pipelines CI/CD automatisés pour construire et pousser sur chaque commit.
Étape 4: Configurer la plate-forme sans serveur
Chaque fournisseur a une façon spécifique de lier une image conteneur à une fonction sans serveur:
- AWS Lambda: Créez une fonction en utilisant "Container image" comme source. Spécifiez l'URI image ECR et définissez le gestionnaire (si non en utilisant le point d'entrée par défaut).
- ]]]]]]]]][FLT:][FLT:]][FLT:]][FLT:][FLT:][FLT:][FLT:][FLT:][FLT][F][F.
- Google Cloud Run: Déployez une image de conteneur vers Cloud Run avec une seule commande: . Le service s'échelonne automatiquement à zéro lorsque le moteur est au ralenti.
Étape 5 : Déploiement et surveillance
Après configuration, déployez la fonction.
- Dénombrement d'invocation & durée
- Frequence de démarrage à froid
- Taux d'erreur & gaz
- Utilisation de mémoire & durée facturée
Utilisez des outils de programmation (CloudWatch, Azure Monitor, Cloud Logging) pour configurer des tableaux de bord et des alertes. Envisagez de tracer avec OpenTelemetry pour une observation dans toutes les fonctions distribuées.
Exemples de plateforme Cloud avec support Docker
Les trois principaux fournisseurs de cloud prennent désormais en charge les fonctions sans serveur, mais chacun a des caractéristiques uniques.
AWS Lambda
AWS Lambda a introduit le support d'image de conteneur en décembre 2020.
- Images jusqu'à 10 Go (non zippées) d'Amazon ECR.
- Doit implémenter l'API Lambda Runtime ou utiliser une image de base fournie par AWS.
- Prend en charge tous les déclencheurs Lambda (API Gateway, SQS, S3, DynamoDB Streams, etc.).
- Les temps de démarrage à froid sont légèrement supérieurs aux fonctions à base de zip, mais s'améliorent avec des images optimisées et une cohérence assurée.
Fonctions d'azur
Azure Functions prend en charge les conteneurs personnalisés sur les plans Premium et dédié (App Service).
- Utilisez une image de base Linux avec les fonctions Azure exécutables installées.
- Déployez-vous de Azure Container Registry ou Docker Hub.
- Prend en charge les déclencheurs pour HTTP, Blob Storage, Cosmos DB, Event Grid, et plus encore.
- Le meilleur pour les charges de travail nécessitant des environnements d'exécution cohérents ou de grands ensembles de dépendance.
Google Cloud Exécuter
Google Cloud Run est une plateforme de calcul entièrement gérée qui gère des conteneurs apatrides sur une infrastructure sans serveur.
- Déployez toute image de contenant conforme à l'OCI depuis le Registre d'Artifact ou le Registre de contenants.
- Auto-échelles à zéro quand il n'est pas utilisé, sans coût de ralenti.
- Prend en charge uniquement les requêtes basées sur HTTP (utilisez Eventarc pour les déclencheurs pilotés par un événement).
- Chaque révision obtient une URL unique ; le trafic peut être divisé pour les déploiements canari.
Pour les scénarios avancés, considérez Google Cloud Run container runtime contract[ pour les conseils de portabilité.
Modèles avancés pour les déploiements de production
Au-delà du déploiement de base, plusieurs modèles améliorent la fiabilité, la performance et la maintenance.
Constructions multi-étapes pour l'optimisation de la taille d'image
Les grandes images augmentent les temps de démarrage et les coûts de stockage à froid. Utilisez des constructions multi-étapes pour inclure seulement les dépendances d'exécution.
Cache en couches pour un CI/CD plus rapide
Commandez les instructions Dockerfile du moins souvent en évolution. Installez les paquets système et les dépendances Python tôt, puis copiez le code d'application en dernier. Cela maximise la mise en cache des couches et réduit la durée du pipeline.
Utilisation de la comptabilisation des provisions
AWS Lambda offre une certaine cohérence pour maintenir un nombre défini d'environnements d'exécution au chaud. Cela élimine les démarrages à froid pour les paramètres sensibles à la latence.
Contrôles de santé et fermeture gracieuse
Les fonctions de navigation en nuage et d'azur prennent en charge les paramètres de contrôle de santé. Implémenter et des itinéraires pour signaler les balanceurs de charge de plate-forme.
Gestion secrète
N'insérez pas de secrets dans les images de conteneurs. Utilisez des variables d'environnement provenant de magasins secrets de fournisseurs:
- AWS: Utilisez des variables d'environnement Lambda avec cryptage AWS KMS, ou récupérer à partir de Secrets Manager au démarrage.
- Azure: Utiliser les références de la faille clé dans les paramètres de l'application de fonction.
- GCP: Utilisez Secret Manager via la bibliothèque cliente Google Cloud.
Considérations de sécurité pour les serveurs sans conteneurs
Les images de conteneurs présentent de nouvelles surfaces d'attaque qui nécessitent une gestion soigneuse.
Analyse de vulnérabilité
Scanner des images de CVE connus pendant CI/CD à l'aide d'outils comme Trivy, Snyk, ou de scanners fournisseurs-natifs (Amazon ECR scanner, Azure Defender, Google Container Analysis).
Moins de privilège IAM
Attribuer les autorisations minimales requises pour que la fonction s'exécute. Par exemple, si une fonction Lambda doit seulement lire à partir d'un seau S3 unique, éviter d'accorder ou accès.
Signation et provenance de l'image
Utilisez Docker Content Trust ou notaire pour signer des images et vérifier les signatures avant le déploiement. Ceci empêche les images non autorisées ou altérées d'être utilisées dans la production.
Protection contre les temps d'exécution
Activer la surveillance de sécurité des runtimes (par exemple, AWS GuardDuty pour Lambda, Azure Defender pour Cloud) pour détecter les comportements anormaux tels que les connexions sortantes aux IP malveillants connues.
Pour un examen plus approfondi de la sécurité des conteneurs, consultez la documentation de sécurité .
Surveillance, exploitation forestière et observation
Les fonctions sans serveur basées sur un conteneur nécessitent une observation robuste pour déboguer les problèmes et optimiser les performances.
Exploitation forestière centralisée
Les fournisseurs de Cloud capturent automatiquement ces données et les acheminent vers les services de gestion des journaux (CloudWatch Logs, Azure Log Analytics, Cloud Logging). Inclure des ID de corrélation pour le traçage à travers les microservices.
Traçage distribué
Fonctions d'instrument avec les SDK OpenTelemetry pour tracer les requêtes au-delà des limites de fonction, des bases de données et des API externes. Exporter des traces vers des fournisseurs comme AWS X-Ray, Azure Application Insights ou Google Cloud Trace.
Mesures personnalisées
Emit les mesures d'affaires (p. ex., nombre de commandes, latence de traitement) via les API fournisseurs (CloudWatch Metrics, Azure Monitor, Cloud Monitoring). Utilisez-les pour les tableaux de bord et l'alerte.
Surveillance du démarrage à froid
Suivre la fréquence et la durée de démarrage à froid comme une mesure personnalisée. Si le démarrage à froid provoque une dégradation des performances, envisager la concordance prévue ou la réduction de la taille de l'image.
Stratégies d'optimisation des coûts
Le prix sans serveur est basé sur les invocations, la durée et l'allocation de mémoire.
Mémoire de taille droite
L'allocation de mémoire contrôle également l'allocation de processeurs dans certains fournisseurs (AWS Lambda, Cloud Run). Testez avec différents paramètres de mémoire pour trouver le bon endroit où le coût par demande est réduit au minimum.
Réduire la taille de l'image
Les images plus petites réduisent les coûts de stockage dans le registre et diminuent la latence de démarrage à froid. Utilisez des images de base sans détroit (p. ex. ) pour enlever des paquets inutiles.
Tirer parti de la base libre
Chaque fournisseur offre un niveau gratuit généreux pour les fonctions sans serveur. Pour les applications à faible trafic, les coûts peuvent rester proches de zéro. Surveiller l'utilisation pour éviter les surprises.
Gestion des coûts de la poche
Contrairement aux machines virtuelles, les fonctions sans serveur n'entraînent aucun coût en cas de panne. Cependant, vérifiez toujours que votre fonction peut être mise à zéro si elle fonctionne sur un plan qui permet de fonctionner au ralenti (Cloud Run, AWS Lambda, Azure Consumer plan).
Pièges potentiels et comment les éviter
Les équipes qui ne sont pas équipées de serveurs peuvent souvent rencontrer quelques problèmes communs.
Ignorer l'impact du démarrage à froid
Les grandes images ou le code d'initialisation complexe augmentent les temps de démarrage à froid. Profilez la séquence de démarrage et déplacez les importations lourdes à l'intérieur du gestionnaire pour charger sur demande.
Pas d'essai local
Déployer des images de contenants non testées gaspille du temps. Utilisez des émulateurs pour tester localement avant de pousser vers le registre.
Dépassant les limites des ressources
Chaque plateforme sans serveur impose des limites sur la mémoire, le délai d'exécution et le stockage éphémère. Consultez les quotas AWS Lambda pour vous assurer que votre application s'adapte à l'intérieur des limites.
Permissions d'images surplombant
Si la fonction ne peut pas tirer l'image du conteneur (en raison de la mauvaise configuration de l'IAM), la fonction échoue sur l'invocation. Assurez-vous que le rôle d'exécution de Lambda a et les permissions.
Oublier de mettre à jour les images
Les images de conteneurs contiennent des paquets système qui nécessitent un patching. Automatise la reconstruction d'image sur un calendrier pour appliquer des mises à jour de sécurité au calque OS de base.
Conclusion
Le déploiement d'applications sans serveur avec des conteneurs Docker combine la simplicité opérationnelle de l'option sans serveur avec la portabilité et la personnalisation de la conteneurisation. Cette approche permet aux équipes d'utiliser n'importe quelle durée d'exécution, langue ou dépendance tout en laissant la gestion de l'infrastructure au fournisseur de cloud.
Comme les fournisseurs de cloud continuent d'améliorer le support de conteneur au sein de leurs plateformes sans serveur, sans conteneur sera la norme pour les nouveaux projets qui exigent une flexibilité sans sacrifier l'efficacité opérationnelle. Commencez par un petit service bien défini, mesurez le comportement et le coût de démarrage à froid, et les modèles d'échelle dans toute votre architecture.