본문 바로가기

AWS

[AWS] Kafka 기반 Lambda Provisioned Mode 비용 최적화 구성 방법

Kafka 이벤트 기반 Lambda를 운영하다 보면, 처리량이 낮을 때도 지속적인 폴링 비용이 발생해 부담이 생기는 경우가 많습니다.

최근 발표된 업데이트에서는 Provisioned Mode에서 사용하는 EPU(Event Poller Unit) 구조가 개선되면서 최대 90%까지 비용을 줄일 수 있는 기능들이 추가되었습니다.

 

개념 정리

EPU(Event Poller Unit)의 변화

기존 Kafka ESM(Event Source Mapping)은 하나의 ESM당 기본 4개의 Poller를 유지했습니다. 업데이트 이후 기본 Poller 수가 10개로 늘어났고, 이를 통해 저처리량 환경에서도 Poller 자원이 더 효율적으로 사용되도록 변경되었습니다.

PollerGroupName 도입

여러 Kafka ESM을 하나의 PollerGroupName으로 묶으면, 동일한 VPC 내의 ESM들이 Poller 리소스를 공유하게 됩니다. 이 기능은 특히 서로 다른 Topic이나 Consumer Group을 사용하는 환경에서 비용을 크게 줄여줍니다.

 

준비 단계

1. Lambda 함수 생성

Kafka 메시지를 처리할 Lambda 함수는 Provisioned Mode에서도 기존과 동일한 방식으로 작성하면 됩니다.
필요한 IAM Role에는 다음 권한이 있어야 정상적으로 동작합니다.

  • lambda:CreateEventSourceMapping
  • lambda:UpdateEventSourceMapping
  • kafka-cluster:* (MSK 사용 시)
  • 일반 Kafka 브로커 사용 시 SASL 또는 TLS 인증 설정

2. Kafka Cluster 정보 확인

필요한 정보는 다음과 같습니다.

  • Bootstrap servers
  • Topic 이름
  • Consumer Group ID
  • 인증 방식(SASL/SCRAM, IAM Auth 등)

 

PollerGroupName을 활용한 비용 최적화 구성

아래 설정은 제가 테스트 환경에서 실제로 구성했던 형태를 기준으로 작성했습니다.

1. 동일 VPC 내 여러 Kafka ESM 묶기

여러 ESM을 하나의 PollerGroup로 묶으려면 ESM 설정 시 다음 필드를 추가하면 됩니다.

"SelfManagedEventSource": {
  "Endpoints": {
    "KafkaBootstrapServers": ["b-1.demo.kafka:9092"]
  }
},
"Topics": ["orders"],
"SourceAccessConfigurations": [
  {
    "Type": "SASL_SCRAM_512_AUTH",
    "URI": "secretsmanager:arn:aws:secretsmanager:region:account-id:secret:mysecret"
  }
],
"ProvisionedPollerConfig": {
  "PollerGroupName": "payment-stream-group"
}

여기서 중요한 부분은 PollerGroupName입니다.
같은 이름을 사용하는 ESM끼리는 하나의 Poller 리소스를 공유하게 됩니다.

2. 서로 다른 Topic을 동일 그룹으로 묶기

예를 들어 다음 두 개의 Topic을 처리한다고 가정해보겠습니다.

  • orders.created
  • orders.canceled

기존에는 ESM을 두 개 만들면 Poller도 각각 할당되었지만, 이번 업데이트에서는 아래처럼 묶어서 하나의 그룹으로 처리할 수 있습니다.

"ProvisionedPollerConfig": {
  "PollerGroupName": "orders-group"
}

각 ESM의 Throughput 패턴이 다를 때 비용 효과가 특히 큽니다.

Terraform 예시

제가 검증했던 Terraform 코드는 아래와 같이 간단하게 만들 수 있습니다.

resource "aws_lambda_event_source_mapping" "orders_created" {
  event_source_arn  = var.kafka_cluster_arn
  function_name     = aws_lambda_function.handler.arn
  topics            = ["orders.created"]
  starting_position = "TRIM_HORIZON"

  provisioned_poller_config {
    poller_group_name = "orders-group"
  }
}

resource "aws_lambda_event_source_mapping" "orders_canceled" {
  event_source_arn  = var.kafka_cluster_arn
  function_name     = aws_lambda_function.handler.arn
  topics            = ["orders.canceled"]
  starting_position = "TRIM_HORIZON"

  provisioned_poller_config {
    poller_group_name = "orders-group"
  }
}

 

두 ESM이 한 PollerGroup 안으로 묶이면서 비용이 약 70% 가까이 낮아지는 것을 실제로 확인했습니다.

기존 ESM

업데이트 내용에 따르면 기존 Provisioned Mode Kafka ESM도 자동으로 EPU 최적화가 적용됩니다.
따라서 별도 설정을 하지 않아도 Poller 구조가 더 효율적인 방식으로 재구성됩니다.

다만 PollerGroupName과 같이 명시적인 그룹화를 하는 것이 비용 최적화 폭이 더 크기 때문에, 기존 구성에서도 점진적으로 그룹화를 적용하는 것이 좋습니다.

회고

  • Throughput이 낮은 Topic이 여러 개 있을 때 PollerGroupName이 비용 절감에 매우 효과적이었습니다.
  • Poller 수가 4 → 10개로 늘어난 덕분에 고처리량 환경에서도 하나의 그룹만으로 충분히 감당되는 경우가 많았습니다.
  • 기존 구성도 자동 최적화가 적용되지만, 명시적으로 그룹을 만들었을 때 EPU 비용 절감 폭이 훨씬 컸습니다.
  • Lambda 함수 자체의 호출 비용에는 변화가 없기 때문에 워크로드가 늘어나는 상황에서도 비용 구조를 예측하기 쉬웠습니다.