본문 바로가기
IT & Tech 정보

AWS Lambda에 KEDA 도입하기: EventBridge 기반 Serverless Auto-Scaler 완전 자동화

by 지식과 지혜의 나무 2025. 5. 28.
반응형


🧭 문제 정의: 서버리스도 결국 ‘스케일링’이 필요하다

AWS Lambda는 기본적으로 이벤트 기반 자동 스케일링이 지원됩니다. 그러나 다음과 같은 상황에서는 세밀한 제어가 어렵거나 불가능합니다.

문제 상세
동시 실행 제한 계정 혹은 함수당 concurrency 제약이 존재함
SLA 기준 없음 응답시간, 큐 백로그 등의 SLA에 따른 스케일 제어 불가
비정형 이벤트 Kafka, Redis, Custom API 트리거 처리 어려움
멀티 클라우드 연동 Lambda 외 외부 리소스 연계 자동화 어려움

→ 해결책: Lambda 트리거를 EventBridge로 통합하고, 외부 SLA 지표 기반으로 KEDA를 통해 스케일 제어 + 예약 확장 + 이벤트 기반 오토화 가능



📐 전체 아키텍처

+---------------------+       +------------------------+       +-------------------+
| Prometheus (SLA)   | ----> |   KEDA Metrics Adapter | ----> | Kubernetes         |
|  - latency         |       |   ScaledObject (Job)   |       |   Job (LambdaCall) |
+---------------------+       +------------------------+       +-------------------+
                                                                            |
                                                                            ▼
                                                              +-------------------------+
                                                              | AWS EventBridge Rule    |
                                                              | -> target = Lambda Fn   |
                                                              +-------------------------+




🧱 핵심 구성 요소 설명

구성 요소 설명
Prometheus SLA 지표 (e.g. latency, backlog, rate limit 등) 수집
KEDA Prometheus → Kubernetes Job 생성 트리거 역할
Job (Lambda Caller) AWS CLI로 Lambda 함수 수동 실행
EventBridge Rule 수동 트리거 대신 예약 기반 실행 가능
Lambda Function 기존 서버리스 애플리케이션 또는 트리거 대상




🔧 Terraform을 활용한 인프라 선언적 구성 예

1. Lambda 및 IAM 설정

resource "aws_lambda_function" "my_lambda" {
  function_name = "keda-scaled-lambda"
  ...
}

resource "aws_iam_role" "lambda_exec" {
  name = "lambda_exec_role"
  assume_role_policy = data.aws_iam_policy_document.lambda_assume.json
}

2. EventBridge Rule 생성

resource "aws_cloudwatch_event_rule" "lambda_schedule" {
  name                = "lambda-every-minute"
  schedule_expression = "rate(1 minute)"
}




📄 KEDA ScaledObject 설정 예시 (Prometheus Trigger)

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: lambda-trigger
  namespace: default
spec:
  scaleTargetRef:
    name: lambda-runner-job
  triggers:
    - type: prometheus
      metadata:
        serverAddress: http://prometheus.monitoring.svc:9090
        query: |
          rate(http_requests_total{job="lambda-api",status=~"5.."}[1m])
        threshold: "10"




🧪 Lambda 호출을 위한 Job 예시 (Kubernetes)

apiVersion: batch/v1
kind: Job
metadata:
  name: lambda-runner-job
spec:
  template:
    spec:
      containers:
        - name: aws-lambda-caller
          image: amazon/aws-cli
          command:
            - "/bin/sh"
            - "-c"
            - >
              aws lambda invoke \
              --function-name keda-scaled-lambda \
              /tmp/out.txt
      restartPolicy: Never




💡 고급 팁 및 응용

주제 상세
ScaledJob 활용 단발성 이벤트 처리 시 ScaledJob이 더 적합
Slack 알림 Argo CD Notifications 또는 Alertmanager와 연동
재시도 제어 Lambda 재실행 실패 시 KEDA CooldownPeriod 설정
다중 트리거 Kafka, Redis, Prometheus 조합 가능 (Multi-Trigger)
Terraform 모듈화 Lambda + EventBridge + Role + Rule을 모듈로 재사용화
CloudWatch ↔ Prometheus cloudwatch-exporter로 CloudWatch → Prometheus 지표 통합 가능




🔚 결론

KEDA는 전통적인 Kubernetes 워크로드뿐만 아니라, Lambda 같은 서버리스 환경에도 효과적인 확장성 관리 도구로 자리잡을 수 있습니다.
특히 Prometheus 기반 SLA 지표, EventBridge를 통한 예약 실행, Terraform 기반 선언적 관리가 결합되면:
• 정량적 SLA 준수
• 낭비 없는 트래픽 기반 실행
• 하이브리드 클라우드 통합

이라는 세 가지 축이 충족됩니다.

서버리스도 더 이상 단순한 “자동”이 아닌, 정교하게 튜닝 가능한 자동화 환경으로 진화해야 할 시점입니다.
다음 단계로는 KEDA + CloudWatch + API Gateway 연계를 통한 실시간 API 수요 기반 오토스케일링 사례를 다뤄드릴 수 있습니다.

반응형