¿Cómo puedo activar un trabajo de AWS Glue en una cuenta de AWS en función del estado de un trabajo de AWS Glue en otra cuenta?

8 minutos de lectura
0

Quiero crear una canalización en la que, al completar un trabajo de AWS Glue en una cuenta de AWS, se inicie un rastreador en otra cuenta.

Descripción breve

Puede crear objetos del Catálogo de datos de AWS Glue denominados activadores. Los activadores pueden iniciar de forma manual o automática uno o más rastreadores o trabajos de ETL, pero esta función solo se puede usar en una cuenta de AWS. No puede usar estos activadores para iniciar rastreadores o trabajos de ETL que residan en otra cuenta de AWS. Para activar un trabajo de AWS Glue en una cuenta de AWS en función del estado de un trabajo en otra cuenta, utilice Amazon EventBridge y AWS Lambda.

Resolución

El siguiente ejemplo proporciona una descripción general de cómo puede utilizar EventBridge y una función de Lambda para lograr su caso de uso. Supongamos que tiene dos trabajos de AWS Glue, donde el trabajo 1 se ejecuta en la cuenta A de AWS y el trabajo 2 se ejecuta en la cuenta B de AWS. El trabajo 2 depende del trabajo 1.

  1. Cree un bus de eventos personalizado en la cuenta B de AWS y una regla de EventBridge en la cuenta A. La regla de EventBridge de la cuenta A vigila si el trabajo 1 de AWS Glue se encuentra en estado SUCCEEDED (Correcto). A continuación, el objetivo es el bus de eventos creado en la cuenta B de AWS.
  2. Cree una función de Lambda en la cuenta B de AWS que active el trabajo 2 de ETL de AWS Glue.
  3. Cree una regla de EventBridge en la cuenta B con el bus de eventos personalizado que creó en el paso 1. Agregue una regla que vigile si el trabajo 1 de AWS Glue está en el estado SUCCEEDED (Correcto) y la función de Lambda creada anteriormente como objetivo. El objetivo activa el trabajo ETL 2 de AWS Glue cuando llega el evento mediante llamadas a la API de AWS Glue.

Para obtener más información, consulte la lista de Amazon CloudWatch Events generados por AWS Glue que se pueden usar en las reglas de EventBridge.

Cree un bus de eventos personalizado en la cuenta B

1.    En la cuenta B, abra EventBridge. Elija Event buses (Buses de eventos) y, a continuación, elija Create event bus (Crear bus de eventos). Agregue esta política basada en recursos:

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

Nota: Asegúrese de reemplazar los elementos de ejemplo entre <> por sus propios detalles. Por ejemplo, reemplace <Account-B CustomEventBus Name> por el nombre del bus de eventos que creó en la cuenta B.

2.    Tras crear el bus de eventos, anote su ARN.

3.    Elija el bus de eventos personalizado que creó y, a continuación, elija Actions (Acciones).

4.    Elija Start Discovery (Iniciar detección).

Cree la regla de eventos en la cuenta A para el trabajo 1

1.    Desde la cuenta A, abra la consola de EventBridge.

2.    Elija Rules (Reglas) y, a continuación, en Event bus (Bus de eventos), elija default (predeterminado).

3.    Elija Create rule (Crear regla). Agregue un Name (Nombre), y luego para Rule type (Tipo de regla) elija Rule with an event pattern (Regla con un patrón de evento).

4.    En la página Build event pattern (Crear un patrón de eventos), en Creation method (Método de creación), elija Rule with an event pattern (Regla con un patrón de eventos). Agregue este JSON:

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

Nota: Asegúrese de reemplazar <nombre de trabajo 1> por el nombre del trabajo de AWS Glue que está utilizando.

5.    Para Target types (Tipos de objetivo), elija EventBridge event bus (bus de eventos de EventBridge) y, a continuación, elija Event bus in another AWS account or Region (bus de eventos en otra cuenta o región de AWS).

6.    Ingrese el ARN del bus de eventos que creó anteriormente en la cuenta B. Este ARN se utiliza como objetivo.

7.    En Execution role (Rol de ejecución), elija Create a new role for this specific resource (Crear un nuevo rol para este recurso específico). Si elige Use existing role (Usar el rol existente) en su lugar, asegúrese de que su política de AWS Identity and Access Management (IAM) tenga los siguientes permisos:

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

Nota: Asegúrese de reemplazar el <Account-B CustomEventBus Name> de este ejemplo por el nombre del bus de eventos que creó en la cuenta B.

8.    Seleccione Next (Siguiente), revise la configuración y, a continuación, seleccione Create (Crear).

Cree una función de Lambda en la cuenta B con un objetivo que inicie trabajo 2 de AWS Glue

1.    Abra la consola de Lambda.

2.    Elija Functions (Funciones) y, a continuación, elija Create function (Crear función).

3.    Ingrese un nombre de función y, para Runtime (Tiempo de ejecución), elija Python 3.x version (Python versión 3.x).

4.    En Change default execution role (Cambiar rol de ejecución predeterminado), elija Create a new role with basic Lambda permissions (Crear un rol nuevo con permisos de Lambda básicos).

5.    Si utiliza un rol existente, asegúrese de que tenga los permisos necesarios. Si no es así, agregue estos permisos mediante la consola de IAM. Primero, agregue el AWSGlueServiceRole (política de administración de AWS). A continuación, otorgue a Lambda los permisos de IAM para que se ejecute en función de los eventos:

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

Nota: Asegúrese de reemplazar los elementos de ejemplo entre <> por sus propios detalles. Por ejemplo, reemplace <ID de la cuenta B> por el ID de cuenta de la cuenta B

6.    Elija Create function (Crear función).

7.    En la sección de código de la función que creó, agregue este código:

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

Nota: Asegúrese de reemplazar <nombre de trabajo 2> por el nombre del trabajo de AWS Glue que está utilizando en la cuenta A.

8.    Elija Deploy (Implementar). Ahora puede probar la función para comprobar que activa el trabajo 2 en la cuenta B.

Cree una regla de eventos en la cuenta B para el trabajo 1

1.    Desde la cuenta B, abra la consola de EventBridge.

2.    Elija Rules (Reglas) y, a continuación, elija el bus de eventos que creó anteriormente.

3.    Cree una nueva regla en el bus de eventos. Ingrese un Rule name (Nombre de regla) y, en Rule type (Tipo de regla), elija Rule with an event pattern (Regla con un patrón de eventos).

4.    En la página Build event pattern (Crear patrón de eventos), en creation method (Método de creación), elija Custom pattern (Patrón personalizado) y, a continuación, agregue este JSON:

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

Nota: Asegúrese de reemplazar <nombre de trabajo 1> por el nombre del trabajo de AWS Glue que está utilizando en la cuenta B.

5.    En la página Select Targets (Seleccionar objetivos), para ver los Target Types (Tipos de objetivo), elija AWS service (servicio de AWS).

6.    En Select target (Seleccionar objetivo), elija o escriba la función de Lambda y, a continuación, elija la función que creó anteriormente en la lista desplegable.

7.    Seleccione Next (Siguiente), revise la configuración y, a continuación, seleccione Create (Crear).

Pruebe el activador de trabajos de AWS Glue para varias cuentas

1.    Ejecute el trabajo 1 en la cuenta A. Cuando se complete el trabajo, se enviará un estado SUCCEEDED (Correcto) al bus de eventos de la cuenta A.

2.    La cuenta A envía la información del evento al bus de eventos de la cuenta B.

3.    El bus de eventos de la cuenta B ejecuta la regla de eventos. Esta regla de eventos activa la función de Lambda en la cuenta B. Para comprobar los registros de Lambda, abra la consola de Amazon CloudWatch, seleccione Log groups (Grupos de registros) y, a continuación, elija su grupo de funciones de Lambda. El grupo de funciones tiene el formato /aws/lambda/<LambdaFunctionName>.

4.    La función de Lambda activa el trabajo 2 en la cuenta B.


Información relacionada

Envío y recepción de eventos de Amazon EventBridge entre cuentas de AWS

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año