Kafka UI ECS로 실행하기 (with MSK)
Oct 27, 2024
Table Of Content
- MSK를 Kafka UI로 모니터링하고 싶고 이를 ECS로 서빙하고 싶은 독자
- Kafka UI를 ECS로 서빙할 때 필요한 설정을 알고 싶은 독자
이벤트 모니터링 및 메세지 브로커 사용을 위해 Kafka를 사용하게 되었습니다. 대부분의 서비스를 AWS에서 운영하고 있어서 Kafka 역시 MSK를 사용하기로 결정했습니다. 후술하겠지만 IAM Role, VPC, Security Group 등을 사용할 수 있어 MSK를 사용하는 것이 편리했습니다. 하지만 악몽은 Kafka 모니터링을 위해 Kafka UI를 사용하려고 했을 때 시작되었습니다. Kafka UI에서 EC2를 사용하거나 Docker를 사용하는 방법은 쉽게 찾을 수 있었지만 ECS를 사용하는 방법은 찾기 어려웠습니다. 그래서 이 글에서는 MSK, Kafka UI, ECS를 간단히 소개하고, Kafka UI를 ECS로 서빙하는 방법을 소개하고자 합니다.
MSK는 AWS에서 제공하는 Managed Kafka 서비스입니다. MSK를 사용하면 AWS 내에서 Kafka 클러스터를 쉽게 생성하고 관리할 수 있습니다. AWS의 다른 서비스와 연동이 잘 되어 있어서 VPC, IAM Role, Security Group 등을 사용하여 인증, 인가, 보안을 쉽게 설정할 수 있습니다.
- VPC
MSK 클러스터를 생성할 때 VPC를 선택할 수 있습니다. 이를 통해 Kafka의 bootstrap server를 외부에 노출하지 않고 VPC 내부에서만 접근할 수 있게 할 수 있습니다.
- IAM Role
MSK 클러스터의 인가 및 인증을 위해 IAM Role을 사용할 수 있습니다. 이를 통해 MSK 클러스터에 접근할 수 있는 권한을 IAM Role을 통해 제어할 수 있습니다.
ref) How IAM access control for Amazon MSK works
- Security Group
MSK 클러스터에 대한 보안 그룹을 설정할 수 있습니다. 이를 통해 MSK 클러스터에 접근할 수 있는 IP를 제한할 수 있습니다.
ref) Changing an Amazon MSK cluster's security group
Kafka UI는 Apache Kafka 클러스터를 모니터링하고 관리하기 위한 무료 오픈 소스 웹 UI입니다. 대시보드를 통해 브로커, 토픽, 파티션, 프로덕션, 소비 등 Kafka 클러스터의 주요 메트릭을 쉽게 추적할 수 있습니다. Docker image로 서빙되어 Docker Compose의 설정 파일 하나만으로 Apache Kafka용 UI를 설정하여 Kafka 데이터를 시각화할 수 있습니다.
아래와 같은 기능들을 지원합니다.
- 멀티 클러스터 관리 - 모든 클러스터를 한 곳에서 모니터링
- 메트릭 대시보드를 통한 성능 모니터링 - 경량 대시보드로 주요 Kafka 메트릭을 추적합니다.
- 브로커 조회 - 토픽 및 파티션 할당, 컨트롤러 상태 보기
- 토픽 조회 - 파티션 수, 복제 상태, 사용자 정의 구성 보기
- 컨슈머 그룹 조회 - 파티션별 파킹된 오프셋, 결합 및 파티션별 지연 보기
- 메시지 검색 - JSON, 일반 텍스트 및 Avro 인코딩으로 메시지 조회 및 검색 가능
- 동적 토픽 구성 가능 - 동적 구성으로 새 토픽 생성 및 구성
- OAuth 인증 - Github/Gitlab/Google OAuth 2.0으로 접근을 제어
- 직렬화/역직렬화 플러그인 - AWS Glue 또는 Smile과 같이 데이터에 바로 사용할 수 있는 serde를 사용하거나 직접 코딩하세요!
- 역할 기반 액세스 제어 - 유저별 UI에 대한 액세스 권한을 세밀하게 관리 가능
- 데이터 마스킹 - 토픽 메시지에서 민감한 데이터를 난독화합니다.
ECS는 AWS에서 제공하는 컨테이너 오케스트레이션 서비스입니다. Task Definition을 통해 json 파일로 간단히 Task 실행 정보를 정의하고, Service를 통해 Task를 실행하고 관리할 수 있습니다.
Kafka UI를 MSK로 연결하기 위해서는 Kafka UI의 설정 파일을 수정해야 합니다.
Kafka UI 문서에서는 docker-compose.yml의
volumes
설정을 통해 config 파일을 올리는 방법을 소개하고 있습니다.
services:
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
environment:
KAFKA_CLUSTERS_0_NAME: local
# other properties, omitted
SPRING_CONFIG_ADDITIONAL-LOCATION: /config.yml
volumes:
- /tmp/config.yml:/config.yml
그러나...ECS에서 volumes를 사용하기 위해서는 다음 문서와 같이 EBS, EFS, S3 등을 사용해야 합니다. 더 쉬운 방법이 있을 수도 있겠지만, config 파일 하나만을 위해 EBS, EFS, S3를 사용하는 것은 비효율적이라고 생각했습니다. 그렇지 않고서는 config의 각 항목을 환경 변수로 설정하는 방법이 있습니다. 하지만 이 방법은 config 파일의 내용이 추가될수록 환경 변수가 많아지고, 이를 관리하기 어려울 것 같았습니다.
그래서 제가 선택한 방법은 kafka ui image를 base로 하여 config 파일을 추가한 image를 ECR에 올리고, ECS에서 이 이미지를 사용하는 것입니다.
config 파일을 많이 수정하지 않을 것 같아 다음과 같은 방법을 사용했습니다.
다음은 제가 사용한 Dockerfile입니다.
FROM provectuslabs/kafka-ui:latest
# COPY를 위한 유저 변경
USER root
COPY kafka-ui/config.yml /config.yml
COPY kafka-ui/proto /proto
# 원래 kafka-ui image 유저로 변경
USER kafkaui
MSK 클러스터에 접근하기 위해서는 MSK 클러스터의 security group에 kafka-ui의 security group을 추가해야 합니다. 이를 통해 kafka-ui에서 MSK 클러스터에 접근할 수 있습니다.
우리는 IAM Role을 사용하여 MSK 클러스터에 접근하고 있기 때문에 9098 포트를 열어주어야 합니다. ref) Port information
다음과 같이 kafka-ui의 security group을 MSK 클러스터의 security group에 추가합니다.
MSK Cluster
Inbound Rule
- Type: Custom TCP Rule
- Protocol: TCP
- Port Range: 9098
- Source: ECS kafka-ui cluster security group
Outbound Rule
- Type: Custom TCP Rule
- Protocol: TCP
- Port Range: all
- Destination: 0.0.0.0/0
이 글에서는 MSK, Kafka UI, ECS를 간단히 소개하고, Kafka UI를 ECS로 서빙하는 방법을 소개했습니다. Kafka UI를 ECS로 서빙하는 방법은 다양할 수 있지만, 제가 선택한 (가장 간단한) 방법을 소개했습니다. 이전에는 Kafka UI로 MSK를 연결하는 방법, ECS로 서빙하는 방법이 따로 나와있는 곳이 없어서 고생했었는데, 이 글이 Kafka UI를 ECS로 서빙하는 데 도움이 되었으면 좋겠습니다.