Déploiement continu des fonctions Lambda | par Prakshal Jain | Octobre 2020

Engager, construire, déployer

Prakshal Jain
Déploiement continu de la fonction Lambda

Lambda est un jeu amusant jusqu’à ce que vous ayez besoin de déployer en continu des fonctions stockées dans un référentiel git. Pour déployer en continu les fonctions Lambda gérées par Github, nous utiliserons AWS Pipeline et AWS CloudFormation. Chaque branche du code (dev, qa, prod) créera une fonction Lambda avec la convention de dénomination suivante: <function-name>-<branch>.

Avant de commencer avec AWS, configurons le dépôt Github.

  1. Créez un dépôt. Ajouter des branches pour dev et qa
  2. ❗️Dans le dossier racine, créez un fichier appelé buildspec.yaml et ajoutez le code ICI
  3. Créez deux répertoires dans le dossier racine: function et scripts
  4. ❗️Enregistrer le code ICI comme deploy.sh sous le scripts annuaire.
  5. Ajoutez la fonction lambda sous le function annuaire

Génial! Configurons maintenant un compartiment S3 pour stocker les artefacts.

  1. Accédez à S3 dans AWS Management Console
  2. Créez un compartiment S3 pour stocker les artefacts de construction contenant des versions compressées des fonctions lambda. Nomme le -lambda-code-pipeline
  3. Créez trois dossiers: dev, qa et prod

Ensuite, configurons le rôle IAM qui sera utilisé par CodeDeploy pour déployer des fonctions Lambda via CloudFormation.

  1. Accédez à IAM dans AWS Management Console
  2. Cliquez sur Rôles dans le menu de gauche
  3. Cliquez sur « Créer un rôle« 
  4. Sélectionnez « CloudFormation”Dans la liste des services AWS
  5. Cliquez sur « Suivant »
  6. ❗️Cliquez sur « Créer une politique»En haut à gauche. Un nouvel onglet doit s’ouvrir pour créer une stratégie personnalisée. Ajouter le code ICI et mettez à jour les valeurs des variables telles que définies en haut du fichier.
  7. Cliquez sur « Politique de révision« 
  8. Assurez-vous que tout est correct et enregistrez la politique sous cf-lambda-policy
  9. Une fois la stratégie créée, revenez au Rôles et cliquez sur le icône de rafraîchissement
  10. Recherchez la politique créée ci-dessus (par exemple cf-lambda-policy) et ajoutez-le au rôle
  11. Cliquez sur « Suivant: Tags»Pour ajouter des balises. Cliquez sur « Suivant » réviser
  12. Assurez-vous que tout est correct et indiquez un nom pour le rôle, tel que cf-deploy-role
  13. Cliquez sur « Créer un rôle« 

Maintenant, sur la création du pipeline de code!

CodePipeline nous permet de créer un processus de déploiement continu à l’aide de CodeCommit, CodeBuild et CodeDeploy.

Le processus ci-dessous montre comment créer le pipeline pour le dev branche.

🔁 Répétez le processus pour qa et prod.

  1. Accédez à CodePipeline
  2. Cliquez sur « Créer un pipeline« 
  3. Nommez le pipeline <app_name>-<env>. Réglez-le sur <app_name>-dev pour commencer
  4. Sélectionnez « Nouveau rôle de service»Dans le menu Rôle de service
  5. Conserver le nom de service par défaut généré
  6. Cliquez sur « Suivant« Pour configurer les détails de la source

La source

  1. Sous Fournisseur source, choisissez « Github« 
  2. Cliquez sur « Connectez-vous à Github. » Suivez les instructions pour vous connecter à votre compte
  3. Sélectionnez le repo Github que vous avez créé précédemment et dev de la branche
  4. Sélectionnez « Webhooks Github« Pour l’option de détection des modifications
  5. Cliquez sur « Suivant« 

CodeBuild

  1. Sous Build Provider, sélectionnez « AWS CodeBuild« 
  2. Sélectionnez la région du projet CodeBuild
  3. Cliquez sur « Créer un projet« 
  4. Entrez un nom de projet, tel que, <app-name>-<env>-build
  5. Sous Image de l’environnement, sélectionnez « Image gérée« 
  6. Pour le système d’exploitation, sélectionnez « Amazon Linux 2« 
  7. Sous Runtime, sélectionnez « La norme »
  8. Sous Image, sélectionnez « aws / codebuild / amazonlinux2-x86_64-standard: 3.0.« 
  9. Définissez le type d’environnement sur « Linux« 
  10. Sous le rôle Service, sélectionnez « Créer un nouveau rôle». Entrez un nom pour le rôle, tel que <app_name>-<env>-build-role
  11. Sous Configuration supplémentaire, cliquez sur « Ajouter des variables d’environnement« 
  12. 1️⃣ Réglez la clé sur S3_BUCKET; ensemble valeur au nom du compartiment S3 où les artefacts seront stockés
  13. 2️⃣ Réglez la clé sur LAMBDA_FUNCTION_NAME; ensemble valeur au nom de la fonction Lambda à déployer
  14. 3️⃣ Réglez la clé sur BRANCHE; définir la valeur sur #{SourceVariables.BranchName}
  15. 4️⃣ Réglez la clé sur LAMBDA_DEPLOYMENT_PREFERENCE; définir la valeur sur un type de déploiement (par exemple Canary10Percent30Minutes, Linéaire10PercentEvery1Minute, AllAtOnce)
  16. Sous Spécifications de construction, sélectionnez « Utilisez un fichier Buildspec« 
  17. Optionnel: Sélectionnez Journaux S3 dans la section Journaux si vous souhaitez que les journaux soient également écrits dans un compartiment S3
  18. Cliquez sur « Continuer vers le pipeline de code. »
  19. Assurez-vous que le projet de construction que vous venez de créer a été sélectionné dans la liste déroulante Nom du projet
  20. Laissez le type de build comme « Construction unique« 
  21. Cliquez sur « Suivant« 

Mise à jour IAM

🔀 Détour: mettons à jour le rôle IAM créé ci-dessus pour CodeBuild afin de fournir un accès à S3 puisque le processus de génération copie le code dans S3.

  1. Accédez à IAM
  2. Cliquez sur Rôles dans le menu de gauche
  3. Recherchez le nom du rôle créé ci-dessus
  4. Cliquez sur le nom du rôle pour l’ouvrir
  5. Cliquez sur « Joindre des politiques« 
  6. Cliquez sur « Créer une politique« 
  7. Clique sur le JSON languette
  8. Copiez le code ICI dans l’éditeur. Il donnera accès au compartiment S3 et à la table Dynamodb. ⚠️ Mettez à jour les variables listées en haut du code et supprimez ces lignes une fois que les variables ont été mises à jour⚠️
  9. Cliquez sur « Politique de révision »
  10. Entrez un nom pour la stratégie, tel que code-build-s3-lambda-policy
  11. Cliquez sur « Créer une politique« 
  12. Clique le Icône de rafraîchissement sur la page Politique
  13. Recherchez le nom de la stratégie qui vient d’être créée et ajoutez-la au rôle
  14. Cliquez sur « Joindre la politique« 

Génial! Désormais, le rôle CodeBuild dispose d’un accès S3 et Lambda. Il est temps de passer à autre chose!

CodeDeploy

  1. Pour le fournisseur de déploiement, sélectionnez « AWS CloudFormation« 
  2. Pour le mode action, sélectionnez « Créer ou mettre à jour une pile« 
  3. Entrez un nom pour la pile à créer, tel que, <app-name>-cf-stack
  4. Sous Modèle, sélectionnez « BuildArtifact » dans la liste déroulante des noms d’artefact
  5. Entrer packaged.yaml pour le nom du fichier
  6. Sélectionner CAPABILITY_NAMED_IAM et CAPABILITY_AUTO_EXPAND sous les capacités. En savoir plus sur ces autorisations ICI.
  7. Sous Nom du rôle, sélectionnez le rôle CloudFormation créé précédemment (cf-deploy-role)
  8. Cliquez sur « Suivant« 
  9. Assurez-vous que tout est exact. Cliquez sur « Créer un pipeline« 
  10. ⚠️ Une fois le pipeline créé, il sera automatiquement déclenché pour la première exécution

CodePipeline

  1. Accédez à CodePipeline
  2. Utilisez l’interface utilisateur pour suivre la progression de chaque étape du pipeline
  3. Cliquez sur Afficher les détails sous chaque étape pour obtenir plus d’informations et déboguer en cas d’échec

CloudFormation

  1. Accédez à CloudFormation
  2. Cliquez sur la pile créée précédemment
  3. Cliquez sur l’onglet Evénements dans les détails de la pile
  4. Cliquez sur le bouton d’actualisation dans le coin supérieur droit pour actualiser la liste des événements et suivre la création / les mises à jour de la pile
  5. Notez si des erreurs se produisent et travaillez à les résoudre

CodeDeploy

  1. Accédez à CodeDeploy
  2. Cliquez sur Déploiements dans le menu de gauche sous CodeDeploy
  3. Cliquez sur l’ID de déploiement du déploiement qui vient d’être créé et suivez la progression via l’interface utilisateur. Cela peut être instantané ou prendre 10 minutes en fonction de la préférence de déploiement que vous avez spécifiée précédemment
CloudFormation a déclenché le déploiement de CodeDeploy

S3

  1. Accédez à S3
  2. Ouvrez le bucket créé précédemment pour stocker les artefacts
  3. Il doit maintenant contenir le code lambda versionné dans les dossiers zip

Fonction Lambda

  1. Accédez à Lambda dans AWS Management Console
  2. Cliquez sur Fonctions
  3. Recherchez la fonction que vous avez spécifiée précédemment en tant que variable d’environnement (LAMBDA_FUNCTION_NAME)
  4. Ouvrez la fonction en cliquant sur le nom de la fonction
  5. Cliquez sur le menu déroulant Qualificateurs en haut à droite et vous devriez voir les versions Lambda et l’alias default
  6. C’est tout! Vous avez couvert toutes les bases et vous êtes assuré que tous les composants fonctionnent! Maintenant, envoyez simplement les modifications à Github et il devrait déployer automatiquement le code sur Lambda 🍻

Défis communs

1. État de la pile CloudFormation: UPDATE_ROLLBACK_COMPLETE

  • La première exécution du pipeline échoue au stade du déploiement lors de la création d’une pile. Vous essayez de réessayer l’étape de déploiement mais obtenez l’erreur suivante: Failed to update stack. Current status: UPDATE_ROLLBACK_COMPLETE.
  • Une fois qu’une pile a été dans l’état ROLLBACK, elle ne peut pas être mise à jour. Vous DEVEZ supprimer la pile avant de continuer.
  1. Accédez à CloudFormation
  2. Cliquez sur Piles pour obtenir la liste des piles.
  3. Recherchez la pile créée par le CodePipeline.
  4. Cliquez sur le bouton radio à côté et cliquez sur Supprimer.
  5. Apportez des modifications au pipeline et réessayez. 🔁