Passer au contenu

Comment puis-je utiliser une fonction Lambda pour recevoir des alertes SNS lorsqu'une tâche AWS Glue échoue lors d’une nouvelle tentative ?

Lecture de 5 minute(s)
0

Je souhaite utiliser une fonction AWS Lambda pour recevoir une alerte Amazon Simple Notification Service (Amazon SNS) lorsque ma tâche AWS Glue échoue lors d'une nouvelle tentative.

Brève description

Vous pouvez créer une fonction Lambda qui vérifie l'événement entrant pour une chaîne spécifique. Si la chaîne de l'événement correspond à celle de la fonction Lambda, celle-ci publie un message sur Amazon SNS.

Pour recevoir une notification Amazon SNS lorsqu'une tâche AWS Glue échoue après une nouvelle tentative, créez une rubrique Amazon SNS et un abonnement. Puis, créez une fonction Lambda. Utilisez Amazon EventBridge pour lancer des notifications par e-mail.

Résolution

Prérequis :

  • Une tâche extraction, transformation et chargement (ETL) AWS Glue existante.
  • Un rôle AWS Identity and Access Management (IAM) pour Lambda qui inclut l'autorisation de publier des notifications Amazon SNS.

Créer une rubrique Amazon SNS et un abonnement

Procédez comme suit :

  1. Ouvrez la console Amazon SNS.
  2. Choisissez Rubriques, puis Créer une rubrique.
  3. Dans Type, sélectionnez Standard.
  4. Dans Nom, saisissez le nom de votre rubrique.
  5. (Facultatif) Dans Nom d'affichage, saisissez le nom d'affichage de votre rubrique.
  6. Sélectionnez Créer une rubrique.
  7. Sur la page Rubrique, choisissez Créer un abonnement, puis procédez comme suit : 
    Dans ARN de rubrique, choisissez votre rubrique. 
    Dans Protocole, choisissez la méthode de notification, telle que E-mail.
    Dans Point de terminaison, saisissez l’adresse de réception des notifications Amazon SNS.
  8. Sélectionnez Créer un abonnement.

Créer une fonction AWS Lambda

Procédez comme suit :

  1. Ouvrez la console Lambda.

  2. Sélectionnez Créer une fonction.

  3. Sur la page Créer une fonction, procédez comme suit :
    Sélectionnez Créer à partir de zéro.
    Dans le champ Nom de la fonction, saisissez le nom de votre fonction.
    Pour Exécution, choisissez une version de Python disponible.
    Développez la liste déroulante Modifier le rôle d'exécution par défaut.
    Dans Rôle d'exécution, sélectionnez Utiliser un rôle existant.
    Dans Rôle existant, sélectionnez le rôle IAM autorisé à envoyer des notifications Amazon SNS.

  4. Sélectionnez Créer une fonction.

  5. Dans l'onglet Code, dans la section Source du code, sélectionnez Fichier, puis Nouveau fichier.

    Attribuez un nom au fichier, puis saisissez le code suivant :

    import json
    import logging
    import boto3
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    client = boto3.client('sns')
    
    SNS_TOPIC_ARN = "REPLACE_WITH_YOUR_SNS_TOPIC_ARN"
    
    def lambda_handler(event, context):
        logger.info(f"## INITIATED BY EVENT: \n{event['detail']}")
    
        glue_job_name = event['detail']['jobName']
        jobrun_id = event['detail']['jobRunId']
    
        if jobrun_id.endswith('_attempt_1'):
            logger.info(f'## GLUE JOB FAILED RETRY: {glue_job_name}')
            message = (
                f"A Glue job failed after retrying.\n"
                f"Job name: {glue_job_name}\n"
                f"JobRun ID: {jobrun_id}"
            )
            client.publish(
                TargetArn=SNS_TOPIC_ARN,
                Message=json.dumps({'default': json.dumps(message)}),
                Subject='AWS Glue Job Retry Failure Notification',
                MessageStructure='json'
            )

    Remarque : Remplacez SNS_TOPIC_ARN par l'ARN de votre rubrique Amazon SNS.

  6. Sélectionnez Fichier, puis Enregistrer.

  7. Dans Nom de fichier, saisissez un nom de fichier.

  8. Choisissez Déployer.

(Facultatif) Pour tester l'événement, procédez comme suit :

  1. Choisissez l'onglet Test.

  2. Pour Nom de l'événement, saisissez le nom.

    Dans le corps JSON de l'événement, saisissez le code suivant :

    {    "version": "0",
        "id": "abcdef01-1234-5678-9abc-def012345678",
        "detail-type": "Glue Job State Change",
        "source": "aws.glue",
        "account": "123456789012",
        "time": "2017-09-07T06:02:03Z",
        "region": "us-west-2",
        "resources": [],
        "detail": {
            "jobName": "MyTestJob",
            "severity": "ERROR",
            "state": "FAILED",
            "jobRunId": "jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef_attempt_1",
            "message": "JobName:MyTestJob and JobRunId:jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef failed to execute with exception Role arn:aws:iam::123456789012:role/Glue_Role should be given assume role permissions for Glue Service."
        }
    }

    Remarque : Remplacez MyTestJob par le nom de votre tâche AWS Glue.

  3. Sélectionnez Enregistrer les modifications, puis Test.

  4. Afficher le résultat de l'exécution qui s'affiche.

  5. Vérifiez que vous recevez une alerte Amazon SNS.

Utiliser Amazon EventBridge pour lancer des notifications par e-mail

Procédez comme suit :

  1. Ouvrez la console EventBridge.

  2. Dans le volet de navigation, sélectionnez Règles, puis Créer une règle.

  3. Sur la page Créer une règle, procédez comme suit :
    Dans Nom, saisissez le nom de la règle.
    (Facultatif) Dans Description, saisissez la description de la règle.
    Dans Définir un modèle, sélectionnez Modèle d’événement.
    Dans Modèle de correspondance d’événement, sélectionnez Modèle personnalisé.
    Dans Modèle d'événement, saisissez le modèle suivant ou le vôtre :

    {  
    "detail-type": [ "Glue Job State Change"],
      "source": ["aws.glue"],
      "detail": {
        "state": ["FAILED"]
      }
    }
  4. Sélectionnez Enregistrer.

  5. Dans la section Sélectionner des cibles, procédez comme suit :
    Dans Cible, sélectionnez Fonction Lambda.
    Dans Fonction, choisissez votre fonction Lambda.

  6. Sélectionnez Suivant, puis Créer une règle.

Tester un échec avec votre tâche AWS Glue

Procédez comme suit :

  1. Ouvrez la console AWS Glue.
  2. Dans le volet de navigation, choisissez Tâches, puis sélectionnez la tâche AWS Glue que vous souhaitez tester.
  3. Choisissez la liste déroulante Action, puis sélectionnez Modifier la tâche.
  4. Développez Configuration de sécurité, bibliothèques de scripts et paramètres de tâche (facultatif).
  5. Dans Configuration de la sécurité, pour Nombre de nouvelles tentatives, saisissez 1.
  6. Sélectionnez Enregistrer.
  7. Sur la page Tâches, sélectionnez la tâche AWS Glue.
  8. Choisissez la liste déroulante Action, puis sélectionnez Modifier le script.
  9. Modifiez un élément de votre code afin que votre tâche échoue. Par exemple, ajoutez « _BROKEN » à un nom de table.
  10. Sélectionnez Enregistrer.
  11. Sur la page Tâches, sélectionnez la tâche AWS Glue.
  12. Choisissez la liste déroulante Action, puis sélectionnez Exécuter la tâche.

Lorsque la tâche AWS Glue échoue une deuxième fois, vérifiez que vous recevez la notification Amazon SNS. Vérifiez si votre point de terminaison configuré reçoit une notification. Puis, supprimez l'élément que vous avez modifié dans votre code pour que votre tâche échoue.

Informations connexes

Événements sur Amazon EventBridge

Configuration des notifications Amazon SNS

Résolution des problèmes liés à Amazon EventBridge

AWS OFFICIELA mis à jour il y a un an