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.