Amazon CloudWatch를 사용한 게임 모니터링 방법
멀티플레이 게임 서버를 개발, 운영하다 보면 정말 다양한 정보가 생산되기 마련입니다. 이러한 정보들은 각 팀의 필요에 따라서 다양한 방법으로 수집되고 다양한 방법으로 소비되고 있습니다. 운영을 위해 개발된 인-하우스 도구를 사용하여 헬스 체크(Health Check) 상태값, 동시 접속자 수 등의 정보를 주고 받고 저장하는 경우도 있고, 게임 서버에서 집계한 정보를 로그로 만들어, 수동 또는 자동 가공을 통해서 필요한 정보를 분석하는 경우도 있습니다.
운영 체제(OS)에서 제공하는 정보를 별도의 지표 수집 도구를 사용하여 수집하거나, OS의 성능 모니터링 도구를 사용하여 모니터링할 수도 있습니다. 사용하는 프레임워크나 지표 수집 전용 도구를 애플리케이션에 같이 임베드하여 지표를 얻는 경우도 있습니다.
이렇게 여러 가지 방법을 통해서 다양한 정보를 수집할 수 있지만, 모니터링을 위한 정보 수집의 경우 게임 개발의 주요한 기능이 아닌 경우가 많기 때문에 초기부터 신경쓰기는 쉽지 않습니다. 결국 컨텐츠 개발의 업무에 밀려서 출시 직전에야 허겁지겁 만들게 되는 경우가 많습니다. 또 통합적으로 관리되지 않고 여기 저기 흩어져 있는 정보들은 데이터 관리를 위한 노력도 많이 늘어나게 하고, 유의미한 정보를 발견하기 위하여 정보를 탐색하는 데에 들어가는 노력도 크게 만듭니다.
AWS에서는 이렇게 다양한 서비스들의 통합적인 모니터링을 위하여 Amazon CloudWatch를 사용하고 있습니다. 이 글에서는 게임 서비스 모니터링을 위해 Amazon CloudWatch를 활용하는 방법을 살펴보도록 하겠습니다.
Amazon CloudWatch 소개
Amazon CloudWatch는 Elastic Load Balancing 및 Auto Scaling과 함께 출시되었습니다. 최초에는 Amazon EC2의 지표를 수집하고 그 지표를 바탕으로 Auto-Scaling을 구동하여 ELB의 대상 인스턴스를 자동으로 확장하기 위한 부속 서비스로 개발이 되었습니다. 하지만 이후로 로그 및 지표 수집, 모니터링, 자동화 조치 등 다양한 형태의 분석 기능들이 지속적으로 추가되면서 오늘날에는 AWS의 대표적인 모니터링 서비스로 성장했습니다.
Amazon CloudWatch의 이러한 기능들을 잘 활용하면 손쉽게 완전 관리형이며, 사용한 만큼만 비용이 청구되는 모니터링 환경을 구축할 수 있습니다.
CloudWatch Metrics에 커스텀 지표 수집하기
다른 모든 서비스들과 마찬가지로 게임도 서비스 도중에 많은 수의 지표를 만들어 내기 마련입니다. HTTP 프로토콜을 기반으로 하는 서비스의 경우 Elastic Load Balancing 등에서 만들어 내는 지표로 많은 내용을 알아낼 수 있습니다. 하지만 TCP 위에서 커스텀 프로토콜을 사용하는 MMORPG 와 같은 경우에는 프로토콜의 해석을 애플리케이션 레벨에서 진행하기 때문에 기본적인 요청에 대한 내용까지도 모두 직접 지표를 만들어 내야 합니다. 단위 시간 당 요청 수, 처리에 성공/실패한 요청 수, 요청에 대한 평균 응답 시간 등의 정보를 커스텀 프로토콜에서 지표로 뽑을 수 있겠습니다.
또한 애플리케이션의 로직에서만 확인할 수 있는 지표의 경우 직접 지표에 대한 정보를 만들어낼 필요가 있습니다. MMORPG의 동시 접속자 수(CCU), 사용자들이 단위 시간 당 소모하거나 생산한 특정 자원의 양과 같은 지표를 수집해야하는 경우도 있습니다. 이 경우 CloudWatch 지표를 사용하게 되면 간단하게 원하는 지표를 생성 및 수집할 수 있고, 다른 CloudWatch의 지표들과 통합된 방식으로 모니터링 할 수 있습니다.
커스텀 지표를 수집하기 위해서는 직접 PutMetricData API를 호출할 수도 있지만, 간단한 방법으로는 서비스를 운영중인 인스턴스에 CloudWatch 에이전트를 설치하여 수집하는 방법이 있습니다. CloudWatch 에이전트를 설치하게 되면 OS 내부에서 확인할 수 있는 많은 시스템 수준 지표를 수집할 수 있게 됩니다. 특히 인스턴스의 메모리 사용에 관한 지표는 기본 인스턴스 지표에 수집되지 않는만큼 메모리 사용에 관한 지표를 수집하기 위해서는 CloudWatch 에이전트를 사용해서 수집해 주어야 합니다.
CloudWatch Logs로 로그 수집하기
지표와 마찬가지로 게임 서비스는 굉장히 많은 양의 로그도 생산합니다. 파일로 로그를 생산하는 경우도 있고, DB로 로그를 생산하는 경우도 있습니다. 파일로 로그를 생산하는 경우에는 서비스를 운영하는 인스턴스에 파일이 남아있게 되는데, 각 인스턴스에 파일이 흩어져 있으면 로그를 통합하여 활용하기 어렵습니다. 특히 클라우드의 장점을 살려 수요에 맞게 인스턴스의 수를 늘리고 줄이는 방식으로 확장을 하기 위해서는 인스턴스를 줄이는 과정에서 인스턴스에만 남아있는 로그들이 유실되지 않도록 미리 외부 중앙 저장소로 수집해서 관리해야 합니다.
로그를 수집하는 방법은 정말 다양하지만, 그 중에서도 Amazon CloudWatch Logs는 굉장히 간단하게 로그를 수집하여 보관할 수 있는 서비스입니다. CloudWatch 에이전트나 FluentD 를 사용하여 로그 파일들을 CloudWatch 로 전송하여 수집, 보관할 수 있습니다.
이렇게 수집하고 보관된 로그는 이후에 로그에서 특정 메시지를 검색하거나 로그에서 패턴을 기반으로 지표를 수집하기도 하고, 전용 쿼리 언어를 사용하여 로그의 내용에서 정보를 분석할 수도 있습니다.
CloudWatch를 사용하여 지표 내장형 로그 활용하기
CloudWatch는 수집하는 로그에 지표 정보를 내장할 수 있는 내장 지표 포맷을 지원하고 있습니다. 이 내장 지표 포맷을 활용하여 일반적인 유저의 로그를 수집하면서 해당 유저의 주요 지표를 로그와 연결하여 저장할 수 있습니다. 이 내장된 지표 정보는 CloudWatch 에 의해서 자동으로 지표로 추출되어 커스텀 지표가 되며 CloudWatch 의 지표 시각화 및 알람 설정과 같은 기능들을 사용할 수 있습니다. 이 방법을 사용하여 세부적인 내용은 유지하면서도 집계된 지표를 확인할 수 있게 됩니다.
게임의 경우 각 사용자에 의해서 다양한 행동 이벤트가 발생하게 됩니다. 이러한 행동들은 그 행동 이벤트에 사용자 정보, 이벤트 발생 위치 정보, 이벤트에 의해 변화된 재화나 캐릭터 정보 등 같이 연관된 정보가 많습니다. 지표 내장형 로그를 사용하여 해당 속성들을 저장하면 특정 지표의 문제가 발생된 상황에 대해서 더 자세한 상황 정보를 살펴보고자 할 때 아래에서 이후 살펴볼 Amazon CloudWatch Logs Insights 를 이용하여 자세한 로그 정보를 파악할 수 있게 됩니다.
CloudWatch Logs Insights 로 게임 서비스 동작 분석하기
이제 AWS와 고객의 서비스에서 수많은 로그를 만들어 내고 이를 CloudWatch Logs에 넣어 놓았습니다. 이러한 로그 안에는 애플리케이션 및 AWS 리소스의 동작을 파악하고, 개선 영역을 식별하고, 작동 문제를 해결하는 데 사용될 수 있는 데이터 요소, 패턴, 추세 및 유용한 정보가 포함되어 있습니다. 보관해 놓은 로그에서 원하는 정보를 추출하고자 할 경우 Amazon CloudWatch Logs Insights를 사용할 수 있습니다. CloudWatch Logs Insights 는 클라우드 규모에서 작동하도록 설계된 완전관리형 서비스로, 설치나 유지 관리가 필요하지 않습니다. CloudWatch Logs 상에 저장되어 있는 엄청난 양의 로그를 몇 초 안에 처리하며 고속의 대화형 쿼리 및 시각화 기능을 제공합니다. 모든 로그 형식을 처리하고 JSON 로그의 필드를 자동으로 검색할 수 있습니다.
CloudWatch Logs Insights에는 정교한 전용의 쿼리 언어가 제공됩니다. 이 쿼리 언어를 사용하여 원하는 이벤트 필드를 가져오고, 조건을 기반으로 필터링하고, 백분위수 및 시계열 집계를 포함하는 집계 통계를 계산하고, 원하는 필드로 정렬하고, 반환되는 이벤트 수를 제한하도록 할 수 있습니다. 정규표현식을 사용하여 이벤트 필드에서 데이터를 추출하고 쿼리를 사용하여 추가 처리할 수 있는 하나 이상의 임시 필드를 생성할 수 있습니다.
선 및 누적 영역 차트를 사용하여 쿼리 결과를 시각화하고 CloudWatch 대시보드에 쿼리를 추가할 수 있습니다. 풍부한 샘플 쿼리 세트를 사용하여 시작할 수도 있습니다. 지표 내장형 로그의 경우 각 지표 및 각 지표 로그에 기록된 속성 정보를 필드 값을 사용할 수 있습니다. 이를 이용하여 특정 지표 특성을 보여주고 있는 로그를 검색하여 별도로 분석할 수 있습니다.
CloudWatch 경보로 알람 받기
서비스 도중 서비스의 상태가 정상적이지 않거나, 상황에 따라 특수한 처리를 해야할 경우 CloudWatch 경보 기능을 활용할 수 있습니다. CloudWatch 경보는 지표 값을 바탕으로 단일 지표 값, 지표에 대한 수학 표현식의 결과값을 감시하여 지정된 임계값을 넘어갈 경우에 ALARM 상태가 됩니다. 이 때 해당 Amazon EC2에 대해서 정해진 작업을 한다든지, Amazon EC2 Auto Scaling 을 통한 자동 규모 조정을 진행한다든지, Amazon SNS 주제로 알림을 전송하는 등의 작업을 할 수 있습니다.
경보 작업을 활용하면 EC2 인스턴스를 자동으로 중지, 종료, 재시작 또는 복구할 수 있습니다. 예를 들어 일정 기간 동안 스트레스 테스트를 돌리는 용도의 인스턴스가 있다면 CPU 사용률이 10% 미만으로 떨어지는 경우 테스트가 완료 되었다고 판단하여 경보가 발동되게 하고 인스턴스를 중지, 혹은 종료되도록 설정할 수 있습니다. 또 인스턴스 상태나 시스템 상태 확인에서 오류가 감지되는 경우, 경보를 사용하여 인스턴스를 재부팅, 혹은 복구하여 수동으로 처리하는 것보다 빠르게 대응할 수 있습니다. 이 때 Amazon SNS를 통하여 경보에 대한 알림을 이메일이나 SMS 또는 슬랙 등으로 전달 받도록 설정할 수 있습니다.
만약 특정 경보가 발생하는 상황에서 처리해야 할 작업에 대한 가이드라인이 마련이 되어 있고, 이 작업들을 자동화할 수 있다면, Amazon SNS 주제의 알림에 Amazon Lambda를 등록하여 자동으로 해당하는 작업을 처리하도록 프로그래밍할 수도 있습니다. 게임 내의 특정 기능에 대한 응답 오류 비율이 너무 높아질 경우, 기능을 플래그를 변경하여 자동으로 해당 기능을 잠시 비활성화 처리하여 오류로 인한 추가적인 문제 상황이 발생하지 않도록 막는 것과 같은 작업을 자동으로 처리할 수 있습니다.
시간에 따라 변화하는 지표값(동시 접속자 수 등)에 대한 임계의 경우 이상 현상을 파악하기 위한 적정한 임계 값으로 지정하는 데 어려움이 있습니다. 이럴 경우 CloudWatch 이상 탐지 기능을 사용하게 되면 통계 및 기계 학습 알고리즘을 바탕으로 지표를 지속적으로 분석하고, 정상 기준을 결정하여 정상 지표 동작을 나타내는 예상 값을 만들어 항상 적절한 임계값을 기준으로 경보를 생성할 수 있도록 해 줍니다.
CloudWatch Events로 주요 AWS 리소스 변경 모니터하기
지표와 경보를 사용해서 임계값을 넘어가는 상황을 감지하고 그에 따른 대응을 할 수 있었습니다. 그렇다면 AWS의 리소스들의 상태가 바뀌는 것을 감지하고 그에 대응할 수는 없을까요? CloudWatch 이벤트를 사용하면 EC2 인스턴스, RDS 인스턴스 및 CloudTrails를 통한 다양한 API 실행 등의 이벤트를 CloudWatch를 통해 스트림 방식으로 실시간으로 얻을 수 있고, 이를 통해 빠르게 대응할 수 있습니다. 수 많은 이벤트들 중 내가 관심이 있는 이벤트를 규칙으로 등록하여 규칙이 일치하는 이벤트들에 대한 처리를 등록할 수 있습니다.
간단한 예를 들자면 인스턴스가 재시작되거나 RDS에 장애 처리가 발생했을 때 이벤트가 발생하는데 이 이벤트들에 대해서 Amazon SNS와 연동하여 이메일, Slack 알림 등을 남기는 작업을 할 수 있습니다. 또 CloudWatch 경보에서와 마찬가지로 이벤트 대응에 대한 가이드라인이 마련되어 있는 상황에서는 이벤트가 발생하였을 경우 자동으로 가이드라인에 따라 작업을 처리하도록 구성할 수도 있습니다. AWS Lambda 뿐만 아니라 자동화된 프로세스를 지원하는 AWS Systems Manager RunCommand, AWS Step Functions 등의 다양한 AWS의 여러 기능들과 연동할 수 있습니다. 이벤트의 발생 목록을 CloudWatch Logs에 수집하여 이후에 분석하는 것도 가능합니다.
CloudWatch 대시보드 활용하기
CloudWatch에 수집된 내역들을 관리 콘솔에서 시각화하기 위해서는 Amazon CloudWatch 대시보드를 사용하면 됩니다. CloudWatch의 경우 각 서비스별로 자동으로 만들어지는 대시보드가 있어서 각 서비스에 대한 시각화는 쉽게 시작할 수 있습니다. 전체적인 서비스를 통합하고, 자신의 애플리케이션에서 만들어낸 커스텀 지표와 경보 설정을 포함하여 대시보드를 만들게 되면 보다 정교하고 최적화된 대시보드를 생성할 수 있을 것입니다.
그 외 CloudWatch 기능들
Amazon CloudWatch에는 위에서 설명한 기능 외에도 다양한 기능들이 있으며, 이러한 기능들을 서로 연동하여 다각도로 모니터링 할 수 있도록 지원하고 있습니다.
AWS CloudWatch Container Insights는 컨테이너 에코시스템에서 로그를 간단히 수집하고 분석하는 것을 도와주는 기능입니다. 컨테이너 환경의 경우 기존의 인스턴스 환경보다 더 다양한 계층의 정보를 수집하고 분석해야 하는데 CloudWatch Container Insights 가 이 과정을 쉽게 구성할 수 있도록 해 줍니다.
만약 .NET 및 SQL Server 애플리케이션을 구동 중이라면 .NET 및 SQL Server 애플리케이션용 CloudWatch Application Insights를 사용하여 애플리케이션 리소스 및 기술 스택(예: 데이터베이스, 웹(IIS) 및 애플리케이션 서버, 운영 체제, 로드 밸런서, 대기열 등) 전반에서 주요 지표 및 로그를 파악하고 설정할 수 있도록 지원합니다.
Amazon CloudWatch ServiceLens를 사용하면 애플리케이션의 상태, 성능 및 가용성을 한 곳에서 시각화하여 분석할 수 있습니다. Amazon CloudWatch Synthetics에서 제공하는 사용자 입장에서의 애플리케이션 앤드포인트 모니터링 기능 및 AWS X-Ray의 성능 트레이스와도 결합되어 포괄적인 애플리케이션 및 애플리케이션의 종속성 정보를 제공합니다.
Amazon CloudWatch Contributor Insights를 활용하면 시계열 데이터를 분석하여 시스템 성능에 가장 큰 영향을 미치는 기여 요소를 확인할 수 있습니다. 특히 앞에서 설명했던 지표 내장형 로그와 연계를 통하여 운영 이벤트 발생 시 신속하게 특정 리소스, 특정 고객 계정 또는 특정 API 호출과 같이 시스템 및 애플리케이션 성능에 크게 영향을 미치는 사람이나 대상을 이해할 수 있도록 해줍니다.
마치며
모니터링은 안정적인 서비스 운영을 위해서 필수불가결한 작업입니다. 하지만 게임 서비스의 경우 주요 재미를 만들어내는 기능과는 거리가 있는 부분이기 때문에 그 중요성에 비해 간과되기 쉬운 영역이기도 합니다. Amazon CloudWatch를 통해서 AWS의 자원과 함께 애플리케이션을 통합적으로 모니터링하게 되면, 모니터링 인프라에 관한 관리 부담을 줄이면서, 전체 리소스를 통합적으로 분석할 수 있는 기반을 만들어 낼 수 있습니다. 추가로 궁금하신 내용 및 기술 지원이 필요하신 내용이 있다면, 언제든지 aws-gaming-korea@amazon.com으로 문의하여 주시기 바랍니다.
– 장준성, AWS 게임 솔루션즈 아키텍트