Créer une fonction Lambda avec Cloud Formation

Photo by C Dustin on Unsplash

 

Automatisation avec l’Infrastructure as Code

L’avènement du « Cloud Computing » permet aux équipes de développement et celles chargées des opérations de collaborer davantage. Ensemble, elles peuvent, par exemple, créer des applications capables d’allouer des ressources au moment où elles en ont besoin. Les temps de réponse sont meilleurs. La facture est réduite.

Aujourd’hui, le Cloud offre de nombreux avantages, comme la possibilité de créer et déployer des infrastructures sous-jacentes en quelques minutes.

Néanmoins, plusieurs changements doivent être effectués pour pouvoir en faire un avantage.

Ces changements sont entre autres :

  • définir les modèles des nouveaux services,
  • automatiser leur déploiement, la gestion des configurations/mise à jour,
  • monitorer les performances,
  • remonter les alertes
  • et surtout intégrer les processus de développement.

Le Cloud a amené une évolution du rôle des opérateurs. En effet, aujourd’hui, ils doivent au mieux tirer profit de la virtualisation en déléguant les opérations d’infrastructure qui étaient auparavant leur responsabilité.

La façon dont une application est créée, produite, déployée et mise à jour est à revoir.
Mais plusieurs questions se posent, comment gérer son cycle de vie, ses ressources, ses configurations, son déploiement, ses mises à jour, sa supervision et son contrôle d’accès ?

Le poste du développeur ne constitue que la première brique de l’infrastructure hébergeant le cycle de développement d’une application. En effet, elle suppose la mise en œuvre de multiples plateformes : plateforme de test, d’intégration, de préproduction, de production.
Chacun de ces environnements doit refléter l’environnement de production. À chaque instant, il doit pouvoir être rapidement cloné pour vérifier le comportement d’un correctif à chaud, par exemple. Cloner un environnement implique d’être en mesure de mettre à disposition les ressources matérielles correspondantes, de le configurer avec le déploiement de l’ensemble des caractéristiques systèmes et applicatif requises. Ces opérations peuvent être automatisées en utilisant différentes techniques de scripting.

L’infrastructure as code (IaC) devient alors un élément essentiel pour permettre aux équipes de gestion opérationnelle de pouvoir proposer des services tout en suivant les évolutions de nos jours.

 

L’infrastructure as Code, quésaco ?

L’infrastructure as Code ou IaC fait référence à possibilité de pouvoir construire et gérer une infrastructure virtuelle à travers du code. Une infrastructure virtuelle comprend les serveurs, la mise en réseau, équilibrage de charge et la sécurité.

Pourquoi ?

L’utilisation de l’infrastructure as code profère certains avantages que l’on peut citer :

  • la réduction des coûts : l’utilisation de l’IaC permet d’une certaine manière de réduire les coûts, car il nous évite de passer un certain temps sur des configurations matérielles ou logicielles, qui peuvent engendrer des coûts significatifs. De plus, l’IaC permet de provisionner et de détruire des ressources à la volée en fonction des besoins, cela permet d’éviter de payer pour des ressources non utilisées.
  • la réduction des risques : l’automatisation de processus fiables ne requiert aucune action humaine, ce qui évite toute maladresse liée à une mauvaise manipulation simple ou répétitive. Il devient donc possible de développer le code qui construit l’infrastructure et de mettre en application de nombreuses bonnes pratiques et outils issus de l’expérience du développement. On peut par exemple, mentionner le versioning dans un contrôle de code source. Il devient, par la même occasion, possible de procéder à un retour arrière à chaque incrément de l’évolution d’une infrastructure.
  • la rapidité d’exécution : l’automatisation permet aux équipes chargées du développement de l’application, de se focaliser sur la conception de l’application sans se préoccuper de son déploiement ce qui apporte un gain de temps important.
  • une meilleure collaboration entre les équipes : le code peut être facilement partagé à tous les membres participant au projet du développement de l’application pour valider ou corriger le code. Ce qui va permettre de partager la responsabilité avec tous les membres et ainsi de casser « le mur de la confusion ».

Les outils

Il existe plusieurs outils qui permettent d’utiliser l’IaC pour interagir avec le Cloud, mais ces outils n’ont pas tous la même fonction. Il existe plusieurs catégories d’outils permettant d’écrire une infrastructure en tant que code.

Nous pouvons citer les outils de scripting classiques de type bashpythonruby,… qui vont être utilisés pour automatiser tout ce qui peut être fait à la main.
Les outils de gestion de configurations tels que ChefPuppetAnsible, vont être utilisés pour installer et gérer des applications dans un ou plusieurs serveurs existants.
Nous avons ensuite les outils de templates serveur tels que DockerPackerVagrant qui vont nous permettre de créer une image serveur pré-configuré qui va être déployé à l’aide d’outils comme Ansible sur plusieurs serveurs.
Enfin, nous avons les outils de provisioning tels que Cloud FormationTerraformOpenStackHeat, qui vont servir à créer les serveurs qui vont être configurés par les outils de configuration. Nous allons, au cours de cet article de blog, nous concentrer sur l’outil Cloud Formation fourni par AWS pour rester sur une optique d’utilisation des outils AWS.

 

Cloud Formation, c’est quoi ?

Cloud Formation est service AWS pour l’Infrastructure as Code. Il a joué un rôle dans la popularité d’AWS.
Avant de commencer la démonstration, il est important de rappeler le rôle et le fonctionnement du service Cloud Formation. Cloud Formation permet de manière déclarative, de spécifier des groupes de ressources en langage JSON ou YAML. Chaque ressource déclarée est créée de manière conforme aux spécifications renseignées sur le code en JSON.

Il est toujours plus simple de comprendre en illustrant par un exemple. Dans cet article nous déploierons une simple fonction Lambda NodeJs en utilisant Cloud Formation. La fonction NodeJs peut-être récupérée dans un bucket S3, mais pour cet exemple nous allons simplement nous contenter de décrire la fonction directement dans un code YAML.

Pour rappel, Lambda est un service proposé par AWS qui permet d’exécuter du code en réponse à des événements, sans se soucier des ressources nécessaires à son exécution (serverless).

Pratique

Nous commençons par créer un rôle IAM qui va être attribué à la ressource Lambda que l’on va créer. Dans cet exemple, nous allons créer un rôle RootRole qui sera assumé par le service Lambda.

Resources:
  RootRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
  • AssumeRolePolicyDocument correspond à la stratégie (Policy) d’approbation associée à ce rôle.
  • ManagedPolicyArns va servir à spécifier la stratégie que l’on souhaite attacher à l’utilisateur.

Création d’une Lambda avec Cloud Formation

  Lambda1:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        ZipFile: !Sub |
            exports.handler = async (event) => {
                const response = {
                    statusCode: 200,
                    body: JSON.stringify('Hello from Lambda!'),
                };
                return response;
            };
      Description: Test with CloudFormation
      FunctionName: HelloWorldNodeJs
      Handler: index.handler
      Role: !GetAtt RootRole.Arn
      Runtime: "nodejs10.x"
  • ZipFile permet de spécifier le code source (NodeJs ou Python) directement dans la configuration. Cloud Formation s’occupera d’ajouter le code dans un fichier index.js qu’il compressera pour créer un package de déploiement.
  • Handler correspond au nom de la méthode au sein du code que Lambda appelle pour exécuter notre fonction. Il inclut le nom du fichier, donc doit obligatoirement commencer par index.

Ensuite, nous allons enregistrer le code au format YAML. Pour appliquer ce code, il suffit de créer une nouvelle pile Cloud Formation (avec de nouvelles ressources) et spécifier le nouveau fichier que l’on vient de créer. Une fois ceci fait, nous pouvons procéder à la création de la pile.

Pour les plus courageux, le déploiement peut aussi se faire via ligne de commandes.
Nous pouvons utiliser la commande suivante pour déployer la nouvelle pile :

foo@bar:~$ aws cloudformation deploy --template-file ./lambda-helloworld-njs.yml --stack-name LambdaHelloWorldJs --capabilities CAPABILITY_IAM

Nous précisons le paramètre --capabilities pour spécifier que nous sommes OK pour créer une ressource liée à IAM.
Nous pouvons supprimer la pile à l’aide de la commande suivante :

foo@bar:~$ aws cloudformation delete-stack --stack-name LambdaHelloWorldJs

 

Conclusion

Comme nous avons pu le voir à travers cette démonstration, Cloud Formation est un outil indispensable pour toutes les tâches qui peuvent être automatisées.
Cette manière de définir son infrastructure nous amène à réellement prendre en main notre infrastructure de manière rapide et efficace.
En effet, la possibilité de construire toute son infrastructure avec du code nous permet de rapidement déployer de nouvelles fonctionnalités tout en gardant une vue globale de son infrastructure.

Pour aller plus loin :

Et si vous souhaitez vous former sur Amazon Web Services, découvrez notre offre de formations AWS.