Como posso acionar um trabalho do AWS Glue em uma conta da AWS com base no status de um trabalho do AWS Glue em outra conta?

8 minuto de leitura
0

Quero criar um pipeline em que a conclusão de um trabalho do AWS Glue em uma conta da AWS inicie um crawler em outra conta.

Breve descrição

Você pode criar objetos do Catálogo de Dados do AWS Glue chamados acionadores. Os acionadores podem iniciar de forma manual ou automática um ou mais crawlers ou trabalhos de ETL, mas esse recurso só pode ser usado em uma conta da AWS. Você não pode usar esses acionadores para iniciar crawlers ou trabalhos de ETL residentes em outra conta da AWS. Para acionar um trabalho do AWS Glue em uma conta da AWS com base no status de um trabalho em outra conta, use o Amazon EventBridge e o AWS Lambda.

Resolução

O exemplo a seguir fornece uma visão geral de como você pode usar o EventBridge e uma função do Lambda para alcançar seu caso de uso. Vamos supor que você tenha dois trabalhos do AWS Glue, em que o trabalho 1 é executado na conta A da AWS e o trabalho 2 é executado na conta B. O trabalho 2 depende do trabalho 1.

  1. Crie um barramento de eventos personalizado na conta B da AWS e uma regra do EventBridge na conta A da AWS. A regra do EventBridge na conta A observa o trabalho 1 do AWS Glue no estado SUCCEEDED. Em seguida, o destino é o barramento de eventos criado na conta B da AWS.
  2. Crie uma função do Lambda na conta B da AWS que aciona o trabalho 2 de ETL do AWS Glue.
  3. Crie uma regra do EventBridge na conta B com o barramento de eventos personalizado que você criou na etapa 1. Adicione uma regra que observe o trabalho 1 do AWS Glue no estado SUCCEEDED e a função do Lambda criada anteriormente como destino. O destino aciona o trabalho 2 de ETL do AWS Glue quando o evento chega usando chamadas de API do AWS Glue.

Para obter mais informações, consulte a lista de Amazon CloudWatch Events gerados pelo AWS Glue que podem ser usados nas regras do EventBridge.

Crie um barramento de eventos personalizado na conta B

1.    Na conta B, abra o EventBridge. Escolha Event buses (Barramentos de eventos) e, em seguida, escolha Create event bus (Criar barramento de eventos). Adicione esta política baseada em 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>"
    }
  ]
}

Observação: certifique-se de substituir os itens de exemplo em <> pelos seus próprios detalhes. Por exemplo, substitua <Account-B CustomEventBus Name> pelo nome do barramento de eventos que você criou na conta B.

2.    Depois de criar o barramento de eventos, anote seu ARN.

3.    Escolha o barramento de eventos personalizado que você criou e escolha Actions (Ações).

4.    Escolha Start Discovery (Iniciar descoberta).

Crie a regra do evento na conta A para o trabalho 1

1.    Na conta A, abra o console do EventBridge.

2.    Escolha Rules (Regras) e, em seguida, para Event bus (Barramento de eventos), escolha default (padrão).

3.    Selecione Create rule (Criar regra). Adicione um Name (Nome) e, em seguida, para Rule type (Tipo de regra), escolha Rule with an event pattern (Regra com um padrão de evento).

4.    Na página Build event pattern (Desenvolver padrão de eventos), em Creation method (Método de criação), escolha Rule with an event patter (Regra com um padrão de evento). Adicione este JSON:

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

Observação: certifique-se de substituir <Job 1 name> pelo nome do trabalho do AWS Glue que você estiver usando.

5.    Para Target types (Tipos de destino), escolha EventBridge event bus (Barramento de eventos do EventBridge) e, em seguida, escolha Event Bus in another AWS account or Region (Barramento de eventos em outra conta ou região da AWS).

6.    Insira o ARN do barramento de eventos que você criou anteriormente na conta B. Esse ARN é usado como o destino.

7.    Em Execution role (Perfil de execução), escolha Create a new role for this specific resource (Criar um novo perfil para este recurso específico). Se em vez disso você escolher Use existing role (Usar perfil existente), certifique-se de que sua política do AWS Identity and Access Management (IAM) tenha as seguintes permissões:

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

Observação: certifique-se de substituir <Account-B CustomEventBus Name> neste exemplo pelo nome do barramento de eventos que você criou na conta B.

8.    Escolha Next (Próximo), revise suas configurações e escolha Create (Criar).

Crie uma função do Lambda na conta B com um destino que inicia o trabalho 2 do AWS Glue

1.    Abra o console do Lambda.

2.    Escolha Functions (Funções) e, em seguida, escolha Create function (Criar função).

3.    Insira um nome de função e, para Runtime (Tempo de execução), escolha Python 3.x version (Versão do Python 3.x).

4.    Em Change default execution role (Alterar perfil de execução padrão), escolha Create a new role with basic Lambda permissions (Criar um novo perfil com permissões básicas do Lambda).

5.    Se você estiver usando um perfil existente, certifique-se de que ela tenha as permissões necessárias. Se isso não acontecer, adicione essas permissões usando o console do IAM. Primeiro, adicione o AWSGlueServiceRole (política de gerenciamento da AWS). Em seguida, dê ao Lambda as permissões do IAM para execução com base em 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>:*"
      ]
    }
  ]
}

Observação: certifique-se de substituir os itens de exemplo em <> pelos seus próprios detalhes. Por exemplo, substitua <Account-B ID> pelo ID da conta B

6.    Escolha Create function (Criar função).

7.    Na seção de código da função que você criou, adicione 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.

Observação: certifique-se de substituir <Job 2 Name> pelo nome do trabalho do AWS Glue que você estiver usando na conta A.

8.    Escolha Deploy (Implantar). Agora você pode testar a função para verificar se ela aciona o trabalho 2 na conta B.

Crie uma regra de evento na conta B para o trabalho 1

1.    Na Conta B, abra o console do EventBridge.

2.    Escolha Rules (Regras) e, em seguida, escolha o barramento de eventos que você criou anteriormente.

3.    Crie uma nova regra no barramento de eventos. Insira um Rule name (Nome de regra) e para Rule type (Tipo de regra), escolha Rule with an event pattern (Regra com um padrão de evento).

4.    Na página Build event pattern (Desenvolver padrão de evento), em Creation method (Método de criação), escolha Custom pattern (Padrão personalizado) e adicione este JSON:

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

Observação: certifique-se de substituir <Job 1 name> pelo nome do trabalho do AWS Glue que você estiver usando na conta B.

5.    Na página Select Targets (Selecionar destinos), para Target types (Tipos de destino), escolha AWS service (Serviço AWS).

6.    Em Select target (Selecionar destino), escolha ou digite Lambda function (Função do Lambda) e, em seguida, escolha a função que você criou anteriormente na lista suspensa.

7.    Escolha Next (Próximo), revise suas configurações e escolha Create (Criar).

Teste seu acionador de trabalho do AWS Glue em várias contas

1.    Execute o trabalho 1 na conta A. Quando a tarefa é concluída, um estado SUCCEEDED é enviado para o barramento de eventos na conta A.

2.    A conta A envia as informações do evento para o barramento de eventos na conta B.

3.    O barramento de eventos na conta B executa a regra do evento. Essa regra de evento aciona a função do Lambda na conta B. Para verificar os logs do Lambda, abra o console do Amazon CloudWatch, escolha Log groups (Grupos de logs) e escolha seu grupo de funções do Lambda. O grupo de funções está no formato /aws/lambda/<LambdaFunctionName>.

4.    A função do Lambda aciona o trabalho 2 na conta B.


Informações relacionadas

Sending and receiving Amazon EventBridge events between AWS accounts (Envio e recebimento de eventos do Amazon EventBridge entre contas da AWS)

AWS OFICIAL
AWS OFICIALAtualizada há um ano