web-dev-qa-db-fra.com

Comment puis-je tester lambda en local en utilisant python?

Existe-t-il un moyen de tester aws lambda en local? Je sais qu'il y a un paquet dont le nom est "localstack" mais il semble qu'il n'y ait pas beaucoup de gens qui l'ont essayé.

14
user6922072

Vous pouvez exécuter vos fonctions Lambda de la même manière que vous exécuteriez n'importe quel script python par exemple.

if __name__ == "__main__":
    event = []
    context = []
    lambda_handler(event, context)

Si vous utilisez des environnements virtuels, cela vous garantit que toutes les dépendances requises sont installées pour votre fonction lambda avec la bonne version python.

Y a-t-il des services supplémentaires dont vous avez besoin qui sont présents dans "localstack" que vous n'avez pas localement?

16
apoclyps

Je pense que Moto , une bibliothèque qui permet à vos tests de simuler facilement les services AWS, pourrait être très utile.

Imaginez que vous ayez le code python suivant que vous souhaitez tester:

 import boto3

 class MyModel(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value

    def save(self):
        s3 = boto3.client('s3', region_name='us-east-1')
        s3.put_object(Bucket='mybucket', Key=self.name, Body=self.value)

Prenez une minute pour réfléchir à la façon dont vous auriez pu tester cela dans le passé.

Maintenant, voyez comment vous pouvez le tester avec Moto:

import boto3
from moto import mock_s3
from mymodule import MyModel

@mock_s3
def test_my_model_save():
conn = boto3.resource('s3', region_name='us-east-1')
# We need to create the bucket since this is all in Moto's 'virtual' AWS account
conn.create_bucket(Bucket='mybucket')

model_instance = MyModel('steve', 'is awesome')
model_instance.save()

body = conn.Object('mybucket', 'steve').get()['Body'].read().decode("utf-8")

assert body == b'is awesome'    

Lorsque le décorateur termine le test, tous les appels à s3 sont automatiquement simulés. La maquette conserve l'état des seaux et des clés.

7
Janis Karklins

J'ai utilisé Python Lambda Local dans pip, https://pypi.python.org/pypi/python-lambda-local

J'espère que cela vous aide.

6
develoser

[Cela a changé un tas depuis la question d'origine]

Se moquer des services AWS est difficile car ils changent. Idéalement, vous utilisez le service en direct dans votre environnement de développement. Le problème avec les services en direct a été la nécessité de déployer pour .. attendre .. tester chaque changement.

Si vous avez seulement besoin de développer ou de déboguer la fonction lambda elle-même, l'appel local AWS SAM CLI est un bon choix.

Si vous devez également appeler d'autres services tels que S3, Dynamodb, etc., la CLI Stackery est une extension de la CLI AWS SAM conçue pour se développer contre des ressources de cloud en direct avec les autorisations de cloudstack.

L'interface CLI Stackery est indépendante du langage et gratuite, mais voici un démarrage rapide sans serveur Python de quelques autres ressources .

2
Abnerg