Déployer des fonctions Lambda avec des images de conteneurs - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Déployer des fonctions Lambda avec des images de conteneurs

Créée par Ram Kandaswamy (AWS)

Récapitulatif

AWS Lambda prend en charge les images de conteneurs en tant que modèle de déploiement. Ce modèle montre comment déployer des fonctions Lambda via des images de conteneur. 

Lambda est un service de calcul sans serveur piloté par les événements que vous pouvez utiliser pour exécuter du code pour pratiquement n'importe quel type d'application ou de service principal sans provisionner ni gérer de serveurs. Grâce à la prise en charge des images de conteneur pour les fonctions Lambda, vous bénéficiez de 10 Go de stockage maximum pour votre artefact d'application et de la possibilité d'utiliser des outils de développement d'images de conteneur familiers.

L'exemple de ce modèle utilise Python comme langage de programmation sous-jacent, mais vous pouvez utiliser d'autres langages, tels que Java, Node.js ou Go. Pour la source, considérez un système basé sur Git tel que GitHub GitLab, ou Bitbucket, ou utilisez Amazon Simple Storage Service (Amazon S3).

Conditions préalables et limitations

Prérequis

  • Amazon Elastic Container Registry (Amazon ECR) activé

  • Code de l'application

  • Images Docker avec le client d'interface d'exécution et la dernière version de Python

  • Connaissance pratique de Git

Limites

  • La taille d'image maximale prise en charge est de 10 Go.

  • Le temps d'exécution maximal pour un déploiement de conteneur basé sur Lambda est de 15 minutes.

Architecture

Architecture cible

Processus en quatre étapes pour créer la fonction Lambda.
  1. Vous créez un dépôt Git et vous y validez le code de l'application.

  2. Le AWS CodeBuild projet est déclenché par les modifications apportées aux validations.

  3. Le CodeBuild projet crée l'image Docker et publie l'image créée sur Amazon ECR.

  4. Vous créez la fonction Lambda à l'aide de l'image dans Amazon ECR.

Automatisation et mise à l'échelle

Ce modèle peut être automatisé à l'aide de AWS CloudFormation AWS Cloud Development Kit (AWS CDK), ou d'opérations d'API à partir d'un SDK. Lambda peut automatiquement évoluer en fonction du nombre de demandes, et vous pouvez l'ajuster à l'aide des paramètres de simultanéité. Pour plus d'informations, consultez la documentation Lambda.

Outils

Services AWS

  • AWS CloudFormationAWS CloudFormationhelps vous permet de configurer les AWS ressources, de les approvisionner rapidement et de manière cohérente, et de les gérer tout au long de leur cycle de vie, de bout Comptes AWS en bout Régions AWS. Ce modèle utilise AWS CloudFormation Application Composer, qui vous permet de visualiser et de modifier visuellement les AWS CloudFormation modèles.

  • AWS CodeBuildest un service de génération entièrement géré qui vous aide à compiler le code source, à exécuter des tests unitaires et à produire des artefacts prêts à être déployés.

  • Amazon Elastic Container Registry (Amazon ECR) est un service géré de registre d'images de conteneurs sécurisé, évolutif et fiable.

  • AWS Lambda est un service de calcul qui vous aide à exécuter du code sans avoir à allouer ni à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

Autres outils

  • Docker est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs.

  • GitHub, GitLab, et Bitbucket font partie des systèmes de contrôle de source basés sur Git les plus couramment utilisés pour suivre les modifications du code source.

Bonnes pratiques

  • Rendez votre fonction aussi efficace et aussi petite que possible pour éviter de charger des fichiers inutiles.

  • Efforcez-vous de placer les couches statiques plus haut dans votre liste de fichiers Docker et de placer les couches qui changent plus souvent plus bas. Cela améliore la mise en cache, ce qui améliore les performances.

  • Le propriétaire de l'image est responsable de la mise à jour et des correctifs de l'image. Ajoutez cette cadence de mise à jour à vos processus opérationnels. Pour plus d’informations, consultez la documentation AWS Lambda.

Épopées

TâcheDescriptionCompétences requises

Créez un dépôt Git.

Créez un dépôt Git qui contiendra le code source de l'application, le Dockerfile et le buildspec.yaml fichier.

Developer

Créez un CodeBuild projet.

Pour utiliser un CodeBuild projet afin de créer l'image Lambda personnalisée, procédez comme suit :

  1. Connectez-vous à la CodeBuild console et AWS Management Console ouvrez-la à l'adresse https://console.aws.amazon.com/codesuite/ codebuild/.

  2. Crée un projet. Pour source, choisissez le dépôt Git que vous avez créé. Pour plus d'informations sur les différents types d'intégration du référentiel Git, consultez la documentation relative à l'utilisation des connexions.

  3. Vérifiez que le mode privilégié est activé. Pour créer des images Docker, cela est nécessaire. Dans le cas contraire, l'image ne sera pas créée correctement.

  4. Entrez des valeurs pour le nom et la description du projet.

Developer

Modifiez le Dockerfile.

Le Dockerfile doit se trouver dans le répertoire de premier niveau dans lequel vous développez l'application. Le code Python doit se trouver dans le src dossier.

Lorsque vous créez l'image, utilisez les images officielles prises en charge par Lambda. Sinon, une erreur de démarrage se produira, rendant le processus d'emballage plus difficile.

Pour plus de détails, consultez la section Informations supplémentaires.

Developer

Créez un référentiel dans Amazon ECR.

Créez un référentiel de conteneurs dans Amazon ECR. Dans l'exemple de commande suivant, le nom du référentiel créé est cf-demo :

aws ecr create-repository --cf-demo

Le référentiel sera référencé dans le buildspec.yaml fichier.

Administrateur AWS, développeur

Poussez l'image vers Amazon ECR.

Vous pouvez l'utiliser CodeBuild pour exécuter le processus de création d'image. CodeBuild a besoin d'une autorisation pour interagir avec Amazon ECR et pour travailler avec S3. Dans le cadre du processus, l'image Docker est créée et envoyée au registre Amazon ECR. Pour plus de détails sur le modèle et le code, consultez la section Informations supplémentaires.

Developer

Vérifiez que l'image se trouve dans le référentiel.

Pour vérifier que l'image se trouve dans le référentiel, sur la console Amazon ECR, sélectionnez Repositories. L'image doit être répertoriée, avec des balises et les résultats d'un rapport d'analyse des vulnérabilités si cette fonctionnalité a été activée dans les paramètres Amazon ECR.  Pour plus d'informations, consultez la documentation AWS.

Developer
TâcheDescriptionCompétences requises

Créez la fonction Lambda.

Sur la console Lambda, choisissez Create function, puis choisissez Container image. Entrez le nom de la fonction et l'URI de l'image qui se trouve dans le référentiel Amazon ECR, puis choisissez Create function. Pour plus d'informations, consultez la documentation AWS Lambda.

Développeur d’applications

Testez la fonction Lambda.

Pour appeler et tester la fonction, choisissez Test. Pour plus d'informations, consultez la documentation AWS Lambda.

Développeur d’applications

Résolution des problèmes

ProblèmeSolution

La construction ne réussit pas.

  1. Vérifiez si le mode privilégié est activé pour le CodeBuild projet.

  2. Assurez-vous que les commandes associées à Docker disposent des autorisations nécessaires. J'essaie sudo d'ajouter des commandes.

  3. Vérifiez que le rôle IAM associé CodeBuild dispose d'une politique comportant des actions appropriées pour interagir avec Amazon ECR, Amazon S3 et CloudWatch les journaux.

Ressources connexes

Informations supplémentaires

Modifier le Dockerfile

Le code suivant montre les commandes que vous modifiez dans le Dockerfile :

FROM public.ecr.aws/lambda/python:3.xx # Copy function code COPY app.py ${LAMBDA_TASK_ROOT} COPY requirements.txt ${LAMBDA_TASK_ROOT} # install dependencies RUN pip3 install --user -r requirements.txt # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "app.lambda_handler" ]

Dans la FROM commande, utilisez la valeur appropriée pour la version de Python prise en charge par Lambda (par exemple,3.12). Il s'agira de l'image de base disponible dans le référentiel d'images public Amazon ECR. 

La COPY app.py ${LAMBDA_TASK_ROOT} commande copie le code dans le répertoire racine de la tâche, que la fonction Lambda utilisera. Cette commande utilise la variable d'environnement afin que nous n'ayons pas à nous soucier du chemin réel. La fonction à exécuter est transmise en tant qu'argument à la CMD [ "app.lambda_handler" ] commande.

La COPY requirements.txt commande capture les dépendances nécessaires au code. 

La RUN pip install --user -r requirements.txt commande installe les dépendances dans le répertoire utilisateur local. 

Pour créer votre image, exécutez la commande suivante.

docker build -t <image name> .

Ajoutez l'image dans Amazon ECR

Dans le code suivant, remplacez-le aws_account_id par le numéro de compte, et remplacez-le us-east-1 si vous utilisez une autre région. Le buildspec fichier utilise le numéro de CodeBuild version pour identifier de manière unique les versions d'image sous forme de valeur de balise. Vous pouvez le modifier en fonction de vos besoins.

Le code personnalisé buildspec

phases: install: runtime-versions: python: 3.xx pre_build: commands: - python3 --version - pip3 install --upgrade pip - pip3 install --upgrade awscli - sudo docker info build: commands: - echo Build started on `date` - echo Building the Docker image... - ls - cd app - docker build -t cf-demo:$CODEBUILD_BUILD_NUMBER . - docker container ls post_build: commands: - echo Build completed on `date` - echo Pushing the Docker image... - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-east-1.amazonaws.com - docker tag cf-demo:$CODEBUILD_BUILD_NUMBER aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER - docker push aws_account_id.dkr.ecr.us-east-1.amazonaws.com/cf-demo:$CODEBUILD_BUILD_NUMBER