다른 계정의 AWS Glue 작업 상태를 기반으로 한 AWS 계정에서 AWS Glue 작업을 트리거하려면 어떻게 해야 합니까?

5분 분량
0

한 AWS 계정에서 AWS Glue 작업을 완료하면 다른 계정에서 크롤러가 시작되는 파이프라인을 만들고 싶습니다.

간략한 설명

트리거라고 하는 AWS Glue 데이터 카탈로그 객체를 생성할 수 있습니다. 트리거는 수동 또는 자동으로 하나 이상의 크롤러 또는 ETL 작업을 시작할 수 있지만 이 기능은 하나의 AWS 계정 내에서만 사용할 수 있습니다. 이러한 트리거를 사용하여 다른 AWS 계정에 있는 크롤러 또는 ETL 작업을 시작할 수 없습니다. 다른 계정의 작업 상태를 기반으로 한 AWS 계정에서 AWS Glue 작업을 트리거하려면 Amazon EventBridge와 AWS Lambda를 사용하세요.

해결 방법

다음 예제는 EventBridge와 Lambda 함수를 사용하여 사용 사례를 달성하는 방법에 대한 개요를 제공합니다. 작업 1은 AWS 계정 A에서 실행되고 작업 2는 AWS 계정 B에서 실행되는 두 개의 AWS Glue 작업이 있다고 가정해 보겠습니다. 작업 2는 작업 1에 종속됩니다.

  1. AWS 계정 B에서 사용자 지정 이벤트 버스를 생성하고 AWS 계정 A에 EventBridge 규칙을 생성합니다. 계정 A의 EventBridge 규칙은 SUCCEEDED 상태의 AWS Glue Job 1을 감시합니다. 그러면 AWS 계정 B에서 생성된 이벤트 버스가 대상이 됩니다.
  2. AWS 계정 B에서 AWS Glue ETL 작업 2를 트리거하는 Lambda 함수를 생성합니다.
  3. 1단계에서 만든 사용자 지정 이벤트 버스를 사용하여 계정 B에서 EventBridge 규칙을 생성합니다. SUCCEEDED 상태의 AWS Glue 작업 1과 이전에 생성된 Lambda 함수를 대상으로 감시하는 규칙을 추가합니다. 타겟은 AWS Glue API 호출을 사용하여 이벤트가 도착하면 AWS Glue ETL 작업 2를 트리거합니다.

자세한 내용은 EventBridge 규칙에서 사용할 수 있는 AWS Glue에서 생성한 Amazon CloudWatch Events 목록을 참조하세요.

계정 B에서 사용자 지정 이벤트 버스 생성

1.    계정 B에서 EventBridge를 엽니다. 이벤트 버스를 선택한 다음 이벤트 버스 생성을 선택합니다. 다음 리소스 기반 정책을 추가합니다.

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

참고: <>의 예제 항목은 사용자 고유의 세부 정보로 교체해야 합니다. 예를 들어, <Account-B CustomEventBus Name>을 계정 B에서 생성한 이벤트 버스의 이름으로 바꾸세요.

2.    이벤트 버스를 생성한 후 해당 ARN을 기록해 둡니다.

3.    생성한 사용자 지정 이벤트 버스를 선택한 다음 작업을 선택합니다.

4.    디스커버리 시작을 선택합니다.

계정 A에서 작업 1의 이벤트 규칙을 생성합니다.

1.    계정 A에서 EventBridge 콘솔을 엽니다.

2.    규칙을 선택한 다음 이벤트 버스에서 기본값을 선택합니다.

3.    **규칙 생성(Create rule)**을 선택합니다. 이름을 추가한 다음 규칙 유형에서 이벤트 패턴이 있는 규칙을 선택합니다.

4.    이벤트 패턴 생성 페이지의 생성 방법에서 이벤트 패턴이 포함된 규칙을 선택합니다. 다음 JSON을 추가합니다.

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

참고: 반드시 <Job 1 name>을 사용 중인 AWS Glue 작업의 이름으로 바꾸세요.

5.    대상 유형에서 EventBridge 이벤트 버스를 선택한 다음 다른 AWS 계정 또는 리전의 이벤트 버스를 선택합니다.

6.    이전에 계정 B에서 생성한 이벤트 버스의 ARN을 입력합니다. 이 ARN은 대상으로 사용됩니다.

7.    실행 역할에서 이 특정 리소스에 대한 새 역할 생성을 선택합니다. 대신 기존 역할 사용을 선택하는 경우 AWS Identity and Access Management(IAM) 정책에 다음과 같은 권한이 있는지 확인합니다.

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

참고: 이 예에서는 <Account-B CustomEventBus Name>을 계정 B에서 생성한 이벤트 버스의 이름으로 바꿔야 합니다.

8.    다음을 선택하고 설정을 검토한 다음 생성을 선택합니다.

AWS Glue 작업 2를 시작하는 대상을 사용하여 계정 B에서 Lambda 함수를 생성합니다.

1.    Lambda 콘솔을 엽니다.

2.    함수를 선택한 다음 함수 생성을 선택합니다.

3.    함수 이름을 입력하고 런타임에서 Python 3.x 버전을 선택합니다.

4.    기본 실행 역할 변경에서 기본 Lambda 권한을 가진 새 역할 생성을 선택합니다.

5.    기존 역할을 사용하는 경우 해당 역할에 필요한 권한이 있는지 확인하세요. 그렇지 않은 경우 IAM 콘솔을 사용하여 이러한 권한을 추가합니다. 먼저 AWSGlueServiceRole(AWS 관리 정책)을 추가합니다. 그런 다음 Lambda에 이벤트를 기반으로 실행할 IAM 권한을 부여합니다.

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

참고: <>의 예제 항목은 사용자 고유의 세부 정보로 교체해야 합니다. 예를 들어, <Account-B ID>를 계정 B의 계정 ID로 바꾸십시오.

6.    [함수 생성]을 선택합니다.

7.    생성한 함수의 코드 섹션에 다음 코드를 추가합니다.

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

참고: <Job 2 Name>을 계정 A에서 사용 중인 AWS Glue 작업의 이름으로 바꿔야 합니다.

8.    **배포(Deploy)**를 선택합니다. 이제 함수를 테스트하여 계정 B에서 작업 2를 트리거하는지 확인할 수 있습니다.

계정 B에서 작업 1의 이벤트 규칙을 생성합니다.

1.    계정 B에서 EventBridge 콘솔을 엽니다.

2.    규칙을 선택한 다음 이전에 생성한 이벤트 버스를 선택합니다.

3.    이벤트 버스 아래에 새 규칙을 생성합니다. 규칙 이름을 입력하고 규칙 유형에서 이벤트 패턴이 있는 규칙을 선택합니다.

4.    이벤트 패턴 생성 페이지의 생성 방법에서 사용자 지정 패턴을 선택한 후 다음 JSON을 추가합니다.

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

참고: <Job 1 name>을 계정 B에서 사용 중인 AWS Glue 작업의 이름으로 바꿔야 합니다.

5.    대상 선택 페이지의 대상 유형에서 AWS 서비스를 선택합니다.

6.    대상 선택에서 Lambda 함수를 선택하거나 입력한 다음 드롭다운 목록에서 이전에 생성한 함수를 선택합니다.

7.    다음을 선택하고 설정을 검토한 다음 생성을 선택합니다.

교차 계정 AWS Glue 작업 트리거 테스트

1.    계정 A에서 작업 1을 실행합니다. 작업이 완료되면 계정 A의 이벤트 버스로 SUCCEEDED 상태가 전송됩니다.

2.    계정 A는 계정 B의 이벤트 버스로 이벤트 정보를 전송합니다.

3.    계정 B의 이벤트 버스가 이벤트 규칙을 실행합니다. 이 이벤트 규칙은 계정 B에서 Lambda 함수를 트리거합니다. Lambda 로그를 확인하려면 Amazon CloudWatch 콘솔을 열고 로그 그룹을 선택한 다음 Lambda 함수 그룹을 선택합니다. 함수 그룹은 /aws/lambda/<LambdaFunctionName> 형식입니다.

4.    Lambda 함수는 계정 B에서 작업 2를 트리거합니다.


관련 정보

AWS 계정 간 Amazon EventBridge 이벤트 전송 및 수신

AWS 공식
AWS 공식업데이트됨 일 년 전