실전에서의 Kamal: AWS에서 Rails 앱을 운영하며 얻은 교훈

Kamal in the Real World: Lessons from Running Rails Apps on AWS

작성자
발행일
2026년 02월 04일

핵심 요약

  • 1 Kamal은 Rails 8의 기본 배포 도구로서 Docker 기반의 단순함을 제공하며, AWS 환경에서도 ALB, EC2, RDS 등 기존 인프라 구성 요소들과 결합하여 안정적인 서비스 운영이 가능함을 입증했습니다.
  • 2 AWS ALB의 상태 확인(Health Check) 과정에서 발생하는 호스트 헤더 불일치 문제나 다수 개발자의 동시 배포 시 발생하는 권한 관리 문제 등 실무적인 장애 요인들을 구체적인 설정 변경과 CI 도입을 통해 해결할 수 있습니다.
  • 3 Kamal은 인프라의 복잡성을 완전히 숨기기보다는 개발자가 시스템의 흐름을 직접 이해하고 제어할 수 있게 돕는 도구로, 플랫폼 서비스(PaaS)를 떠나 독자적인 인프라 소유권을 확보하려는 팀에게 최적의 선택지입니다.

도입

이 글은 Kaigi on Rails 2025에서 발표된 'yappu'의 세션을 바탕으로, Kamal을 사용하여 AWS 환경에서 3개의 내부 Rails 프로젝트를 운영한 실제 경험과 교훈을 다룹니다. Rails 8부터 기본 배포 도구로 채택된 Kamal이 단순한 장난감 수준을 넘어 실제 프로덕션 환경, 특히 AWS와 같은 클라우드 인프라에서 어떻게 동작하는지 심도 있게 분석합니다. 이론적인 설명에 그치지 않고 실제 운영 과정에서 마주한 문제점들과 이를 해결하기 위한 실질적인 방안들을 제시함으로써, Kamal 도입을 고민하는 개발자들에게 명확한 가이드라인을 제공하는 것이 이 글의 핵심 목적입니다.

1. Kamal과 AWS의 결합: 아키텍처 구성\n발표에서 소개된 프로젝트는 AWS의 표준적인 구성 요소들을 활용하여 Kamal 기반의 배포 환경을 구축했습니다. 주요 아키텍처는 다음과 같습니다.\n* 트래픽 제어: AWS ALB(Application Load Balancer)를 사용하여 외부 요청을 수신하고 백엔드로 전달합니다.\n* 컴퓨팅 자원: EC2 인스턴스 내에서 Docker 컨테이너를 실행하며, Kamal Proxy가 라우팅과 제로 다운타임 배포를 담당합니다.\n* 데이터 및 스토리지: RDS를 데이터베이스로 사용하고, ECR(Elastic Container Registry)에 빌드된 이미지를 저장하여 배포 시 활용합니다.\n* 모니터링: CloudWatch Logs를 통해 시스템 로그를 통합 관리하여 가시성을 확보합니다.\n이러한 구성은 Kubernetes나 ECS 같은 복잡한 오케스트레이션 도구 없이도 Rails와 Docker, 그리고 AWS의 기본 기능만으로 충분히 안정적이고 지속 가능한 운영이 가능함을 시사합니다.\n\n### 2. Kamal이 제공하는 주요 장점 및 운영 가치\n실무 운영진이 느낀 Kamal의 가장 큰 매력은 ‘단순함’과 ‘가시성’입니다. 이는 개발자가 인프라를 직접 제어할 수 있는 힘을 실어줍니다.\n* 배포 프로세스의 투명성: kamal setup부터 이미지 빌드, 푸시, 컨테이너 교체까지의 과정이 명확하여 블랙박스 영역이 거의 없으며 문제 발생 시 원인 파악이 용이합니다.\n* 자동 SSL 관리: Let’s Encrypt를 내장 지원하여 별도의 인증서 갱신 작업이나 외부 도구 없이도 안전한 HTTPS 환경을 자동으로 유지할 수 있는 강력한 편의성을 제공합니다.\n* 운영 편의성: kamal console, kamal shell, kamal logs 명령어를 통해 서버 내부 상태를 즉각적으로 확인하고 디버깅할 수 있는 환경을 제공하여 운영 효율을 높입니다.\n* 환경 분리: deploy.yml 파일을 기반으로 스테이징과 프로덕션 환경을 명시적으로 구분하여 관리할 수 있어 설정 오류를 최소화하고 배포의 안전성을 확보합니다.\n\n### 3. 실전 운영에서의 도전 과제와 구체적 해결책\n가장 흥미로운 부분은 이론과 실제의 간극을 메우는 과정에서 발견된 기술적 해결책들입니다.\n* ALB 상태 확인(Health Check) 이슈: AWS ALB는 프라이빗 IP를 통해 상태 확인을 수행하지만, Kamal Proxy는 기본적으로 호스트 헤더를 기준으로 라우팅을 결정합니다. 이 불일치로 인해 상태 확인 요청이 Rails 앱에 도달하지 못하는 문제가 발생했습니다. 이를 해결하기 위해 특정 애플리케이션이 ALB의 프라이빗 IP로부터 오는 요청을 명시적으로 수용하도록 설정을 변경하여 문제를 해결했습니다.\n* 다수 개발자 협업 및 배포 권한 문제: 초기에는 개별 개발자가 SSH 키와 AWS 권한을 가지고 직접 배포했으나, 이는 팀 규모가 커짐에 따라 보안 및 관리 측면에서 한계가 있었습니다. 이를 해결하기 위해 AWS CodePipeline을 도입하여 CI 기반의 배포 시스템을 구축했습니다. 이를 통해 권한을 중앙 집중화하고 배포 과정을 표준화하여 협업 효율성을 극대화했습니다.\n\n### 4. Kamal 도입을 위한 전략적 판단\n실제 운영 경험을 바탕으로 할 때, Kamal은 다음과 같은 팀에게 최적의 선택이 될 수 있습니다.\n* Heroku나 Render 같은 PaaS의 제약에서 벗어나 인프라 제어권과 비용 효율성을 확보하고자 하는 팀\n* Kubernetes의 과도한 복잡성 없이 컨테이너 기반의 현대적인 배포 방식을 도입하려는 중소규모 프로젝트\n* 자동화된 마법에 의존하기보다 시스템의 작동 원리를 명확히 이해하고 관리하려는 가치를 중시하는 개발자\nKamal은 인프라의 복잡성을 숨기기보다 이를 관리 가능한 조각으로 나누어 보여줌으로써, 개발자가 자신의 애플리케이션이 구동되는 환경을 더 깊이 이해하게 만듭니다.

결론

결론적으로 Kamal은 인프라의 복잡성을 마법처럼 제거해 주는 도구가 아니라, 그 복잡성을 관리 가능한 수준으로 드러내어 개발자가 시스템에 대한 완전한 소유권을 가질 수 있도록 돕는 도구입니다. AWS ALB와의 연동이나 다수 개발자 협업 환경에서의 권한 문제 등 현실적인 제약 사항들이 존재하지만, 이는 명시적인 설정과 CI/CD 파이프라인 구축을 통해 충분히 해결 가능합니다. PaaS의 편리함보다는 인프라 제어권과 비용 효율성을 중시하는 중소규모 팀에게 Kamal은 매우 강력하고 유연한 선택지가 될 것이며, Rails 생태계가 지향하는 '적절한 복잡성'의 가치를 잘 보여줍니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!