본문 바로가기

IT 개발 정보/AWS

AWS Lambda를 사용한 효율적인 배치 프로그램 운영: 데일리 및 주간 통계 함수 사례

반응형

AWS Lambda를 사용한 효율적인 배치 프로그램 운영: 데일리 및 주간 통계 함수 사례

 

배치 프로그램 운영은 많은 개발자들에게 필수적인 작업 중 하나입니다. 하지만 전통적인 방법으로 EC2를 띄워 주기적으로 작업을 처리하는 것은 비용과 관리의 부담을 증가시킬 수 있습니다. 이러한 문제를 해결하기 위해 AWS Lambda를 활용하면 비용 절감과 운영의 단순화를 동시에 이룰 수 있습니다. 이번 글에서는 AWS Lambda를 활용한 데일리 및 주간 통계 배치 프로그램에 대해 설명합니다.

 

1. 왜 AWS Lambda인가?

 

AWS Lambda는 서버리스(Serverless) 환경을 제공하며, 코드 실행을 위한 인프라를 신경 쓰지 않아도 됩니다. 다음과 같은 이유로 배치 프로그램에 적합합니다:

비용 효율성: 사용 시간만큼만 비용이 발생하며, 실행하지 않을 때는 비용이 들지 않습니다.

자동 확장: 동시 실행 수가 늘어나도 확장이 자동으로 이루어집니다.

유지 관리 필요 없음: 운영체제 관리, 패치 등 인프라 관리 부담이 없습니다.

이벤트 기반 트리거: AWS EventBridge 또는 CloudWatch를 이용해 원하는 시간에 Lambda 함수를 실행할 수 있습니다.

 

2. 데일리 및 주간 통계 배치의 구조

 

2.1 설계 개요

주요 입력: S3에 저장된 로그 파일, RDS/NoSQL에 저장된 데이터

처리 과정: 데이터를 읽어 특정 로직으로 통계를 계산

출력: 결과를 S3에 저장하거나 RDS/NoSQL로 업데이트

 

2.2 주요 컴포넌트

1. AWS EventBridge: 지정된 시간에 Lambda를 트리거.

2. AWS Lambda: 배치 로직을 처리.

3. AWS S3: 로그 데이터를 저장하거나 결과를 기록.

4. RDS/NoSQL: 계산된 통계를 저장.

 

3. 데일리 통계 Lambda 함수 구현

 

다음은 간단한 데일리 통계 계산 Lambda 함수 예제입니다.

import AWS from 'aws-sdk';

const s3 = new AWS.S3();
const dynamoDB = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event: any) => {
  console.log("데일리 통계 배치 시작");

  try {
    // 1. 데이터 로드 (예: S3에서 로그 파일 읽기)
    const logs = await s3.getObject({
      Bucket: 'your-log-bucket',
      Key: 'daily-log.json',
    }).promise();

    const logData = JSON.parse(logs.Body?.toString() || '[]');
    console.log(`로그 데이터: ${logData.length}개`);

    // 2. 통계 처리 (간단한 예: 방문자 수 계산)
    const totalVisitors = logData.reduce((sum, log) => sum + log.visitorCount, 0);

    // 3. 결과 저장 (DynamoDB 예시)
    await dynamoDB.put({
      TableName: 'DailyStats',
      Item: {
        date: new Date().toISOString().slice(0, 10),
        totalVisitors,
      },
    }).promise();

    console.log(`데일리 통계 저장 완료: ${totalVisitors}명`);
  } catch (error) {
    console.error("데일리 통계 처리 중 오류 발생:", error);
    throw error;
  }

  return {
    statusCode: 200,
    body: JSON.stringify({ message: "데일리 통계 완료" }),
  };
};

 

 

4. 주간 통계 Lambda 함수 구현

 

주간 통계는 데일리 통계 데이터를 집계하는 방식으로 구현할 수 있습니다.

 

exports.handler = async (event: any) => {

  console.log("주간 통계 배치 시작");



  try {

    // 1. DynamoDB에서 지난 7일간의 데이터 로드

    const stats = await dynamoDB.scan({

      TableName: 'DailyStats',

      FilterExpression: 'date BETWEEN :startDate AND :endDate',

      ExpressionAttributeValues: {

        ':startDate': getStartDate(7), // 7일 전 날짜

        ':endDate': new Date().toISOString().slice(0, 10),

      },

    }).promise();



    const weeklyData = stats.Items || [];



    // 2. 통계 처리 (예: 주간 총 방문자 수 계산)

    const weeklyVisitors = weeklyData.reduce((sum, stat) => sum + stat.totalVisitors, 0);



    // 3. 결과 저장

    await dynamoDB.put({

      TableName: 'WeeklyStats',

      Item: {

        weekEnding: new Date().toISOString().slice(0, 10),

        weeklyVisitors,

      },

    }).promise();



    console.log(`주간 통계 저장 완료: ${weeklyVisitors}명`);

  } catch (error) {

    console.error("주간 통계 처리 중 오류 발생:", error);

    throw error;

  }



  return {

    statusCode: 200,

    body: JSON.stringify({ message: "주간 통계 완료" }),

  };

};



// Helper 함수

function getStartDate(days: number): string {

  const date = new Date();

  date.setDate(date.getDate() - days);

  return date.toISOString().slice(0, 10);

}

 

5. 스케줄링 설정

 

AWS EventBridge를 사용하여 Lambda를 주기적으로 실행할 수 있습니다.

1. AWS Management Console에서 EventBridge 규칙 생성.

2. 규칙 설정:

데일리 통계: 매일 오전 1시(cron(0 1 * * ? *)).

주간 통계: 매주 월요일 오전 1시(cron(0 1 ? * MON *)).

3. 규칙의 대상(Target)으로 Lambda 함수 연결.

 

6. 기대 효과

1. 비용 절감: EC2 인스턴스를 24/7로 운영하지 않아도 되므로 사용량 기반의 비용 청구.

2. 유연성: 배치 작업을 원하는 주기로 손쉽게 관리 가능.

3. 확장성: 데이터 크기에 따라 Lambda가 자동으로 확장.

4. 간소화된 운영: 서버 관리가 필요 없으므로 개발 본연의 작업에 집중 가능.

 

7. 결론

 

AWS Lambda는 배치 프로그램, 특히 데일리 및 주간 통계와 같은 반복 작업에 적합한 솔루션입니다. 이벤트 기반 트리거와 서버리스 환경을 활용하면 불필요한 EC2 운영을 줄이고, 효율적이고 경제적인 배치 시스템을 구축할 수 있습니다.

 

위의 코드를 기반으로 자신만의 통계 배치 프로그램을 구축해 보세요! 😊