Amazon Web Services 한국 블로그

게임 개발 시 AWS Lambda를 통한 서버리스 아키텍처 활용하기

대규모 글로벌 게임 사용자를 위한 빠르고 민첩한 게임 서비스 개발을 위해 클라우드 활용은 필수가 되었습니다. 세계 최대 게임 회사의 90%가 AWS 기반 게임 서비스를 제공하고 있으며, 국내 게임 매출 상위 15개사 모두 AWS를 사용하고 있습니다. 사용자가 많은 만큼 사용하는 방식도 사용자마다 다양하지만, 그 중에서도 많은 경험을 바탕으로 정제되어 만들어지는 모범 사례들이 있습니다. 이러한 AWS 기반 게임 개발자들이 경험하는 서비스 제공 이슈를 해결 할 수 있는 다양한 모범 사례를 여러분께 주기적으로 공유해 드리고자 합니다. 오늘은 게임에서 AWS Lambda 활용하는 방법에 대해 설명해 드리려고 합니다.

최근 몇 년 사이 서버리스(Serverless) 라는 말을 한번쯤은 들어보셨을 겁니다. 서버리스 아키텍처(Serverless Architecture)라는 개념은 근래 가장 주목 받고 있고 흥미로운 개념 중 하나인데, 이 말을 처음 들었을 때, 서버 개발자이던 저는 “서버 개발이 앞으로 필요없어 지는게 아닐까?” 라는 생각에서부터 흥미를 느꼈었던 기억이 있네요.

서버리스는 사용자가 서버를 직접 프로비저닝하거나 운영 및 관리할 필요 없이, 서비스를 구축하고 코드를 실행할 수 있도록 구조화하는 아키텍처입니다. 이러한 서버리스 기반의 아키텍처는 인프라의 운영 및 관리에 대한 부담을 덜어주고 서비스 자체에 보다 집중하도록 만들 수 있습니다.

하지만, 서버리스 아키텍처는 이러한 이점들에도 불구하고 아직 낯설게 느껴질 수 있습니다. 어떻게 시작해야할지, 우리 게임에 어떤 도움을 줄 수 있을 지 확신이 안 생길 수도 있습니다.

이번 이야기 에서는 서버리스 환경 구성에 있어서 가장 핵심적인 AWS Lambda 에 대해 알아보려고 합니다. Lambda 를 통해 서버리스 환경이 어떻게 구성되어질 수 있고, 어떠한 이점을 가질 수 있으며, 우리 게임에 어떻게 활용될 수 있을지 알아보도록 하겠습니다.

AWS Lambda 소개

AWS Lambda 란, 서버리스 아키텍처의 핵심으로 서버에 대한 걱정 없이 코드를 실행할 수 있도록 제공하는 서비스입니다.

기존에 우리는 게임서버를 구성하기 위해 코드를 작성하고 서버 머신을 구축하고 해당 머신에 배포할 수 있는 방법을 고안해야 했습니다. 코드를 배포하기 위해 우리는 배포 환경 구성을 위한 작업을 해주어야 합니다. 그리고 서버 코드를 적절히 배포한 뒤에는 지속적으로 머신과 함께 관리해주게 됩니다. 이 때, 서버 머신의 상태에 대해 지속적인 모니터링을 해줘야합니다. CPU, 메모리, I/O 등 각종 지표를 보면서 서버 머신의 상태가 양호한지 체크해줘야하고 트래픽 규모에 따라 스케일링을 해주고 부하에 대한 분산도 고려해줘야 합니다.

AWS Lambda 는 이 과정을 간소화시켜줄 수 있습니다. 배포에 대한 간소화 혜택으로, 코드를 Lambda 콘솔에서 인-라인으로 작성하거나, 패키지로 업로드하기만 하면, 자동 배포가 이루어지게 됩니다. 모니터링도 간소화할 수 있어, 필요한 각종 지표들을 Amazon CloudWatch 를 통해 손쉽게 확인할 수 있으며 X-Ray 를 통해 손쉽게 서비스와 리소스들간 관계의 시각화, 성능 병목 현상의 식별 및 오류의 근본 원인에 대한 파악이 가능합니다. 스케일링에 있어서도 혜택을 얻을 수 있는데, 대규모 트래픽 발생 시, Lambda 함수는 빠르게 확장하여 동시적 요청들을 처리합니다. 각 Lambda 함수는 할당받은 리소스의 성능을 100% 사용하기 때문에 더 효율적으로 트래픽을 처리할 수 있으며 이런 성질들 덕분에 스케일링 및 부하 분산에 대한 관리 상의 이점을 볼 수 있습니다.

AWS Lambda 를 가장 매력적으로 만드는 부분은 이러한 운영 및 관리에 대한 해택을 보면서도 비용효율적으로 서비스를 운용할 수 있다는 점입니다. Lambda 서비스는 요청 수와 요청을 처리하는 함수 시간에 따라서 요금이 발생하기 때문에 서비스의 수요가 작을 때에는 그만큼 비용이 거의 발생하지 않는 장점이 있습니다.

게임에 적용해보는 AWS Lambda

앞서 소개드린 바와 같이 AWS Lambda 를 통한 서버리스 컴퓨팅은 다양한 매력 포인트를 갖고 있습니다. 지금부터는 본격적으로 Lambda 를 어떻게 활용하면 좋을지 알아보도록 하겠습니다.

1) 메인 게임 백엔드를 서버리스 아키텍처로 구성하기

AWS Lambda 를 메인 게임 로직에 이용할 수 있습니다. 일반적으로 Lambda 함수는 상태 비저장(Stateless) 방식으로 백엔드를 구성하는데 최적화되어 있으며 게임 서버의 백엔드 로직을 RESTful 한 방식의 Web API 형태로 정의하고, 이를 통해 게임 로직을 처리할 수도 있습니다. Lambda 함수를 하나의 API 엔드포인트 형태로 만들고, 각 함수가 게임 데이터 조회, 게임 결과 처리 및 게임 내 다양한 상호작용을 수행하도록 할 수 있습니다.

많은 비동기 방식 게임들은 웹 기반의 아키텍처로도 구성될 수 있고, Lambda 를 이용해 다음과 같이 간단한 백엔드를 구상해볼 수 있습니다.

위의 아키텍처에서는 Lambda 가 3가지의 메인 게임 로직(main, gameStart, gameEnd)을 수행할 수 있도록 API 를 구축합니다. 여기에서 우리는 유저에 대한 엔드포인트로 구성된 Amazon API Gateway 에 대해서도 눈여겨 보실 수 있습니다. API Gateway 를 이용하여 API Endpoint 를 관리하게되면 Amazon Cognito 또는 Lambda Authorizer 와 같이 몇가지 방법을 통해 사용자에 대한 인증을 구현해볼 수 있고, API 캐싱을 통해 API 의 응답을 향상시키면서 쓰로틀링을 통해 백엔드 리소스를 보호할 수 있습니다. 그 외에도 API 배포, API 문서화 와 같은 관리 기능을 이용하시면 게임 로직의 백엔드 API 운영에 도움을 받을 수 있습니다.

API Gateway 뿐 아니라 적절한 사용 케이스에 따라서 Lambda 를 직접 호출하도록 아키텍처를 구성하거나, Application Load Balancer 의 Contents 기반 라우팅을 이용해서 Lambda 함수를 호출하도록 구성할 수도 있습니다.

다음으로 데이터베이스입니다. 데이터베이스는 게임 로직을 처리하는데 있어서 가장 중요한 역할을 담당하고있다고 생각이 됩니다. 많은 메인 게임 로직 워크로드는 RDBMS 를 메인 데이터베이스로 사용하고, 이를 위해 다음과 같은 옵션들을 고려해볼 수 있습니다.

AWS Lambda 사용과 함께 관계형 데이터베이스(RDBMS) 사용을 고려하고 있다면, 관리형 RDBMS 서비스인 Amazon RDS 를 생각해볼 수 있습니다. Lambda 에서는 VPC 내부의 RDS 에 액세스하고 이를 이용해 비즈니스 로직을 구현할 수 있습니다. AWS 에서 제공하는 강력한 RDS 서비스인 Amazon Aurora에서는 서버리스 기반의 데이터베이스 모델을 제공합니다. Aurora Serverless 는 Aurora 가 제공하는 관리의 편의성, 고가용성, 성능, 확장성 등을 제공하면서도 사용하는 데이터베이스 리소스에 대해서만 비용을 청구하는 효과적인 서비스입니다.

서버리스 환경에서 데이터베이스 워크로드를 가속화할 수 있도록 최근에 출시된 RDS Proxy 에 대한 옵션도 있습니다. RDS Proxy 는 서버리스 환경에서 Lambda 를 통한 DB Connection 을 효율적으로 사용할 수 있는 방안을 제시합니다. RDS Proxy 기능은 현재는 평가판으로 제공됩니다.

게임에서 흥미를 돋우는데 중요한 역할을 하는 랭킹 대시 보드를 만들거나, 친구와 관련된 서비스 또는 분산 환경에서 효과적으로 활용할 수 있는 비정형의 데이터 워크로드를 처리하는데에는 관리형 NoSQL 서비스인 Amazon DynamoDB 가 좋은 옵션입니다.

DynamoDB 는 데이터를 여러 가용 영역에 복제하여 뛰어난 내구성을 가지며, 트래픽을 충분한 수의 서버로 분산하여 10ms 미만의 뛰어난 성능을 제공합니다. Lambda 기반의 서버리스 워크로드에서 급증하는 DB Connection 에 대한 걱정없이 일관된 성능을 제공할 수 있습니다. 비용 면에서도 월별 첫 25GB 까지 데이터 저장이 무료로 제공되어 읽기 및 쓰기 처리량에 대해서만 비용을 지불하는 구조를 갖고 있어 서버리스 환경에 걸맞게 비용을 효율화할 수 있습니다.

유저 세션 정보와 같이 자주 접근되어야 하는 게임 데이터에 대해서는 인메모리 캐시인 DynamoDB Accelerator 를 고려해보실 수 있습니다. DynamoDB Accelerator 의 경우 시간당 비용이 청구되는 구조이기 때문에 자주 접근되면서 마이크로 초 단위의 높은 성능이 요구되는 데이터 처리에 있어서 비용 효율적으로 이용할 수 있습니다.

여기까지 간단히 Lambda 를 활용하여 구성할 수 있는 게임 로직 서비스의 서버리스 아키텍처 구조를 알아보았습니다. 더 자세한 정보나 실습을 위한 구현은 Gaming on AWS 자료서버리스 자습서 를 통해 도움을 받아볼 수 있습니다.

2) Lambda 로 게임 백엔드에 필요한 다양한 처리를 자동화하기

Lambda 함수는 다양한 AWS 서비스들과 같이 사용할 수 있습니다. 어떤 서비스들은 자신들이 수행한 작업에 대한 후처리로 Lambda 함수를 동기식/비동기식으로 호출할 수도 있습니다. 또 어떤 서비스들은 Lambda 가 변화를 모니터링하고 있다가 바뀐 데이터에 대한 작업을 수행하도록 지원하기도 합니다.

예를 들어, DynamoDB 를 이용해서 소셜 랭킹을 구현했을 때, DynamoDB 내 랭킹 정보를 Lambda 가 모니터링하다가 랭킹이 올라가면 친구를 약올려주는 메시지를 보낼 수도 있겠죠. 또는 여러 서버에서 보내는 게임의 로그들을 Amazon Kinesis Data Firehose 에 저장하고 Kinesis Data Firehose 에서 포맷들을 변환하는 Lambda 함수를 호출하여 데이터 분석에 사용할 수 있는 형태로 가공할 수도 있습니다.
이외에도 Lambda 함수를 다양한 AWS 서비스들과 결합하면 비즈니스 로직 처리를 위한 별도의 워크플로(Workflow) 를 구축하거나 이를 위한 인프라를 운영 및 관리할 필요 없이 다양한 처리를 위한 아키텍처를 유연하게 설계할 수 있습니다.

3) 주기적인 작업을 Lambda 로 효율화

게임을 개발하다 보면 운영에 필요한 개발도 정말 많습니다. 주기적으로 데이터를 백업하거나, 지난 주에 시작한 이벤트의 데이터를 추출하는 건 예사죠. 주기적으로 처리해야 하는 작업들에 대해서도 서버리스 아키텍처를 적용하면, 필요한 시점에만 작업을 수행하고, 이 작업에 대해서만 비용을 지불하는 비용 효율적인 이점을 같이 누리실 수 있습니다.

주기적인 작업을 위해서는 CloudWatch Events 를 고려해보실 수 있습니다. 일정 비율로 함수를 실행하게 하거나 cron 을 사용하듯이 Lambda 함수를 호출하실 수 있습니다.

Lambda 개발 환경 구성하기

1) 서버리스 개발 환경 구축

개발자 가이드를 참고해서 Lambda 함수 개발을 쉽게 시작할 수 있습니다. AWS 콘솔, CLI, SDK 와 같은 도구를 통해 함수를 업로드하는 작업 만으로 가장 쉽게 해당 함수를 서비스할 수 있습니다. 하지만, 개발을 하다보면 역시 IDE 의 생산성을 무시할 수 없습니다.

소프트웨어 개발자의 IDE 지원을 위해 AWS Toolkit for IntelliJ, AWS Toolkit for PyCharm, AWS Toolkit for Visual Studio, AWS Toolkit for Eclipse 와 같은 툴킷들은 개발자가 익숙한 개발 환경을 그대로 유지하면서 쉽게 Lambda 함수를 개발할 수 있도록 지원합니다.

통합 개발환경(IDE)를 고민 중이시라면 인터넷이 연결된 곳이라면 어디서든 개발을 서포트할 수 있는 AWS Cloud9 을 고민해볼 수도 있습니다. Cloud9 은 풍부한 기능을 제공하며 클라우드에서의 서비스 연동과 협업을 손쉽게 시작할 수 있습니다. 이 외에도 개발 환경 구성과 관련된 보다 자세한 사항이 향후 제공될 예정이니 관심 가져주시기 바랍니다.

개발자에게는 IDE 만큼이나 개발 환경과 생태계가 중요합니다. Lambda 를 활용한 서버리스 개발에 필요한 다양한 레퍼런스를 지원해줄 수 있는 다양한 도구들이 있습니다. AWS Serverless Application Model(SAM) 은 서버리스 어플리케이션을 위한 오픈소스 프레임워크로 AWS CloudFormation 을 이용해서 서버리스 환경에서 인프라 스택 구성을 간소화할 수 있습니다.

서버리스 어플리케이션을 위한 관리형 저장소인 AWS Serverless Application Repository 를 통해 재사용 가능한 서버리스 아키텍처를 공유하고, 공유 받은 어플리케이션을 조합하여 쉽게 서비스를 구성해볼 수 있습니다. 그 밖에도 다양한 서버리스 개발자 도구가 제공되고 있어 쉽게 서버리스 개발 환경을 시작할 수 있습니다.

2) Lambda 함수 개발 및 디버깅

이제 여러분의 게임은 서버리스로의 여정을 시작하기 위한 준비가 되었습니다. 본격적으로 함수를 개발하시는데 앞서 몇가지 도움될만한 팁들을 준비해보았습니다. Lambda 는 함수 형태로 이루어진 서비스이고, 전통적인 환경에서와 조금 다른 코딩 패턴이 필요할 수 있습니다.

하지만 큰 그림까지 다르진 않습니다. 자주 사용되는 코드 또는 라이브러리에 대해 재사용성을 향상시키기위해 Lambda 계층을 나누어 종속성을 관리하시는 방안이 있습니다. 또한 게임용 데이터베이스의 엔드포인트나, 각종 운영을 위한 변수 값들을 Lambda 환경 변수를 이용해 하드코딩하지 않고 안전하게 관리할 수 있습니다.

개발에 있어서 디버깅은 필수 요소입니다. 디버깅을 할 수 있다면 버그에 대한 공포를 상당 부분 이겨낼 수 있습니다.

Cloud9 을 사용하시면 위와 같이 서버리스 환경의 Lambda 함수에 대해 쉽게 로컬 버전의 디버깅이 가능합니다. Cloud9 이외에도 AWS SAM CLI 를 이용해서 로컬 디버깅을 해볼 수 있습니다. 각종 AWS Toolkit 들과 연동하여 디버깅을 지원받을 수 있고, 자습서 형태의 블로그도 제공되고 있으니 참고해보시면 많은 도움을 받을 수 있습니다.

마치며

게임을 개발하는 건 고된 작업입니다. 그리고 고된 작업 끝에 게임을 런칭하게 되면, 운영이라는 또다른 과제가 생기게 됩니다(눈물). 재미있는 게임을 만들기 위한 여러분의 여정에 있어서 서버리스는 상당히 매력적으로 여러분들을 도와드릴 수 있습니다.

이 글에서는 AWS Lambda 를 이용해 서버리스 아키텍처를 어떻게 게임에 접목시키면 좋을지 정리해보았습니다. 이 안내서가 여러분의 여정에 도움이 되길 바래봅니다. 추가로 궁금하신 내용 및 기술 지원이 필요하신 내용이 있다면, 언제든지 aws-gaming-korea@amazon.com으로 문의하여 주시기 바랍니다.

마지막으로 게임 솔루션즈 아키텍트들이 진행하는 AWS Game Master 웨비나를 소개합니다. 6월 17일 (수) / 6월 30일 (화) 까지 2회가 이미 진행되었고, 7월 14일 (화) / 7월 28일 (화) 에 걸쳐 추가로 2회를 트위치(Twitch)에서 라이브로 방송합니다.

이 시간에는 저희가 블로그로 다뤘던 이야기와 국내 유명 게임 고객사 성공 사례도 준비될 예정이니 많은 관심 바랍니다.

– 박진성, AWS 게임 솔루션즈 아키텍트

더 자세한 것은 최근 AWS 기반 게임 개발을 안내서 시리즈나 게임 개발 카테고리를 참고하세요!