[파이썬] AWS Lambda와 EventBridge를 활용한 이벤트 기반 아키텍처

이벤트 기반 아키텍처(event-driven architecture)는 시스템의 각 컴포넌트가 비동기적으로 동작하여 이벤트를 발생시키고 이벤트를 처리하는 형태의 아키텍처입니다. 이벤트 기반 아키텍처는 시스템의 확장성과 유연성을 향상시키고, 결합도를 낮춰 독립적인 컴포넌트로 개발과 배포를 가능하게 합니다.

AWS Lambda

AWS Lambda는 서버리스 컴퓨팅 서비스로서, 코드를 실행할 수 있는 서버 없이 함수 형태로 실행됩니다. Lambda 함수는 이벤트를 트리거로 실행되며, 이벤트 소스로는 여러 가지 AWS 서비스 혹은 사용자 정의 이벤트를 사용할 수 있습니다.

Lambda 함수 생성

AWS 콘솔이나 AWS CLI를 이용하여 Lambda 함수를 생성할 수 있습니다. 여기서는 Python을 기반으로한 예시를 다루겠습니다.

다음은 Lambda 함수를 구현하는 Python 코드의 예시입니다.

def lambda_handler(event, context):
    # 이벤트 처리 로직
    # ...
    return response

위 코드에서 lambda_handler 함수는 Lambda 함수의 진입점(entry point)로 사용됩니다. event 매개변수를 통해 이벤트 데이터를 전달받고, response를 반환하여 트리거한 이벤트 소스로 결과를 전달할 수 있습니다.

이벤트 트리거

Lambda 함수를 트리거하는 이벤트는 다양한 소스에서 발생할 수 있습니다. AWS 서비스에서는 S3 버킷에 객체가 생성되었을 때, DynamoDB에 항목이 추가되었을 때, SNS 메시지가 도착했을 때 등 다양한 이벤트 소스를 트리거로 Lambda 함수를 실행할 수 있습니다.

Lambda 함수를 트리거하는 이벤트를 생성하고 구성하기 위해서는 AWS 콘솔 혹은 AWS CLI를 사용할 수 있습니다. 예를 들어 S3 버킷의 객체 생성 이벤트를 트리거로 Lambda 함수를 실행하려면 다음과 같이 이벤트 구성을 할 수 있습니다.

aws events put-targets --rule my-s3-event-rule --targets Id=<id>,Arn=<lambda-function-arn>

AWS EventBridge

AWS EventBridge는 다양한 이벤트 소스와 이벤트 소비자를 연결하는 매니지드 서비스입니다. EventBridge를 사용하면 이벤트 소스로부터 발생하는 이벤트를 필터링, 변환, 라우팅하여 이벤트를 이벤트 소비자에게 전달할 수 있습니다.

이벤트 버스 생성

AWS 콘솔 혹은 AWS CLI를 사용하여 EventBridge 이벤트 버스를 생성할 수 있습니다. AWS 이벤트 버스는 리전별로 생성되며, 이벤트 브리지나 이벤트 규칙을 생성하기 전에 이벤트 버스를 먼저 생성해야 합니다.

이벤트 규칙 생성

EventBridge 이벤트 규칙을 생성하여 이벤트를 필터링하고 대상을 설정할 수 있습니다. 이벤트 규칙은 특정 이벤트 소스의 이벤트를 필터링하여 특정 이벤트 대상으로 라우팅하는 역할을 합니다.

EventBridge 이벤트 규칙을 생성하는 방법 중 하나는 AWS 콘솔을 사용하는 것입니다. 이벤트 규칙을 생성할 때, 이벤트 소스와 필터 구문, 대상을 구성하여 규칙을 생성합니다.

Python에서 AWS Lambda와 EventBridge 사용하기

Python을 사용하여 AWS Lambda와 EventBridge를 함께 사용하는 방법을 알아보겠습니다. 이를 위해 boto3 라이브러리를 사용해야 합니다. boto3는 AWS 서비스와 상호작용하기 위한 파이썬 SDK입니다.

다음은 Python 코드에서 EventBridge에 이벤트를 발행하는 예시입니다.

import boto3

client = boto3.client('events')

response = client.put_events(
    Entries=[
        {
            'Source': 'my-source',
            'DetailType': 'my-detail-type',
            'Detail': '{}',
            'EventBusName': 'default'
        }
    ]
)

print(response)

위 코드에서 put_events 메서드는 EventBridge에 이벤트를 발행합니다. Entries에는 발행할 이벤트에 대한 정보를 포함한 딕셔너리를 전달합니다. 여기서 'Source', 'DetailType', 'Detail''EventBusName'은 이벤트에 대한 세부 정보를 제공합니다.

Lambda 함수에서 EventBridge 이벤트를 수신하기 위해서는 함수의 event 매개변수를 통해 이벤트 데이터를 전달 받을 수 있습니다. 아래는 이벤트를 처리하는 Lambda 함수의 예시입니다.

import json

def lambda_handler(event, context):
    for record in event['Records']:
        # 이벤트 처리 로직
        # ...
    return {
        'statusCode': 200,
        'body': json.dumps('Event processed successfully')
    }

위 코드에서 event 매개변수는 JSON 형태로 이벤트 데이터를 전달받습니다. 데이터는 'Records' 속성을 통해 접근할 수 있으며, 여기서 이벤트를 처리할 수 있습니다.

결론

AWS Lambda와 EventBridge를 함께 사용하여 이벤트 기반 아키텍처를 구축할 수 있습니다. Lambda 함수를 트리거하기 위해 다양한 AWS 서비스와 EventBridge의 이벤트 규칙을 사용하여 이벤트를 효율적으로 처리할 수 있습니다. 이를 통해 시스템의 유연성과 확장성을 향상시킬 수 있습니다.