Lambda en couches : AWS SAM et Python

Un peu de réutilisation de code ne fait jamais de mal.

Sommaire

Voici les instructions étape par étape sur la façon d’ajouter des couches à AWS Lambdas - en Python. Nous utiliserons le code de base généré par l’exemple de modèle standard HelloWorld.

letters-layers

Et oui, bien sûr, vous devez avoir tout Python et les choses AWS SAM préinstallées et configurées.

Génération et exécution du projet d’exemple

Appelez maintenant sam init et répondez aux questions de la manière standard, comme suit :

sam-init-answers

il affichera le résumé

sam-init-summary

et créera le dossier du projet avec la structure et certains fichiers. Le fichier template.yaml est assez standard.

vs-code-template-yaml

ainsi que le code de la fonction (je nettoierai les commentaires générés supplémentaires)

import json

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }

Maintenant, construisons et appelons localement cette fonction

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

La fin de la réponse devrait être proche de celle ci-dessous :

.....
START RequestId: 6da35464-7c6a-40b2-bcc0-60796994317a Version: $LATEST
END RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599
REPORT RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599  Init Duration: 0.04 ms  Duration: 28.40 ms      Billed Duration: 29 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}

Ajout de la couche

Ajouter la description de la couche à template.yaml

Deux parties :

  • ApiSharedLayer - bloc décrivant la couche
  • Layers: … - !Ref ApiSharedLayer - dans la fonction qui l’utilise
.....
Resources:
# added code start
    ApiSharedLayer:
        Type: AWS::Serverless::LayerVersion
        Properties:
            ContentUri: api_shared_layer/
            LayerName: api-shared-layer
            Description: My api-shared-layer
            CompatibleRuntimes:
                - python3.9
            RetentionPolicy: Delete                
        Metadata:
            BuildMethod: python3.9   # Required to have AWS SAM build this layer
# added code end

  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
# added code start
      Layers:
        - !Ref ApiSharedLayer
# added code end
      Events:
.....

Ajouter le code de la couche

dans le dossier api_shared_layer ajoutez un peu de code

layer code

Mettre à jour la fonction pour utiliser ce code

import json
from api_version import API_VERSION

def lambda_handler(event, context):

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            "version": API_VERSION
        }),
    }

Exécution de test

À nouveau :

sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json

La fin de la réponse devrait être proche de celle ci-dessous :

.....
START RequestId: 88eb1887-ae94-479d-a059-f87c4b71a282 Version: $LATEST
END RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf
REPORT RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf  Init Duration: 0.72 ms  Duration: 34.80 ms      Billed Duration: 35 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\", \"version\": \"1.1.1\"}"}

Très bien.

Liens utiles