Getty Images/iStockphoto

AWS : comment créer une fonction Lambda avec CloudFormation

Sur AWS, il existe plusieurs moyens d'améliorer l’automatisation, la cohérence, l’évolutivité et la rentabilité de vos applications. Suivez ce tutoriel étape par étape sur la création d’une fonction AWS Lambda à l’aide de CloudFormation.

Il existe différentes façons de créer des fonctions AWS Lambda, notamment avec AWS Management Console, AWS CLI et des outils tiers. Ce tutoriel se concentre sur AWS CloudFormation, un outil d’infrastructure as code qui automatise le lancement et la gestion des composants d’infrastructure AWS.

CloudFormation prend en charge la plupart des ressources AWS (Amazon Web Services), dont les fonctions Lambda, qui sont un composant basé sur le cloud largement utilisé dans de nombreuses applications modernes. Les fonctions Lambda mettent en œuvre des ressources de calcul en mode « serverless ». Les développeurs n’ont pas à gérer directement l’infrastructure sous-jacente. Elles constituent un moyen fiable et agile de mettre en œuvre la logique des applications logicielles.

Il est important de se familiariser avec l’ensemble du processus et de tirer parti de ces outils qui aident les propriétaires d’applications à lancer des logiciels dans le cloud. Dans ce tutoriel, je me concentrerai sur les étapes nécessaires pour lancer des fonctions Lambda à l’aide de CloudFormation. Nous verrons comment créer un fichier modèle et une pile CloudFormation, qui est le regroupement des ressources AWS définies dans le modèle.

Créer un modèle AWS CloudFormation

Un modèle CloudFormation comporte plusieurs sections utilisées pour définir la stack, telles que la description, les paramètres, les mappings, les ressources et les sorties. La plus pertinente est la section des ressources, qui permet de définir un composant AWS. Dans le cas des fonctions Lambda, cela se fait en suivant le template ci-dessous au format YAML :

Type: AWS::Lambda::Function

Properties:

  <Lambda function configurations>

CloudFormation prend en charge plus de 20 propriétés lors de la définition d’une fonction Lambda. À proprement parler, il n’y en a que deux d’obligatoires : « code » et « role ». Ces configurations définissent l’emplacement du code source que la fonction utilisera et le rôle IAM qui sera attribué pour accorder les autorisations d’exécution de la fonction. Dans cet exemple, je configurerai le code comme un fichier zip stocké dans S3. Les autres options consistent à spécifier l’emplacement d’une image Docker d’Amazon Elastic Container Registry ou à spécifier le code lui-même en ligne.

Créer un rôle IAM

Cet exemple inclura un rôle IAM créé manuellement avec les autorisations minimales requises par une fonction Lambda. Cela peut être fait à partir de la console AWS IAM. Déclenchez le flux « Create Role » et choisissez le service AWS comme type d’entité :

Choisir le service AWS comme type d'entité pour créer un rôle IAM
Choisir le service AWS comme type d'entité pour créer un rôle IAM

La politique AWSLambdaBasicExecutionRole fournit l’ensemble minimum d’autorisations requises par une fonction Lambda pour fonctionner, ce qui inclut l’écriture de données dans les Logs CloudWatch. Dans le cas de fonctions Lambda plus sophistiquées qui interagissent avec d’autres services AWS tels que S3 et DynamoDB, attribuez des autorisations IAM supplémentaires à ce rôle IAM. Attribuez également le nombre minimum d’autorisations en fonction de l’objectif de chaque fonction Lambda.

Attacher des politiques au nouveau rôle pour la fonction Lambda
Attacher des politiques au nouveau rôle pour la fonction Lambda

Créer un fichier avec le code source

Une fois que vous avez terminé ce flux et créé le rôle IAM, utilisez le nom de ressource Amazon (ARN) dans le modèle CloudFormation. L’autre condition préalable pour cet exemple est de créer un fichier avec le code source de la fonction Lambda – dans ce cas, je l’ai appelé index.py – et de l’empaqueter dans un fichier. zip puis de le télécharger dans un bucket S3. Voici un exemple de code de fonction Python « Hello World » très basique :

import json

def lambda_handler(event, context):

    print("Received event: " + json.dumps(event))

    print("Hello World")

    return event

J’utilise un fichier zip stocké dans S3 nommé my-source-code.zip. Il nécessite les propriétés CloudFormation du gestionnaire et de l’exécution. En outre, il est toujours utile de définir d’autres propriétés non obligatoires, telles que FunctionName, description et tags. Le bloc de la fonction Lambda ressemblera à ceci :

Resources:
  ExampleFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: ExampleFunction
      Description: "Lambda example"
      Code:
        S3Bucket: s3-bucket-name
        S3Key: my-source-code.zip
      Role: arn:aws:iam::<aws-account-id>:role/<role-name>
      Handler: index.lambda_handler
      Runtime: python3.11
      Tags:
        - Key: stage
          Value: <deployment-stage>
        - Key: <other-key>
          Value: <key-value>

Il est bon de se familiariser avec d’autres configurations, qui ne sont pas abordées dans cet exemple, mais qui peuvent s’avérer très utiles en fonction des besoins de votre application. Il s’agit notamment des configurations suivantes :

  • Architectures (x86_64 or arm64).
  • CodeSigningConfigArn.
  • DeadLetterConfig.
  • Environment.
  • EphemeralStorage.
  • FileSystemConfigs.
  • ImageConfig.
  • KmsKeyArn.
  • Layers.
  • LoggingConfig.
  • MemorySize.
  • ReservedConcurrentExecutions.
  • RuntimeManagementConfig
  • SnapStart.
  • Timeout.

Créer la stack AWS CloudFormation

Une fois que le modèle est prêt et que vous avez téléchargé le fichier zip du code sur S3, l’étape suivante consiste à créer la pile CloudFormation. Dans la console CloudFormation, cliquez sur « Create stack » (créer une pile) et sélectionnez « With new resources (standard) » (avec de nouvelles ressources - standard).

Créer une stack CloudFormation
Créer une stack CloudFormation

L’étape suivante consiste à définir les options du modèle. Dans cet exemple, nous utilisons un modèle enregistré localement. Sélectionnez Template is ready, Upload a template file, puis sélectionnez le fichier de modèle spécifique.

Séléctionnez Template is Ready, puis Upload a Template file
Séléctionnez Template is Ready, puis Upload a Template file

Puis l’on fournit un nom de pile. Si des paramètres de stack sont définis dans le modèle, ils sont définis ici.

l'encart pour nommer la stack

La prochaine étape consiste à définir les options de la pile, telles que les balises, les autorisations et les options d’échec de la stack. Dans cet exemple, nous laisserons la configuration par défaut et procéderons à l’étape de confirmation finale. Dans l’onglet des événements, vous pouvez voir l’état de la création de la pile et des ressources.

Notez que l’onglet des ressources affiche les composants AWS gérés par la stack récemment créée. Dans la plupart des cas, il affiche un lien qui permet d’accéder à la console de service AWS pour cette ressource spécifique. Dans cet exemple, le lien dirige les utilisateurs vers la console Lambda.

l'onglet ressources de la console AWS

Dans l’onglet code, vous pouvez voir le code source de la fonction, tester la fonction et configurer des entrées personnalisées avec des événements de test.

Après avoir créé la pile, définissez les mises à jour ultérieures des ressources AWS existantes dans le modèle CloudFormation, puis appliquez-les à la stack CloudFormation, si nécessaire. Vous pouvez le faire à l’aide de l’opération UpdateStack qui est déclenchée soit par la CLI, le SDK ou la console AWS.

l'onglet code de la console AWS

AWS CloudFormation vs SAM (Serverless Application Model)

Alors qu’AWS a publié le modèle d’application serverless (SAM), un outil simplifié pour gérer les fonctions Lambda et d’autres composants serverless, CloudFormation est le service AWS fondamental pour mettre en œuvre l’infrastructure as code sur le cloud d’Amazon. Le framework SAM est une extension de CloudFormation, il génère automatiquement des modèles et des piles CloudFormation lors de la définition des composants serverless.

Même si SAM est un moyen très utile et fiable de gérer les applications serverless, l’utilisation de la syntaxe CloudFormation ordinaire est également un bon moyen de lancer des fonctions Lambda, en particulier lorsqu’il est nécessaire de gérer des composants dans la même stack que les fonctions Lambda.

Pour approfondir sur IaaS