AWS EC2 기반의 서비스 아키텍처 운영에 대한 생각
AWS EC2는 유연성과 확장성을 제공하는 강력한 클라우드 컴퓨팅 서비스입니다. AWS EC2를 기반으로 한 서비스 운영의 다양한 측면에 대해서 가지고 있던 생각을 풀어봤습니다. EC2는 높은 가용성과 유연한 장애 대응이 가능한 아키텍처 설계가 가능한 만능 컴퓨팅 자원이면서도 상당한 이해가 있어야 서비스 운영 간에 장애에 대응하고 효율적으로 서비스를 구성할 수 있습니다. 모든 서비스가 컨테이너로 제공되고 무조건 넘어가야만 할 것 같다는 생각에 대해 고민하고, 내가 지금 운영하는 아키텍처는 어떠한가에 대한 생각을 공유하고자 합니다.
EC2 기반 서비스 구성
AWS EC2를 활용하여 서비스를 운영할 때, 높은 범용성을 확보할 수 있습니다. 예를 들어, EC2에 Ubuntu 리눅스를 설치한 노드를 중심으로 서비스에 맞춘 AMI(Amazon Machine Image)를 생성하고, 이를 바탕으로 Instance Template을 구성합니다. 이후 Auto Scaling과 Target Group을 설정함으로써 자동으로 확장 및 로드 밸런싱이 가능한 구조를 구축할 수 있습니다.
Ubuntu를 사용한 EC2 환경은 다양한 용도로 활용될 수 있습니다. 저비용 캐시 서버로의 활용부터 Kinesis, Fluent Bit, CloudWatch Agent, SSM Agent, DynamoLocal 등 수많은 리눅스용 서버 프로그램을 구동하여 운영하는 등, 다재다능한 활용이 가능합니다.
컨테이너와의 비교: 범용성과 복잡도
EC2는 높은 범용성을 제공하지만, 이에 따른 관리 포인트가 많아질 수 있다는 단점이 존재합니다. 반면, 컨테이너는 기능 단위로 개발되고 해당 컨테이너에 집중하여 관리할 수 있어 비교적 간편합니다. EC2를 사용할 경우, 인스턴스 자체의 자원을 효율적으로 관리하고 전체 시스템을 파악해야 하는 부담이 있습니다.
컴퓨팅 리소스 관리
AWS EC2에서 중요한 컴퓨팅 리소스 지표는 CPU, 메모리, 디스크 사용량입니다. 일반적으로 CPU 사용률이 80%를 초과하면 서비스 성능 저하와 지연이 발생할 수 있습니다. 메모리 부족으로 인한 메모리 프레셔 현상이 발생하면 노드가 더 이상 동작하지 않을 수 있으며, 디스크 풀도 서버 마비 상태를 초래할 수 있습니다.
이와 같은 상황이 발생할 경우, 재부팅을 통해 일시적으로 문제를 해결할 수 있습니다. 그러나 이는 다운타임을 유발할 수 있으며, Ubuntu에서는 임시 파일이 /tmp
디렉토리에 저장되므로 재부팅 시 해당 파일들이 비워집니다.
장애 대응 및 복구
서비스에 장애가 발생했을 때, 기본적인 아키텍처 구조를 이해하고 있어야 원인 파악과 신속한 복구가 가능합니다. 서비스 장애가 발생한 구간을 정확히 파악하고, 이슈를 확인하여 해결하는 능력은 안정적인 서비스 운영에 필수적입니다. 예를 들어 대부분의 기본적인 로그 파일은 /var/log
경로에 위치하지만, 서비스에 따라 비즈니스 요구사항에 따라 /tmp/
나 기타 위치로 로그를 적재하고 있을 수도 있습니다.
권한 관리
서비스를 위해 최소 권한의 원칙을 중요시하고 EC2에 권한을 부여해야 합니다. 제공하는 서비스를 벗어나 중요 자원에 접근하거나 변경하는 행위에 대해 불필요하게 권한이 부여되어 있는지에 대한 확인이 필요합니다.
AWS SSM은 기본적으로 루트 권한으로 접근하여 스크립트를 실행합니다. 이로 인해 유저 계정의 AWS CLI Credential과 /root/.aws/credentials
간의 충돌이 발생할 수 있어 원하는 동작이 이루어지지 않을 수 있습니다. EC2에서는 .aws/
디렉토리에 키 기반으로 정의된 권한 정보를 먼저 읽고, 그 후 AMI로 지정된 Role 기반의 권한을 적용받게 됩니다. 따라서 권한 관리에 신중을 기해야 합니다.
EC2의 유기적인 연계와 활용
AWS가 제공하는 다양한 매니지드 서비스와의 유기적인 연계를 통해 이슈를 효과적으로 해결하고 서비스를 안정적으로 유지할 수 있습니다. EC2는 이러한 매니지드 서비스들과의 연계를 통해 만능 자원으로 활용될 수 있지만, 이를 제대로 활용하기 위해서는 다양한 경험과 시행착오가 필요합니다.
현재 많은 서비스가 컨테이너 기반으로 전환되고 있으며, 컴퓨팅 자원에 직접 서비스를 세팅하여 서빙하는 경우는 줄어들고 있습니다. 그러나 모든 서비스에 컨테이너가 적합한 것은 아니며, 서비스에 맞는 아키텍처를 선택하는 것이 중요합니다. 또한, 현재 많이 사용되는 컨테이너 오케스트레이션 툴인 쿠버네티스는 리눅스 기반의 컴퓨팅 노드에서 구동되므로, 그 기반이 되는 Ubuntu와 리눅스 컴퓨팅 리소스 관리에 대한 이해도 중요합니다.
결론
AWS EC2는 높은 범용성과 유연성을 제공하는 강력한 컴퓨팅 자원입니다. 다양한 매니지드 서비스와의 연계를 통해 안정적인 서비스 운영이 가능하지만, 효과적으로 활용하기 위해서는 깊은 이해와 경험이 필요합니다. 서비스의 특성과 요구 사항에 맞는 아키텍처를 설계하고, 지속적인 모니터링과 관리로 장애에 유연하게 대응하는 것이 성공적인 클라우드 서비스 운영의 핵심입니다.
그런데 무엇보다 서버를 관리하고 운영한다는 낭만이 있습니다.
KeyWords: Athena, DevOps, DynamoDB, EC2, ElastiCache, Kinesis, Memcached, MySQL, Redis, Route53, S3
Type: DevOps
SubType: Operation