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 운영을 줄이고, 효율적이고 경제적인 배치 시스템을 구축할 수 있습니다.
위의 코드를 기반으로 자신만의 통계 배치 프로그램을 구축해 보세요! 😊
'IT 개발 정보 > AWS' 카테고리의 다른 글
AWS Lambda를 Rust로 구현해야 하는 이유: 빠르고 효율적인 서버리스 프로그래밍 (0) | 2024.12.15 |
---|