Création d’une application avec diffusion continue dans la console Lambda - AWS Lambda

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.

Création d’une application avec diffusion continue dans la console Lambda

Vous pouvez utiliser la console Lambda pour créer une application avec un pipeline de distribution continue intégré. Avec une distribution continue, chaque modification que vous transmettez à votre référentiel de contrôle source déclenche un pipeline qui génère et déploie automatiquement votre application. La console Lambda fournit des projets de démarrage pour les types d’applications courants avec un exemple de code Node.js et des modèles qui créent des ressources de support.

Dans ce didacticiel, vous allez créer les ressources suivantes.

  • Application – Fonction Lambda Node.js, spécification de génération et modèle AWS Serverless Application Model (AWS SAM).

  • Pipeline – Pipeline AWS CodePipeline reliant les autres ressources pour permettre une livraison continue.

  • Référentiel – Référentiel Git dans AWS CodeCommit. Lorsque vous envoyez une modification, le pipeline copie le code source dans un compartiment Amazon S3 et le transmet au projet de génération.

  • Déclencheur : règle Amazon EventBridge (CloudWatch Events) qui surveille la branche principale du référentiel et déclenche le pipeline.

  • Projet de création : génération AWS CodeBuild qui obtient le code source du pipeline et conditionne l’application en package. Le code source inclut une spécification de génération avec des commandes qui installent des dépendances et préparent le modèle d’application à déployer.

  • Configuration du déploiement : l’étape de déploiement du pipeline définit un ensemble d’actions qui prennent le modèle AWS SAM traité à partir de la sortie de création et déploient la nouvelle version avec AWS CloudFormation.

  • Compartiment : compartiment Amazon Simple Storage Service (Amazon S3) pour le stockage d’artefacts de déploiement.

  • Rôles – Les phases source, génération et déploiement du pipeline ont des rôles IAM qui leur permettent de gérer les ressources AWS. La fonction de l’application a un rôle d’exécution qui lui permet de télécharger des journaux et qui peut être étendue pour accéder à d’autres services.

Vos ressources d’application et de pipeline sont définies dans des modèles AWS CloudFormation que vous pouvez personnaliser et étendre. Votre référentiel d’applications inclut un modèle que vous pouvez modifier pour ajouter des tables Amazon DynamoDB, une API Amazon API Gateway et d’autres ressources d’application. Le pipeline de distribution continue est défini dans un modèle distinct en dehors du contrôle de la source et possède sa propre pile.

Le pipeline mappe une seule branche dans un référentiel vers une seule pile d’applications. Vous pouvez créer d’autres pipelines pour ajouter des environnements pour d’autres branches dans le même référentiel. Vous pouvez également ajouter des étapes à votre pipeline pour le test, l’étape intermédiaire et des approbations manuelles. Pour plus d’informations sur AWS CodePipeline, consultez Qu’est-ce qu’un AWS CodePipeline.

Prérequis

Ce didacticiel suppose que vous avez quelques connaissances des opérations Lambda de base et de la console Lambda. Si ce n’est déjà fait, suivez les instructions fournies dans Créer une fonction Lambda à l'aide de la console pour créer votre première fonction Lambda.

Pour effectuer les étapes suivantes, vous avez besoin de l’AWS Command Line Interface (AWS CLI) version 2. Les commandes et la sortie attendue sont répertoriées dans des blocs distincts :

aws --version

Vous devriez voir la sortie suivante:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

Pour les commandes longues, un caractère d’échappement (\) est utilisé pour les fractionner en plusieurs lignes.

Sur Linux et macOS, utilisez votre gestionnaire de shell et de package préféré.

Note

Sous Windows, certaines commandes CLI Bash que vous utilisez couramment avec Lambda (par exemple zip) ne sont pas prises en charge par les terminaux intégrés du système d’exploitation. Installez le sous-système Windows pour Linux afin d’obtenir une version intégrée à Windows d’Ubuntu et Bash. Les exemples de commandes CLI de ce guide utilisent le formatage Linux. Les commandes qui incluent des documents JSON en ligne doivent être reformatées si vous utilisez la CLI Windows.

Ce didacticiel est utilisé CodeCommit pour le contrôle de source. Pour configurer votre ordinateur local de façon à ce qu’il accède au code d’application et le mette à jour, consultez Configuration dans le Guide de l’utilisateur AWS CodeCommit.

Création d’une application

Créez une application dans la console Lambda. Dans Lambda, une application est une pile AWS CloudFormation avec une fonction Lambda et un certain nombre de ressources associées. Dans ce didacticiel, vous créez une application qui présente une fonction et son rôle d’exécution.

Pour créer une application
  1. Ouvrez la page Applications de la console Lambda.

  2. Choisissez Create application.

  3. Choisissez Créer à partir de zéro.

  4. Configurez les paramètres de l’application.

    • Nom : my-app.

    • Environnement d’exécutionNode.js 18.x.

    • Format du modèleAWS SAM (YAML).

    • Service de contrôle de sourceCodeCommit.

    • Nom du référentielmy-app-repo.

    • AutorisationsCreate roles and permissions boundary (Créer des rôles et des limites d’autorisations).

  5. Choisissez Créer.

Lambda crée le pipeline et les ressources associées, et valide l’exemple de code d’application dans le référentiel Git. Au fur et à mesure que les ressources sont créées, elles apparaissent sur la page d’aperçu.


        Ressources d’application de démarrage pendant le déploiement.

La pile d’infrastructure contient le référentiel, le projet de génération et d’autres ressources qui se combinent pour former un pipeline de livraison continue. Lorsque le déploiement de cette pile est terminé, elle déploie à son tour la pile d’applications qui contient la fonction et le rôle d’exécution. Il s’agit des ressources d’application qui apparaissent sous Ressources.

Invoquer la fonction

Lorsque le processus de déploiement s’achève, invoquez la fonction à partir de la console Lambda.

Invoquer la fonction de l’application
  1. Ouvrez la page Applications de la console Lambda.

  2. Choisissez my-app.

  3. Sous Ressources, sélectionnez helloFromLambdaFonction.

  4. Sélectionnez Tester).

  5. Configurez un événement de test.

    • Nom de l’événementevent

    • Corps de texte{}

  6. Sélectionnez Create (Créer).

  7. Sélectionnez Test.

La console Lambda exécute votre fonction et affiche le résultat. Développez la section Details (Détails) sous le résultat pour afficher les détails de sortie et d’exécution.


        Sortie d’une invocation de test.

Ajouter une ressource AWS

À l’étape précédente, la console Lambda a créé un référentiel Git contenant du code de fonction, un modèle et une spécification de génération. Vous pouvez ajouter des ressources à votre application en modifiant le modèle et en transmettant les modifications au référentiel. Pour obtenir une copie de l’application sur votre ordinateur local, clonez le référentiel.

Pour cloner le référentiel de projet
  1. Ouvrez la page Applications de la console Lambda.

  2. Choisissez my-app.

  3. Choisissez Code.

  4. Sous Repository details (Détails du référentiel), copiez l’URI du référentiel HTTP ou SSH, selon le mode d’authentification que vous avez défini au cours de la configuration.

  5. Pour cloner le référentiel, utilisez la commande git clone.

    git clone ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/my-app-repo

Pour ajouter une table DynamoDB à l’application, définissez une ressource AWS::Serverless::SimpleTable dans le modèle.

Pour ajouter une table DynamoDB
  1. Ouvrez template.yml dans un éditeur de texte.

  2. Ajoutez une ressource de table, une variable d’environnement qui transmet le nom de la table à la fonction et une stratégie d’autorisations qui permet à la fonction de la gérer.

    Exemple template.yml – ressources
    ... Resources: ddbTable: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/hello-from-lambda.helloFromLambdaHandler Runtime: nodejs18.x MemorySize: 128 Timeout: 60 Description: A Lambda function that returns a static string. Environment: Variables: DDB_TABLE: !Ref ddbTable Policies: - DynamoDBCrudPolicy: TableName: !Ref ddbTable - AWSLambdaBasicExecutionRole
  3. Valider et transmettre le changement.

    git commit -am "Add DynamoDB table" git push

Lorsque vous transmettez une modification, elle déclenche le pipeline de l’application. Utilisez l’onglet Deployments (Déploiements) de l’écran de l’application pour effectuer le suivi de la modification au fur et à mesure qu’elle circule dans le pipeline. Une fois le déploiement terminé, passez à l’étape suivante.


        Surveillance du déploiement d’une application dans la console Lambda.

Mettre à jour la limite des autorisations

L’exemple d’application applique une limite d’autorisations au rôle d’exécution de sa fonction. La limite des autorisations limite celles que vous pouvez ajouter au rôle de la fonction. Sans la limite, les utilisateurs disposant d’un accès en écriture au référentiel de projet pourraient modifier le modèle de projet, pour donner à la fonction l’autorisation d’accéder aux ressources et services en dehors de la portée de l’exemple d’application.

Pour que la fonction utilise l’autorisation DynamoDB que vous avez ajoutée à son rôle d’exécution à l’étape précédente, vous devez étendre la limite des autorisations pour permettre des autorisations supplémentaires. La console Lambda détecte les ressources qui ne se trouvent pas dans la limite des autorisations, et fournit une stratégie mise à jour que vous pouvez utiliser pour la mettre à jour.

Mettre à jour la limite des autorisations de l’application
  1. Ouvrez la page Applications de la console Lambda.

  2. Choisissez votre application.

  3. Sous Resources (Ressources), choisissez Edit permissions boundary (Modifier la limite des autorisations).

  4. Suivez les instructions affichées pour mettre à jour la limite afin d’autoriser l’accès à la nouvelle table.

Pour plus d’informations sur les limites d’autorisations, consultez Utilisation des limites d'autorisations pour les applications AWS Lambda.

Mettre à jour le code de la fonction

Ensuite, mettez à jour le code de fonction pour utiliser la table. Le code suivant utilise la table DynamoDB pour effectuer le suivi du nombre d’invocations traitées par chaque instance de la fonction. Il utilise l’ID du flux de journal comme identifiant unique pour l’instance de fonction.

Mettre à jour le code de la fonction.
  1. Ajoutez un nouveau gestionnaire nommé index.js dans le dossier src/handlers avec le contenu suivant.

    Exemple src/handlers/index.js
    const dynamodb = require('aws-sdk/clients/dynamodb'); const docClient = new dynamodb.DocumentClient(); exports.handler = async (event, context) => { const message = 'Hello from Lambda!'; const tableName = process.env.DDB_TABLE; const logStreamName = context.logStreamName; var params = { TableName : tableName, Key: { id : logStreamName }, UpdateExpression: 'set invocations = if_not_exists(invocations, :start) + :inc', ExpressionAttributeValues: { ':start': 0, ':inc': 1 }, ReturnValues: 'ALL_NEW' }; await docClient.update(params).promise(); const response = { body: JSON.stringify(message) }; console.log(`body: ${response.body}`); return response; }
  2. Ouvrez le modèle d’application et modifiez la valeur du gestionnaire en src/handlers/index.handler.

    Exemple template.yml
    ... helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/index.handler Runtime: nodejs8.x
  3. Valider et transmettre le changement.

    git add . && git commit -m "Use DynamoDB table" git push

Une fois le changement de code déployé, invoquez la fonction plusieurs fois pour mettre à jour la table DynamoDB.

Pour afficher la table DynamoDB
  1. Ouvrez la page Tables (Tables) de la console DynamoDB.

  2. Choisissez la table qui commence par my-app.

  3. Choisissez Items (Éléments).

  4. Choisissez Start search (Lancer la recherche).


        Table DynamoDB indiquant le nombre de fois qu’une instance d’une fonction a traité un événement.

Lambda crée des instances supplémentaires de votre fonction pour gérer plusieurs invocations simultanées. Chaque flux de CloudWatch journaux du groupe de journaux Logs correspond à une instance de fonction. Une nouvelle instance de fonction est également créée lorsque vous modifiez le code ou la configuration de votre fonction. Pour plus d’informations sur le dimensionnement, consultez Mise à l’échelle de fonction Lambda.

Étapes suivantes

Le modèle AWS CloudFormation qui définit vos ressources d’application utilise transformation AWS Serverless Application Model pour simplifier la syntaxe des définitions de ressources et automatiser le téléchargement du package de déploiement et d’autres artefacts. AWS SAM fournit également une interface de ligne de commande (CLI AWS SAM), qui possède les mêmes fonctionnalités de packaging et de déploiement que l’AWS CLI, avec des fonctionnalités supplémentaires spécifiques aux applications Lambda. Utilisez l’interface de ligne de commande (CLI) AWS SAM pour tester votre application localement dans un conteneur Docker qui émule l’environnement d’exécution Lambda.

AWS Cloud9 fournit un environnement de développement en ligne qui inclut Node.js, l’interface de ligne de commande (CLI) AWS SAM et Docker. Avec AWS Cloud9, vous pouvez commencer à développer rapidement et accéder à votre environnement de développement à partir de n’importe quel ordinateur. Pour plus d’informations, consultez Mise en route dans le Guide de l’utilisateur AWS Cloud9.

Pour le développement local, les kits d’outils AWS pour les environnements de développement intégrés (IDE) vous permettent de tester et de déboguer les fonctions avant de les transférer vers votre référentiel.

Résolution des problèmes

Au fur et à mesure que vous développez votre application, vous rencontrerez probablement les types d’erreurs suivants.

  • Erreurs de génération – Problèmes qui se produisent pendant la phase de génération, y compris les erreurs de compilation, de test et de conditionnement en package.

  • Erreurs de déploiement – Problèmes qui se produisent lorsque AWS CloudFormation n’est pas en mesure de mettre à jour la pile d’applications. Il s’agit notamment d’erreurs d’autorisations, de quotas de compte, de problèmes de service ou d’erreurs de modèle.

  • Erreurs d’invocation – Erreurs renvoyées par le code ou l’exécution d’une fonction.

Pour les erreurs de génération et de déploiement, vous pouvez en identifier la cause dans la console Lambda.

Résoudre les erreurs d’application
  1. Ouvrez la page Applications de la console Lambda.

  2. Choisissez une application.

  3. Choisissez Déploiements.

  4. Pour afficher le pipeline de l’application, choisissez Deployment pipeline (Pipeline de déploiement).

  5. Identifiez l’action qui a rencontré une erreur.

  6. Pour afficher l’erreur dans le contexte, choisissez Détails (Détails).

Pour les erreurs de déploiement survenant au cours de l'ExecuteChangeSetaction, le pipeline renvoie à une liste d'événements de pile dans la AWS CloudFormation console. Recherchez un événement présentant l’état UPDATE_FAILED. Étant donné que AWS CloudFormation est restauré après une erreur, l’événement pertinent se trouve sous plusieurs autres événements de la liste. Si AWS CloudFormation n’a pu créer aucun jeu de modifications, l’erreur s’affiche sous Change sets (Jeux de modifications) au lieu de sous Events (Événements).

Une cause fréquente d’erreurs de déploiement et d’invocation est le manque d’autorisations dans un ou plusieurs rôles. Pour les déploiements, le rôle du pipeline (CloudFormationRole) est équivalent aux autorisations utilisateur que vous utiliseriez pour mettre directement à jour une pile AWS CloudFormation. Si vous ajoutez des ressources à votre application ou activez des fonctions Lambda nécessitant des autorisations utilisateur, le rôle de déploiement est utilisé. Vous trouverez un lien vers le rôle de déploiement sous Infrastructure dans la présentation de l’application.

Si votre fonction accède à d’autres services ou ressources AWS, ou si vous activez des fonctionnalités qui requièrent des autorisations supplémentaires, le rôle d’exécution de la fonction est utilisé. Tous les rôles d’exécution créés dans votre modèle d’application sont également soumis à la limite des autorisations de l’application. Cette limite exige votre accord explicite pour l’accès à des services et ressources supplémentaires dans IAM, après avoir ajouté des autorisations au rôle d’exécution dans le modèle.

Par exemple, pour connecter une fonction à un cloud privé virtuel (VPC), vous avez besoin d’autorisations utilisateur pour décrire les ressources VPC. Le rôle d’exécution a besoin d’une autorisation pour gérer les interfaces réseau. Les étapes suivantes sont requises.

  1. Ajoutez les autorisations utilisateur requises au rôle de déploiement dans IAM.

  2. Ajoutez les autorisations du rôle d’exécution à la limite des autorisations dans IAM.

  3. Ajoutez les autorisations du rôle d’exécution au rôle d’exécution dans le modèle d’application.

  4. Valider et transmettez pour déployer le rôle d’exécution mis à jour.

Après avoir corrigé les erreurs d’autorisations, choisissez Release change (Modification de version) dans la vue d’ensemble du pipeline pour exécuter à nouveau la génération et le déploiement.

Nettoyage

Vous pouvez continuer à modifier et utiliser l’exemple pour développer votre propre application. Si vous avez terminé d’utiliser l’exemple, supprimez l’application pour éviter de payer le pipeline, le référentiel et le stockage.

Pour supprimer l’application
  1. Ouvrez la console AWS CloudFormation.

  2. Supprimez la pile d’applications – my-app.

  3. Ouvrez la console Amazon S3.

  4. Supprimez le compartiment d'artefacts — us-east-2 - 123456789012 -. my-app-pipe

  5. Retournez à la AWS CloudFormation console et supprimez la pile d'infrastructure — serverlessrepo-my-app-toolchain.

Les journaux de fonctions ne sont pas associés à la pile d’applications ou d’infrastructure dans AWS CloudFormation. Supprimez le groupe de journaux séparément dans la console CloudWatch Logs.

Pour supprimer le groupe de journaux
  1. Ouvrez la page Log groups de la CloudWatch console Amazon.

  2. Choisissez le groupe de journaux de la fonction (/aws/lambda/my-app-helloFromLambdaFunction-YV1VXMPLK7QK).

  3. Choisissez Actions, puis Delete log group (Supprimer le groupe de journaux).

  4. Sélectionnez Yes, Delete (Oui, supprimer).