Aws

EC2에 접속 시 로그 DB에 저장 (CloudWatch, DynamoDB)

wngnl05 2024. 12. 27. 14:50

 

2024.04.21 - [Aws] - EC2 접속 시 CloudWatch LogGroup에 USER 로그 작성하기

 

Lambda함수를 3개 만들어줍니다.

1. cloudwatch-function < Trigger - CloudWatch LogGorup >

2. dynamo-db-function

 

cloudwatch-function Code

더보기
import base64
import json
import zlib
import boto3

def lambda_handler(event, context):
    
    # CloudWatch Logs 이벤트 데이터 추출
    event_data = event['awslogs']['data']
    
    # base64 디코딩 및 압축 해제
    decoded_data = base64.b64decode(event_data)
    decompressed_data = zlib.decompress(decoded_data, 16 + zlib.MAX_WBITS)
    
    # JSON 파싱
    log_data = json.loads(decompressed_data)
    
    lambda_client = boto3.client('lambda')
    
    # 로그 이벤트 메시지 출력
    log_events = log_data['logEvents']
    for log_event in log_events:
        print(log_event['message'])
        
        # 람다 함수 호출
        response = lambda_client.invoke(
            FunctionName='dynamo-db-function', # 호출할 람다 함수 이름
            InvocationType='Event',  # 비동기 호출
            Payload=json.dumps(log_event['message']) # 전달할 데이터
        )
        
    # 처리 결과 반환
    return {
        'statusCode': 200,
        'body': json.dumps('Log data processed successfully!')
    }

dynamo-db-function Code 

더보기
import json
import boto3
from datetime import datetime

def lambda_handler(event, context):
    # DynamoDB 연결
    dynamodb = boto3.resource('dynamodb')
    # DynamoDB 테이블 선택 (테이블 이름)
    table = dynamodb.Table('<DynamoDB 테이블 이름>')

    # 현재 시간 가져오기 (정렬 키 값으로 사용)
    current_time = datetime.now().isoformat()

    # DynamoDB에 데이터 삽입
    response = table.put_item(
        Item={
            'test': f"{current_time}",  # 파티션 키에 현재시간 설정
            'sort_key': "USER_NAME",  # 정렬 키 <원하는 값 사용>
            'USER': event # CloudWatch LogGroup Data
        }
    )
    print("Successfully inserted data into DynamoDB:", response)

    return response