Python >> Tutoriel Python >  >> Python

Comment surveiller les fonctions Python sur AWS Lambda avec Sentry

Amazon Web Services (AWS) Lambda est un service de calcul basé sur l'utilisation qui peut exécuter du code Python 3. Des erreurs peuvent se produire dans n'importe quel environnement dans lequel vous exécutez votre application, il est donc nécessaire de disposer d'une surveillance fiable pour avoir une visibilité lorsqu'un problème survient.

Dans cet article, nous installerons et configurerons le service de surveillance des applications de Sentry qui fonctionne spécifiquement pour le code exécuté sur AWS Lambda.

Dépendances des applications

Un environnement de développement local n'est pas nécessaire pour suivre ce didacticiel, car tout le codage et la configuration peuvent s'effectuer dans un navigateur Web via la console AWS.

L'exemple de code peut être copié et collé à partir de cet article de blog ou vous pouvez y accéder sur GitHub sous le référentiel Full Stack Python blog-post-examples dans le répertoire monitor-python-aws-lambda-sentry.

Accéder au service AWS Lambda

Connectez-vous à votre compte AWS existant ou créez un nouveau compte. Lambd vous offre gratuitement le premier million de requêtes afin que vous puissiez exécuter des applications de base sans frais ou à faible coût.

Lorsque vous vous connectez à votre compte, utilisez le champ de recherche pour saisir "lambda" et sélectionnez "Lambda" lorsqu'il apparaît pour accéder à la bonne page.

Si vous avez déjà utilisé Lambda auparavant, vous verrez vos fonctions Lambda existantes dans un tableau consultable. Nous allons créer une nouvelle fonction donc cliquez sur le bouton "Créer une fonction".

La page de création de fonction vous donnera plusieurs options pour démarrer une nouvelle fonction Lambda.

Cliquez sur la boîte de sélection "Parcourir le référentiel d'applications sans serveur", puis choisissez l'application de démarrage "hello-world-python3" dans la section "Applications publiques".

La page de détails de l'application de démarrage hello-world-python3 devrait ressembler à l'écran suivant :

Remplissez un exemple de texte tel que "test" sous IdentityNameParameter et cliquez sur le bouton "Déployer" :

La fonction va maintenant être déployée. Dès qu'il est prêt, nous pouvons le personnaliser et le tester avant d'ajouter Sentry pour capturer toutes les erreurs qui se produisent lors de l'exécution.

Tester l'application Python de démarrage

Revenez à la page principale des fonctions Lambda et sélectionnez votre nouvelle application de démarrage déployée dans la liste.

Trouvez le bouton orange "Tester" avec une flèche vers le bas à côté comme vous le voyez dans l'image ci-dessous, puis cliquez sur la flèche vers le bas. Sélectionnez "Configurer l'événement de test".

Remplissez le nom de l'événement comme "FirstTest" ou quelque chose de similaire, puis appuyez sur le bouton "Créer" en bas de la fenêtre modale.

Cliquez sur le bouton "Tester" et il exécutera la fonction Lambda avec les paramètres de ce nouvel événement de test. Vous devriez voir quelque chose comme la sortie suivante :

Response
"value1"

Function Logs
START RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Version: $LATEST
value1 = value1
value2 = value2
value3 = value3
END RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914
REPORT RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914  Duration: 0.30 ms   Billed Duration: 1 ms   Memory Size: 128 MB Max Memory Used: 43 MB  Init Duration: 1.34 ms

Request ID
62fa2f25-669c-47b7-b4e7-47353b0bd914

Cela signifie que le cas de test a réussi, mais que se passe-t-il même s'il y a une simple erreur dans le code, comme essayer d'accéder à une variable non déclarée ?

Allez dans l'éditeur de code et vous devriez voir le code de démarrage comme ceci :

Mettez à jour le code avec la nouvelle ligne en surbrillance, qui tente d'accéder à une quatrième variable, qui n'existe pas dans la configuration de test avec laquelle nous essayons de l'exécuter.

import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    print("value4 = " + event['key4'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

Après avoir ajouté cette nouvelle ligne de code, appuyez sur le bouton "Déployer", puis sur le bouton "Tester". Vous devriez voir une sortie d'erreur :

Response
{
  "errorMessage": "'key4'",
  "errorType": "KeyError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      11,
      "lambda_handler",
      "print(\"value4 = \" + event['key4'])"
    ]
  ]
}

Function Logs
START RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb Version: $LATEST
value1 = value1
value2 = value2
value3 = value3
'key4': KeyError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 11, in lambda_handler
    print("value4 = " + event['key4'])
KeyError: 'key4'

END RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb
REPORT RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb  Duration: 0.81 ms   Billed Duration: 1 ms   Memory Size: 128 MB Max Memory Used: 43 MB  Init Duration: 1.61 ms

Request ID
a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb

Il est évident que lorsque nous travaillons dans la console, une erreur vient de se produire. Cependant, dans la plupart des cas, une erreur se produit sporadiquement, c'est pourquoi nous avons besoin d'un système de surveillance en place pour détecter et signaler ces exceptions.

Surveillance des fonctions AWS Lambda avec Sentry

Le moyen le plus simple d'ajouter Sentry à Lambda pour cette application consiste à configurer une couche AWS Lambda avec la dépendance nécessaire pour Sentry. Sentry dispose d'une documentation concise sur l'ajout de couches Lambda. Nous allons donc parcourir cette méthode pour la configurer et la tester.

Tout d'abord, faites défiler jusqu'à la section « Couches » dans la configuration de votre fonction Lambda. Cliquez sur le bouton "Ajouter un calque" :

Dans l'écran "Ajouter une couche", sélectionnez l'option "Spécifier un ARN".

Maintenant, pour spécifier l'Amazon Resource Name (ARN), nous devons utiliser la documentation Sentry pour obtenir la bonne chaîne de configuration.

US-East-1 est la région la plus ancienne et la plus couramment utilisée, je vais donc l'utiliser ici dans ce didacticiel, mais vous devriez vérifier dans laquelle vous vous trouvez si vous n'êtes pas certain.

Copiez cette valeur dans la configuration de la couche Lambda, comme ceci :

Appuyez ensuite sur le bouton "Ajouter". Vous avez maintenant la dépendance Sentry dans votre environnement afin que le code qui s'appuie sur cette bibliothèque puisse être utilisé dans la fonction Lambda.

Ensuite, nous devons accéder au tableau de bord Sentry pour créer un projet, obtenir notre identifiant unique et le connecter à notre fonction Lambda.

Sentry peut être auto-hébergé ou utilisé comme service cloud via Sentry.io. Nous utiliserons la version hébergée dans le cloud car elle est plus rapide que la configuration de votre propre serveur et gratuite pour les petits projets.

Accédez à la page d'accueil de Sentry.io.

Connectez-vous à votre compte ou créez un nouveau compte gratuit. Vous serez sur le tableau de bord du compte principal après vous être connecté ou avoir terminé le processus d'inscription Sentry.

Il n'y a pas encore d'erreurs enregistrées sur le tableau de bord de notre compte, ce qui est normal car nous n'avons pas encore connecté notre compte à notre fonction Lambda.

Cliquez sur "Projets" dans la barre de navigation de gauche, puis sur "Créer un projet" dans le coin supérieur droit.

Sous "Choose a Platform", sélectionnez "Serverless" puis "AWS Lambda (Python)" comme indiqué ci-dessous :

Décidez selon quels critères il doit envoyer les informations d'erreur hors de Lambda. Pour ce didacticiel, nous lui ferons envoyer chaque exception. Cliquez ensuite sur "Créer un projet". bouton.

Vous pouvez demander à Sentry de gérer l'instrumentation automatiquement, mais nous la gérerons manuellement pour notre fonction. Sur l'écran suivant, Sentry vous fournira votre chaîne DSN unique, dont nous aurons besoin pour notre fonction.

En règle générale, vous souhaiterez utiliser des variables d'environnement sur le magasin AWS Lambdato et accéder à des valeurs telles que votre clé Sentry.

Copiez le contenu de la chaîne Sentry DSN et accédez à la console Lambda pour créer une nouvelle variable d'environnement. Pour ce faire, cliquez sur l'onglet "Configuration" dans Lambda comme vous le voyez ici :

Cliquez ensuite sur "Modifier" et ajoutez une nouvelle variable d'environnement avec la clé de SENTRY_DSN et la valeur de la chaîne DSN que vous avez copiée à partir de l'écran Sentry.

Cliquez sur le bouton "Enregistrer" et revenez au code de votre fonction Lambda.

Mettez à jour votre fonction Lambda avec les nouvelles lignes de code en surbrillance suivantes pour envoyer les erreurs à Sentry.

import json
import os
import sentry_sdk
from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration

SENTRY_DSN = os.environ.get('SENTRY_DSN')
sentry_sdk.init(
    dsn=SENTRY_DSN,
    integrations=[AwsLambdaIntegration()]
)

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    print("value4 = " + event['key4'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

Cliquez sur le bouton "Déployer" puis sur "Tester". Le code générera une erreur et lorsque nous reviendrons à notre tableau de bord Sentry, nous le verrons capturé et visible pour une inspection plus approfondie.

Ça marche! Ensuite, vous voudrez probablement ajuster vos critères de rapport d'exceptions pour vous assurer d'être alerté du bon nombre d'exceptions si vous ne voulez pas toutes les voir.

Quelle est la prochaine ?

Nous venons d'écrire et d'exécuter une fonction Python 3 sur AWS Lambda, puis de capturer le message d'exception dans les journaux Sentry. Vous pouvez maintenant continuer à développer votre code Python en sachant que si quelque chose ne va pas, vous aurez une visibilité totale sur ce qui s'est passé.

Consultez la section AWS Lambda pour plus de didacticiels par d'autres développeurs.

D'autres questions? Contactez-moi sur Twitter@fullstackpythonor @mattmakai. Je suis également sur GitHub avec le nom d'utilisateur mattmakai.

Quelque chose ne va pas avec ce message ? La source de cette page sur GitHuband soumet une pull request.