Wie kann ich eine AWS-Glue-Aufgabe in einem AWS-Konto basierend auf dem Status einer AWS-Glue-Aufgabe in einem anderen Konto auslösen?

Lesedauer: 7 Minute
0

Ich möchte eine Pipeline erstellen, in der der Abschluss einer AWS-Glue-Aufgabe in einem AWS-Konto einen Crawler in einem anderen Konto startet.

Kurzbeschreibung

Sie können AWS-Glue-Datenkatalog-Objekte erstellen, die als Auslöser bezeichnet werden. Auslöser können entweder manuell oder automatisch einen oder mehrere Crawler oder ETL-Aufgaben starten, aber diese Funktion kann nur innerhalb eines AWS-Kontos verwendet werden. Sie können diese Auslöser nicht verwenden, um Crawler oder ETL-Aufgaben zu starten, die sich in einem anderen AWS-Konto befinden. Verwenden Sie Amazon EventBridge und AWS Lambda, um eine AWS-Glue-Aufgabe in einem AWS-Konto basierend auf dem Status einer Aufgabe in einem anderen Konto auszulösen.

Lösung

Das folgende Beispiel gibt einen Überblick darüber, wie Sie EventBridge und eine Lambda-Funktion verwenden können, um Ihren Anwendungsfall zu erreichen. Nehmen wir an, Sie haben zwei AWS-Glue-Aufgaben, wobei Aufgabe 1 in AWS-Konto A und Aufgabe 2 in AWS-Konto B ausgeführt wird. Aufgabe 2 ist von Aufgabe 1 abhängig.

  1. Erstellen Sie einen benutzerdefinierten Event Bus in AWS-Konto B und eine EventBridge-Regel in AWS-Konto A. Die EventBridge-Regel in Konto A sucht nach der AWS-Glue-Aufgabe 1 im Status ERFOLGREICH. Das Ziel ist dann der Event Bus, der in AWS-Konto B erstellt wurde.
  2. Erstellen Sie eine Lambda-Funktion in AWS-Konto B, die AWS-Glue-ETL-Aufgabe 2 auslöst.
  3. Erstellen Sie eine EventBridge-Regel in Konto B mit dem benutzerdefinierten Event Bus, den Sie in Schritt 1 erstellt haben. Fügen Sie eine Regel hinzu, die auf AWS-Glue-Aufgabe 1 im Status ERFOLGREICH und die zuvor erstellte Lambda-Funktion als Ziel überwacht. Das Ziel löst die AWS-Glue-ETL-Aufgabe 2 aus, wenn das Ereignis mithilfe von AWS-Glue-API-Aufrufen eintrifft.

Weitere Informationen finden Sie in der Liste der von AWS Glue generierten Amazon CloudWatch Events, die in EventBridge-Regeln verwendet werden können.

Erstellen Sie einen benutzerdefinierten Event Bus in Konto B

1.    Öffnen Sie in Konto B EventBridge. Wählen Sie Event Buses und dann Event Bus erstellen. Fügen Sie diese ressourcenbasierte Richtlinie hinzu:

{
  "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>"
    }
  ]
}

Hinweis: Achten Sie darauf, die Beispiel-Elemente in <> durch Ihre eigenen Daten zu ersetzen. Ersetzen Sie beispielsweise <Account-B CustomEventBus Name>durch den Namen des Event Bus, den Sie in Konto B erstellt haben.

2.    Nachdem Sie den Event Bus erstellt haben, notieren Sie sich seinen ARN.

3.    Wählen Sie den benutzerdefinierten Event Bus aus, den Sie erstellt haben, und wählen Sie dann Aktionen.

4.    Wählen Sie Erkennung starten.

Erstellen Sie die Ereignisregel in Konto A für Aufgabe 1

1.    Öffnen Sie von Konto A aus die EventBridge-Konsole.

2.    Wählen Sie Regeln und dann für Event Bus die Option Standard aus.

3.    Wählen Sie Regel erstellen aus. Fügen Sie einen Namen hinzu, und wählen Sie dann für Regeltyp die Option Regel mit einem Ereignismuster aus.

4.    Wählen Sie auf der Seite Ereignismuster erstellen unter Erstellungsmethode die Option Regel mit einem Ereignismuster aus. Fügen Sie diesen JSON hinzu:

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

Hinweis: Stellen Sie sicher, dass Sie <Job 1 name> durch den Namen der AWS-Glue-Aufgabe ersetzen, den Sie verwenden.

5.    Wählen Sie als Zieltypen****EventBridge-Event Bus und dann Event Bus in einem anderen AWS-Konto oder einer anderen Region aus.

6.    Geben Sie den ARN des Event Bus ein, den Sie zuvor in Konto B erstellt haben. Dieser ARN wird als Ziel verwendet.

7.    Wählen Sie für Ausführungsrolle die Option Neue Rolle für diese spezifische Ressource erstellen aus. Wenn Sie stattdessen Bestehende Rolle verwenden wählen, stellen Sie sicher, dass Ihre Richtlinie für AWS Identity and Access Management (IAM) über die folgenden Berechtigungen verfügt:

{
  "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>"
      ]
    }
  ]
}

Hinweis: Stellen Sie sicher, dass Sie <Account-B CustomEventBus Name> in diesem Beispiel durch den Namen des Event Bus ersetzen, den Sie in Konto B erstellt haben.

8.    Wählen Sie Weiter, überprüfen Sie Ihre Einstellungen und wählen Sie dann Erstellen.

Erstellen Sie eine Lambda-Funktion in Konto B mit einem Ziel, das AWS-Glue-Aufgabe 2 startet

1.    Öffnen Sie die Lambda-Konsole.

2.    Wählen Sie Funktionen und dann Funktion erstellen.

3.    Geben Sie einen Funktionsnamen ein und wählen Sie für Laufzeit die Python 3.x-Version.

4.    Wählen Sie unter Standard-Ausführungsrolle ändern die Option Neue Rolle mit grundlegenden Lambda-Berechtigungen erstellen aus.

5.    Wenn Sie eine vorhandene Rolle verwenden, stellen Sie sicher, dass sie über die erforderlichen Berechtigungen verfügt. Ist dies nicht der Fall, fügen Sie diese Berechtigungen mithilfe der IAM-Konsole hinzu. Fügen Sie zunächst die AWSGlueServiceRole-(AWS-Verwaltungsrichtlinie) hinzu. Geben Sie Lambda dann die IAM-Berechtigungen für die Ausführung auf der Grundlage von Ereignissen:

{
  "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>:*"
      ]
    }
  ]
}

Hinweis: Achten Sie darauf, die Beispiel-Elemente in <> durch Ihre eigenen Daten zu ersetzen. Ersetzen Sie beispielsweise <Account-B ID> durch die Konto-ID für Konto B

6.    Wählen Sie Funktion erstellen.

7.    Fügen Sie im Code-Abschnitt der Funktion, die Sie erstellt haben, diesen Code hinzu:

# 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.

Hinweis: Stellen Sie sicher, dass Sie <Job 2 Name> durch den Namen der AWS-Glue-Aufgabe ersetzen, die Sie in Konto A verwenden.

8.    Wählen Sie Bereitstellen. Sie können die Funktion jetzt testen, um zu überprüfen, ob sie Aufgabe 2 in Konto B auslöst.

Erstellen Sie eine Ereignisregel in Konto B für Aufgabe 1

1.    Öffnen Sie von Konto B aus die EventBridge-Konsole.

2.    Wählen Sie Regeln und dann den Event Bus aus, den Sie zuvor erstellt haben.

3.    Erstellen Sie eine neue Regel unter dem Event Bus. Geben Sie einen Regelnamen ein, und wählen Sie für Regeltyp die Option Regel mit einem Ereignismuster aus.

4.    Wählen Sie auf der Seite Ereignismuster erstellen unter Erstellungsmethode die Option Benutzerdefiniertes Muster aus, und fügen Sie dann diesen JSON hinzu:

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

Hinweis: Stellen Sie sicher, dass Sie <Job 1 name> durch den Namen der AWS-Glue-Aufgabe ersetzen, den Sie in Konto B verwenden.

5.    Wählen Sie auf der Seite Ziele auswählen für Zieltypen die Option AWS-Service aus.

6.    Wählen Sie unter Ziel auswählen die Lambda-Funktion oder geben Sie sie ein, und wählen Sie dann die Funktion, die Sie zuvor erstellt haben, aus der Dropdown-Liste.

7.    Wählen Sie Weiter, überprüfen Sie Ihre Einstellungen und wählen Sie dann Erstellen.

Testen Sie Ihren kontoübergreifenden AWS-Glue-Aufgabe-Auslöser

1.    Führen Sie Aufgabe 1 in Konto A aus. Wenn die Aufgabe abgeschlossen ist, wird der Status ERFOLGREICH an den Event Bus in Konto A gesendet.

2.    Konto A sendet die Veranstaltungsinformationen an den Event Bus in Konto B.

3.    Der Event Bus in Konto B führt die Ereignisregel aus. Diese Ereignisregel löst die Lambda-Funktion in Konto B aus, um Lambda-Protokolle zu überprüfen. Öffnen Sie die Amazon-CloudWatch-Konsole, wählen Sie Protokollgruppen und wählen Sie dann Ihre Lambda-Funktionsgruppe aus. Die Funktionsgruppe hat das Format /aws/lambda/<LambdaFunctionName>.

4.    Die Lambda-Funktion löst Aufgabe 2 in Konto B aus.


Ähnliche Informationen

Senden und Empfangen von Amazon-EventBridge-Ereignissen zwischen AWS-Konten

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr