Lambda en couches : AWS SAM et Python
Un peu de réutilisation de code ne fait jamais de mal.
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.
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 :
il affichera le résumé
et créera le dossier du projet avec la structure et certains fichiers. Le fichier template.yaml est assez standard.
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
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.