대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 모바일 앱을 위한 AWS Lambda 활용 방법
등록일 조회수 9853
첨부파일  

서버 없는 클라우드 프로그래밍 도전기

모바일 앱을 위한 AWS Lambda 활용 방법



지난 시간에는 아마존웹서비스(이하 AWS)의 새로운 이벤트와 클라우드 기반 컴퓨팅 서비스인 AWS Lambda를 소개하고, 간단한 람다 함수 예제를 통해 구동 방식을 살펴봤다. 여기에 이어 Lambda 서비스가 빛을 발휘하는 모바일 앱 서비스에서 Lambda가 어떻게 ‘서버 없는 클라우드 구조(Server-less Cloud Architecture)’를 통해 앱 개발에 대한 부담을 줄여 주고, 민첩하고 빠른 모바일 앱 개발을 가능케 하는지 소개한다.



대부분의 모바일 서비스는 안드로이드 및 iOS 클라이언트 앱에서 많은 기능을 수행한다. 백엔드 서버와의 통신은 대개 미디어 업로드, 데이터 전송 및 동기화 등인데, 이들 모두는 API(Application Programming Interface) 기반 동작이 대부분이다.



서버 없는 모바일 앱 클라우드 백엔드

모바일 앱 개발자는 사용자 인증, 데이터 동기화, 사용자 행동 분석, 미디어 저장 및 공유, 푸시 알림, 공유 데이터 저장, 실시간 스트림 처리 등의 서비스를 필요로 한다. 좋은 소식은 이러한 서비스 요구 사항 모두를 AWS의 모바일 서비스 빌딩블럭을 통해 쉽게 처리할 수 있다는 점이다. Amazon Cognito를 사용하면 앱 환경 설정이나 게임 상태와 같은 사용자 데이터를 저장 및 동기화할 수 있다. 트위터, 페이스북, 구글에서 제공하는 소셜 로그인 기능도 통합적으로 제공한다. 뿐만 아니라 자체적인 계정 인증 방법을 통해 사용자들이 모바일 앱에서 로그인할 수도 있다. 별도 로그인 시스템 없이 말이다. 모바일 앱은 AWS 자원에 접근하는 강력한 보안 및 권한 체계 하에서 데이터를 보관, 저장할 수 있으며, 이러한 인증을 기반으로 각 디바이스간의 데이터 동기화도 가능하다.

Amazon Simple Notification Service(SNS)를 통해서는 애플, 구글, 파이어OS, 윈도우 디바이스는 물론 바이두 클라우드 푸시(Baidu Cloud Push)를 이용해 중국의 안드로이드 디바이스에도 푸시 알림을 전송할 수 있다. 하루에 수십억 개 이상 전송 가능한 확장성이 뛰어난 메시징 서비스를 서버 없이 이용할 수 있다.



사용자가 모바일 앱을 어떻게 활용하는지에 대한 심도 있는 통찰력도 얻을 수 있다. Amazon Mobile Analytics를 이용하면 말이다. 이 서비스는 앱에 간단한 코드를 삽입하는 것만으로 앱 사용 데이터를 수집하고 분석한다. 관리 콘솔의 대시보드에서 이용 추세를 모니터링할 수 있고 직접 분석하고 싶은 이벤트나 데이터를 설정해서 받을 수 있다. 보다 자세한 분석이 필요하다면 앱에서 수집된 통계 데이터를 Amazon S3와 Amazon Redshift로 자동으로 내보낼 수도 있다.

기존 AWS 서비스와는 네이티브 SDK(Software Developers Kit)를 통해 손쉽게 연결할 수 있다. 안드로이드, iOS, 유니티 및 자마린(Xamarin), 자바스크립트(JavaScript) SDK를 통해 Amazon S3 Transfer Manager, DynamoDB Object Mapper, Kinesis Recorder 등을 활용하면 모바일 데이터를 AWS 내부 서비스와 유기적으로 연결할 수 있다.



람다 함수를 통한 모바일 앱 로직 설계하기

여기서 우리가 최종적으로 고려해야 할 사항은 바로 모바일 앱의 비지니스 로직이다. 예컨대 우리는 사용자들이 사진을 올리면 썸네일 이미지를 만들고 사용자, 찍은 날짜, 위치, 사진기 등의 정보가 담긴 메타 데이터를 데이터베이스에 저장해야 한다고 가정하자. 저장된 메타 데이터를 기반으로 주변에 사진이 많이 올라오는 곳(예를 들어 특정 행사가 열리는 장소)의 주변에 있는 사용자에게 그 정보를 알려주는 모바일 앱이다.

이를 위해 백엔드 서버를 구성하고 썸네일을 만든 다음, 데이터베이스를 저장 및 업데이트해야 한다. 또 트렌드를 분석해서 푸시 알림을 보내는 웹 애플리케이션도 개발해야 한다. 프로그램의 개발 및 배포뿐 아니라 서버의 확장성, 관리, 비용 등 고려해야 할 것들이 꽤나 많다. 그런데 몇 개의 AWS 람다 함수를 구성하면 서버 없이 클라우드 서비스 백엔드를 구성할 수 있다(<그림 2> 참조).



사용자가 모바일 앱에서 사진을 Amazon S3에 업로드한다. 그러면 업로드 이벤트를 감지하고 썸네일을 만드는 람다 함수와 사진의 메타데이터를 추출해 DynamoDB에 저장하는 람다 함수가 실행된다. DynamoDB에 사진 데이터가 추가됐다는 이벤트가 발생하면, 이 중 위치 기반 데이터를 바탕으로 주변 트렌드를 파악, 이를 트랜드 테이블에 저장하고 람다 함수가 실행된다. 다시 주변에 있는 사용자에게 푸시 알림을 보내는 람다 함수를 다시 호출되는 식으로 애플리케이션이 구동된다. 이러한 이벤트 기반의 동기적 방식으로 원하는 기능을 필요할 때에 수행할 수 있다.



<그림 3>은 람다 함수를 이용해 모바일 백엔드를 실제 구동하는 앱의 구조다. 모바일 앱 사용자들이 Amazon Cognito를 통해 로그인을 하고, Amazon S3에 이미지를 업로드하면 람다 함수는 S3와 DynamoDB에서 각각 썸네일을 생성하고 데이터를 업데이트한다. 또한 다른 친구 사용자에게 알림 푸시까지 보낸다. 여기서 모바일 사용자가 Amazon Cognito로 로그인했을 때, 구동되는 람다 함수는 <리스트 1>과 같다.



<리스트 1> Cognito에 반응하는 람다 함수 exports.handler = function(payload, context) { console.log("Received event"); context.succeed("Hello "+ payload.firstName + ". Your user ID is " + context.identity.cognitoIdentityId + " and your platform is " + context.clientContext.client.platform); };



이제 모바일 앱에서 람다 함수를 호출하는 코드를 살펴보자(<리스트 2> 참조). iOS용 AWS 모바일 SDK를 추가하고, AWS CognitoCredentialsProvider를 설정하면 된다.



<리스트 2> iOS에서 Cognito에 반응하는 람다 함수 AWSLambdaInvoker *lambdaInvoker = [AWSLambdaInvoker defaultLambdaInvoker]; [[lambdaInvoker invokeFunction:@"hello" parameters:@{@"firstName" : @"Your Name", @"identity" : @"My ID"}] continueWithBlock:^id(BFTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); } if (task.exception) { NSLog(@"Exception: %@", task.exception); } if (task.result) { NSLog(@"Result: %@", task.result); NSString *result = task.result; // Do something with result. }}];



보다 자세한 설정 및 구현 방법은 이 글의 끝에 있는 참고자료를 확인하자. Amazon Cognito뿐 아니라 모바일 푸시 알림을 보내는 Amazon Simple Notification Service(SNS)를 활용하는 다양한 람다 함수 예제도 살펴볼 수 있을 것이다. 이렇듯 AWS 모바일 서비스를 비롯한 다양한 클라우드 기능을 연계해 확장 가능한 모바일 백엔드를 구축하면 다른 업무 부담 적어진다. 앱 개발이나 비즈니스 등 더 중요한 업무에 보다 집중할 수 있게 되는 것이다.



람다 함수로 간단한 모바일 백엔드 만들기

지금부터는 람다 함수를 통해 간단한 모바일 백엔드를 만들어보자. 먼저 AWS 관리 콘솔에서 Lambda 서비스를 선택한 후, 람다 함수를 새로 생성한다. 그러면 이전 연재와 달리 <그림 4>처럼 11개 정도의 샘플 코드가 보일 것이다. AWS 서비스와 Lambda를 연계할 수 있는 샘플 코드들인데, AWS는 이러한 샘플들을 지속적으로 추가하고 있다.



모바일 앱에서 데이터를 추가하고 삭제하는 방식처럼, 특정 API를 통해 REST 호출을 할 경우 DynamoDB에 데이터를 업데이트하는 ‘Microservice-http-endpoint’라는 샘플 예제를 개발해보자. <그림 5>처럼 람다 함수명을 입력한 후, 미리 생성된 샘플 코드를 확인한다. 그리고 DynamoDB 업데이트를 위한 사용자 권한을 생성한 후 [Next] 선택한다. (API 게이트 웨이 서비스는 현재 버지니아, 오레곤, 아일랜드 리전에서만 가능하므로, 가급적 리전을 변경해 람다 함수를 생성하자.)



Node.js 샘플 코드는 매우 간단하다. ‘operation’이라는 매개변수에 따라 신규 값을 추가하거나, 업데이트 또는 목록을 보여주는 일을 한다.



<리스트 3> 이벤트에 따라 DynamoDB를 제어하는 람다 함수 var doc = require('dynamodb-doc'); var dynamo = new doc.DynamoDB(); exports.handler = function(event, context) { //console.log('Received event:', JSON.stringify(event, null, 2)); var operation = event.operation; delete event.operation; switch (operation) { case 'create': dynamo.putItem(event, context.done); break; case 'read': dynamo.getItem(event, context.done); break; case 'echo': context.succeed(event); break; default: context.fail(new Error('Unrecognized operation "' + operation + '"')); } };



람다 함수를 작성했다면 이제 이를 실행할 Amazon API Gateway 예제를 세팅하자. Amazon API Gateway는 지난 7월 AWS 뉴욕 서밋(New York Summit)에서 발표된 신규 서비스로, 모바일과 웹, 기업용 또는 사물인터넷(IoT) 애플리케이션에서 REST 기반 호출 서비스를 위한 API를 생성 게시, 유지 관리, 모니터링 가능한 확장성 있는 관리형 서비스다. 이 서비스를 통해 기존에 API를 운영하고 있는 경우 외부 혹은 사내 팀에게 API를 제공할 때 뒤따르는 부담을 덜 수 있다. API Gateway는 EC2에 있는 애플리케이션, 람다 함수 및 외부에 있는 API 등을 엔드 포인트로 사용할 수 있다. 먼저 <그림 6>처럼 API의 이름, 호출 방식 등을 입력한 후 [Next]를 클릭하자.





그러면 람다 함수와 함께 <그림 8>처럼 간단한 API 백엔드가 만들지는데 API Endpoint로 람다 함수가 연결된 것을 확인할 수 있다. 만약 [prod]을 클릭하면 자동으로 만들어진 API Gateway로 연결될 것이다. API Gateway에서 생성한 메소드를 선택하면 API의 호출 프로세스를 한 눈에 확인할 수 있다. 이제 외부에서 API Endpoint로 호출할 경우 Lambda 함수가 실행되고 그 결과가 전달된다.



여기까지 모든 작업을 완료했다면 이제 [TEST]를 클릭해 람다 함수가 의도대로 동작하는지 확인해보자. 테스트 시 입력 결과를 그대로 출력해주는 operation인 ‘echo’를 선택한다. JSON 포맷의 경우 <그림 9>처럼 입력하자. 이제 TEST 버튼을 누르면 결과 응답 코드로 200이 나올 것이다. 만약 실제로 DynamoDB 테이블을 생성하고, API 매개변수와 함께 JSON 데이터를 통해 키와 밸류를 입력하면 DynamoDB 테이블에 실제 데이터가 추가된다.



마지막으로 AWS Lambda 서비스로 이동해 실제로 람다 함수 호출이 이루어지는지 모니터링 탭에서 확인해보자(<그림 10> 참조).



지금까지 우리는 AWS Lambda를 통해 서버 없는 모바일 백엔드에 대한 간단한 구현 방법 그리고 예제를 통해 실제 사례에 간단히 적용해봤다. 현재 AWS 클라우드를 사용하는 많은 모바일 앱 개발사들이 AWS 모바일 서비스와 AWS Lambda를 활용한 효율적인 백엔드 구축을 진행하고 있다. 이러한 활용 사례는 모바일뿐만 아니라 많은 인터넷 기기로부터 센서 데이터를 받아 서비스하는 사물인터넷 분야에도 적용 가능하다. 서버 운영의 부담 없이 확장 가능한 서비스를 손쉽게 구현할 수 있기 때문이다.



출처 : 마이크로소프트웨어 9월호

제공 : 데이터 전문가 지식포털 DBguide.net