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

Date de la dernière mise à jour : 30/03/2021

Je souhaite être averti par une alerte Amazon Simple Notification Service (Amazon SNS) lorsqu'une nouvelle tentative d'exécution de ma tâche AWS Glue échoue.

Brève description

Les événements Amazon EventBridge pour AWS Glue peuvent être utilisés pour créer des alertes Amazon SNS, mais ces dernières peuvent ne pas être suffisamment spécifiques dans certains cas. Pour recevoir des notifications SNS pour certains événements AWS Glue lorsqu'une nouvelle tentative d'exécution d'une tâche AWS Glue échoue, vous pouvez utiliser AWS Lambda. Vous pouvez créer une fonction Lambda pour effectuer les opérations suivantes :

  1. Vérifiez l'événement entrant d'une chaîne.
  2. Publiez un message sur Amazon SNS si la chaîne de l'événement correspond à la chaîne de la fonction Lambda.

Pour utiliser une fonction AWS Lambda pour recevoir un e-mail de SNS lorsqu'une nouvelle tentative d'exécution d'une vos tâches AWS Glue échoue, procédez comme suit :

  1. Créez une rubrique Amazon SNS.
  2. Créez une fonction AWS Lambda.
  3. Créez un événement Amazon EventBridge qui utilise la fonction Lambda pour lancer des notifications par e-mail.

Solution

Vérifiez que vous disposez de ce qui suit :

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

Création d'une rubrique Amazon SNS

  1. Ouvrez la console Amazon SNS.
  2. Choisissez Rubriques, puis Créer une rubrique.
  3. Dans Type, sélectionnez Standard.
  4. Pour Nom, entrez le nom de la rubrique.
  5. (Facultatif) Dans Nom complet, saisissez le nom complet de votre rubrique.
  6. Choisissez Créer une rubrique.
    Votre rubrique est créée.
  7. Sélectionnez Créer un abonnement.
    Pour ARN de rubrique, sélectionnez la rubrique que vous avez créée.
    Pour Protocole, sélectionnez le protocole souhaité.
    Pour Point de terminaison, entrez l'adresse à laquelle vous souhaitez recevoir les notifications SNS.
  8. Sélectionnez Créer un abonnement.
    Votre abonnement est créé.

Créer une fonction AWS Lambda

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.
Pour Nom de fonction, entrez un nom pour votre fonction.
Pour Exécution, sélectionnez l'une des options Python (pour la compatibilité des scripts, Python 3.7 est recommandé).
Développez la liste déroulante Modifier le rôle d'exécution par défaut .
Pour Rôle d'exécution, sélectionnez Utiliser un rôle existant.
Pour Rôle existant, sélectionnez le rôle IAM avec l'autorisation d'envoyer des notifications SNS.

4.    Sélectionnez Créer une fonction.
Votre fonction Lambda est créée.

5.    Sous l'onglet Code, dans la section Source du code, choisissez Fichier, puis Nouveau fichier.
Dans le nouveau fichier, entrez un code similaire au suivant :

# Import modules
import boto3
import json
import os
import logging
# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Set up Boto 3 client for SNS
client = boto3.client('sns')
# Variables for the SNS:
snsTopicARN = "arn:aws:sns:us-east-1:012345627499:Glue_Job_Failure_Notification"
# Define Lambda function
def lambda_handler(event, context):
    logger.info('## INITIATED BY EVENT: ')
    logger.info(event['detail'])
    # Define variables based on the event
    glueJobName = event['detail']['jobName']
    jobRunId = event['detail']['jobRunId']
    # Only send SNS notification if the event pattern contains _attempt_1
    if event['detail']['jobRunId'].endswith('_attempt_1'):
        logger.info('## GLUE JOB FAILED RETRY: ' + glueJobName)
    message = \
        "A Glue Job has failed after attempting to retry. JobName: " \
        + glueJobName + ", JobRunID: " + jobRunId
    print(message)
    response = client.publish(
        TargetArn=snsTopicARN,
        Message=json.dumps({'default': json.dumps(message)}),
        Subject='An AWS Glue Job has failed',
        MessageStructure='json')

Remarque : veillez à remplacer snsTopicARN par l'ARN de votre rubrique SNS.
Choisissez Fichier, puis Enregistrer.
Pour Nom de fichier, entrez le nom de fichier de votre choix.

6.    Choisissez Déployer.

(Facultatif) Vous pouvez tester votre événement en procédant comme suit :

1.    Sélectionnez l'onglet Tester.

Dans Nom, entrez le nom de l'événement. Entrez le JSON semblable à ce qui suit :

{
    "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 : veillez à remplacer MaTâched'Essai par le nom de votre tâche AWS Glue.

2.    Choisissez Enregistrer les modifications.

3.    Choisissez Tester.

4.    Consultez le résultat de l'exécution qui s'ouvre une fois le test terminé.

5.    Vérifiez que vous recevez une notification SNS.

Utiliser Amazon EventBridge pour lancer des notifications par e-mail

1.    Ouvrez la console EventBridge.

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

3.    Sur la page Créer une règle, procédez comme suit :

Dans Nom, entrez le nom de la règle.
(Facultatif) Pour Description – facultative, entrez la description de la règle.
Pour Définir le modèle, sélectionnez Modèle d'événement.
Pour Modèle de correspondance d'événements, sélectionnez Modèle personnalisé.
Pour Modèle d'événement, saisissez le modèle suivant ou un modèle de votre choix :

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

Sélectionnez Enregistrer.
Dans la section Sélectionner des cibles, procédez comme suit :
Pour Cible, choisissez la fonction Lambda
Pour Fonction, choisissez la fonction que vous avez créée.

4.    Choisissez Créer.

Tester la notification avec votre tâche AWS Glue

  1. Ouvrez la console AWS Glue.
  2. Dans le volet de navigation, choisissez Tâches.
  3. Sélectionnez la tâche Glue dans laquelle vous souhaitez tester la notification.
  4. Choisissez la liste déroulante Action, puis choisissez Modifier la tâche.
  5. Développez Configuration de sécurité, bibliothèques de scripts et paramètres de travail (facultatif).
  6. Sous Configuration de sécurité, dans Nombre de tentatives, entrez 1.
  7. Sélectionnez Enregistrer.
  8. Sur la page Tâches,sélectionnez le travail Colle dans lequel vous souhaitez tester la notification.
  9. Choisissez la liste déroulante Action, puis choisissez Modifier le script.
  10. Modifiez un élément de votre code pour que votre tâche échoue. (Exemple : ajoutez le mot « _BROKEN » à un nom de table).
  11. Sélectionnez Enregistrer.
  12. Sur la page Tâches,sélectionnez le travail Colle dans lequel vous souhaitez tester la notification.
  13. Choisissez la liste déroulante Action, puis Choisissez Exécuter la tâche.
    Vous devez recevoir une notification lors de la deuxième tentative qui échoue.
  14. Une fois le test terminé, modifiez votre tâche Glue et annulez les modifications.

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?