Comment puis-je déclencher une tâche AWS Glue dans un compte AWS en fonction du statut d'une tâche AWS Glue dans un autre compte ?

Lecture de 7 minute(s)
0

Je souhaite créer un pipeline dans lequel l'exécution d'une tâche AWS Glue dans un compte AWS lance un crawler dans un autre compte.

Brève description

Vous pouvez créer des objets du catalogue de données AWS Glue appelés déclencheurs. Les déclencheurs peuvent démarrer manuellement ou automatiquement une ou plusieurs tâches crawlers ou ETL, mais cette fonctionnalité ne peut être utilisée que dans un seul compte AWS. Vous ne pouvez pas utiliser ces déclencheurs pour démarrer des tâches crawler ou ETL résidant dans un autre compte AWS. Pour déclencher une tâche AWS Glue dans un compte AWS en fonction du statut d'une tâche dans un autre compte, utilisez Amazon EventBridge et AWS Lambda.

Résolution

L'exemple suivant donne un aperçu de la manière dont vous pouvez utiliser EventBridge et une fonction Lambda pour réaliser votre cas d'utilisation. Supposons que vous ayez deux tâches AWS Glue, où la tâche 1 s'exécute dans le compte AWS A et la tâche 2 s'exécute dans le compte AWS B. La tâche 2 dépend de la tâche 1.

  1. Créez un bus d'événements personnalisé dans le compte AWS B et une règle EventBridge dans le compte AWS A. La règle EventBridge du compte A surveille la tâche AWS Glue 1 à l'état SUCCESSED. Ensuite, la cible est le bus d'événements créé dans le compte AWS B.
  2. Créez une fonction Lambda dans le compte AWS B qui déclenche AWS Glue ETL Job 2.
  3. Créez une règle EventBridge dans le compte B à l'aide du bus d'événements personnalisé que vous avez créé à l'étape 1. Ajoutez une règle qui surveille la présence d'AWS Glue Job 1 à l'état SUCCEEDED et la fonction Lambda créée précédemment en tant que cible. La cible déclenche l'AWS Glue ETL Job 2 lorsque l'événement arrive à l'aide d'appels d'API AWS Glue.

Pour plus d'informations, consultez la liste des événements Amazon CloudWatch générés par AWS Glue qui peuvent être utilisés dans les règles EventBridge.

Créez un bus d'événements personnalisé dans le compte

1.    Dans le compte B, ouvrez EventBridge. Choisissez Bus d'événements, puis choisissez Créer un bus d'événements. Ajoutez cette politique basée sur les ressources :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "allow_account_to_put_events",
      "Effect": "Allow",
      "Principal": {
        "AWS": "<Account-A ID>"
      },
      "Action": "events:PutEvents",
      "Resource": "arn:aws:events:<Account-B Region>:<Account-B ID>:event-bus/<Account-B CustomEventBus Name>"
    }
  ]
}

Remarque : veillez à remplacer les exemples d'éléments dans <> par vos propres informations. Par exemple, remplacez <Account-B CustomEventBus Name>par le nom du bus d'événements que vous avez créé dans le compte B.

2.    Après avoir créé le bus d'événements, notez son ARN.

3.    Choisissez le bus d'événements personnalisé que vous avez créé, puis choisissez Actions.

4.    Choisissez Start Discovery.

Créez la règle d'événement dans le compte A pour Job 1

1.    Depuis le compte A, ouvrez la console EventBridge.

2.    Choisissez Rules, puis pour Event bus (Bus d’événement), choisissez Default.

3.    Choisissez Créer une règle. Ajoutez un Nom, puis, pour le type de règle, choisissez Rule with an event pattern (Règle avec un modèle d’événement).

4.    Sur la page Créer un modèle d'événement, sous Méthode de création, choisissez Règle avec un modèle d'événement. Ajoutez ce JSON :

{
  "source": ["aws.glue"],
  "detail-type": ["Glue Job State Change"],
  "detail": {
    "jobName": ["<Job 1 name>"],
    "severity": ["INFO"],
    "state": ["SUCCEEDED"]
    }
}

Remarque : veillez à remplacer <Job 1 name> par le nom de la tâche AWS Glue que vous utilisez.

5.    Pour les types de cibles, choisissez EventBridge EventBus, puis choisissez Event Bus dans un autre compte ou une autre région AWS.

6.    Entrez l'ARN du bus d'événements que vous avez créé précédemment dans le compte B. Cet ARN est utilisé comme cible.

7.    Pour Rôle d'exécution, choisissez Créer un nouveau rôle pour cette ressource spécifique. Si vous choisissez plutôt Utiliser le rôle existant, assurez-vous que votre politique AWS Identity and Access Management (IAM) dispose des autorisations suivantes :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "events:PutEvents"
      ],
      "Resource": [
        "arn:aws:events:<Account-B Region>:<Account-B ID>:event-bus/<Account-B CustomEventBus Name>"
      ]
    }
  ]
}

Remarque : <Account-B CustomEventBus Name>dans cet exemple, veillez à remplacer le par le nom du bus d'événements que vous avez créé dans le compte B.

8.    Choisissez Next, vérifiez vos paramètres, puis choisissez Create (Créer).

Créez une fonction Lambda dans le compte B avec une cible qui lance AWS Glue Job 2

1.    Ouvrez la console Lambda.

2.    Choisissez Fonctions, puis choisissez Créer une fonction.

3.    Entrez un nom de fonction et, pour Runtime, choisissez la version Python 3.x.

4.    Pour Modifier le rôle d'exécution par défaut, choisissez Créer un nouveau rôle avec les autorisations Lambda de base.

5.    Si vous utilisez un rôle existant, assurez-vous qu'il possède les autorisations requises. Si ce n'est pas le cas, ajoutez ces autorisations à l'aide de la console IAM. Tout d'abord, ajoutez le rôle AWSGlueServiceRole (politique de gestion AWS). Donnez ensuite à Lambda les autorisations IAM pour qu'il s'exécute en fonction des événements :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "logs:CreateLogGroup",
      "Resource": "arn:aws:logs:<Account-B Region>:<Account-B ID>:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": [
        "arn:aws:logs:<Account-B Region>:<Account-B ID>:log-group:/aws/lambda/<Lambda Function Name>:*"
      ]
    }
  ]
}

Remarque : veillez à remplacer les exemples d'éléments dans <> par vos propres informations. Par exemple, <Account-B ID>remplacez-le par l'identifiant du compte B

6.    Choisissez Créer une fonction.

7.    Dans la section code de la fonction que vous avez créée, ajoutez le code suivant :

# Set up logging
import json
import os
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Import Boto 3 for AWS Glue
import boto3
client = boto3.client('glue')

# Variables for the job: 
glueJobName = "<Job 2 Name>"

# Define Lambda function
def lambda_handler(event, context):
    logger.info('## INITIATED BY EVENT: ')
    response = client.start_job_run(JobName = glueJobName)
    logger.info('## STARTED GLUE JOB: ' + glueJobName)
    logger.info('## GLUE JOB RUN ID: ' + response['JobRunId'])
    return response.

Remarque : assurez-vous remplacer <Job 2 Name> par le nom de la tâche AWS Glue que vous utilisez dans le compte A.

8.    Choisissez Deploy (Déployer). Vous pouvez maintenant tester la fonction pour vérifier qu'elle déclenche le Job 2 dans le compte B.

Création d'une règle d'événement dans le compte B pour Job 1

1.    Depuis le compte B, ouvrez la console EventBridge.

2.    Choisissez Règles, puis choisissez le bus d'événements que vous avez créé précédemment.

3.    Créez une nouvelle règle dans le bus d'événements. Entrez un nom de règle et, pour Type de règle, choisissez Règle avec un modèle d'événement.

4.    Sur la page Créer un modèle d'événement, sous Méthode de création, choisissez Modèle personnalisé, puis ajoutez ce JSON :

{
  "source": ["aws.glue"],
  "detail-type": ["Glue Job State Change"],
  "detail": {
    "jobName": ["<Job 1 name>"],
    "severity": ["INFO"],
    "state": ["SUCCEEDED"]
  }
}

Remarque : assurez-vous de remplacer <Job 1 name> par le nom de la tâche AWS Glue que vous utilisez dans le compte B.

5.    Sur la page Sélectionner les cibles, pour les types de cibles, choisissez le service AWS.

6.    Pour Sélectionner une cible, choisissez ou tapez fonction Lambda, puis choisissez la fonction que vous avez précédemment créée dans la liste déroulante.

7.    Choisissez Next, vérifiez vos paramètres, puis choisissez Create (Créer).

Testez votre déclencheur de tâches AWS Glue multicomptes

1.    Exécutez la tâche 1 dans le compte A. Lorsque la tâche est terminée, un état RÉUSSI est envoyé au bus d'événements du compte A.

2.    Le compte A envoie les informations relatives à l'événement au bus d'événements du compte B.

3.    Le bus d'événements du compte B exécute la règle des événements. Cette règle d'événement déclenche la fonction Lambda dans le compte B. Pour consulter les journaux Lambda, ouvrez la console Amazon CloudWatch, choisissez Groupes de journaux, puis choisissez votre groupe de fonctions Lambda. Le groupe de fonctions est au format /aws/lambda/<LambdaFunctionName>.

4.    La fonction Lambda déclenche la tâche 2 dans le compte B.


Informations connexes

Envoi et réception d'événements Amazon EventBridge entre comptes AWS

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an