AWS, Lambda + API Gateway 를 이용한 RESETful API 개발 #1
Cloud 서비스를 제공하는 업체 대부분은 Cloud 환경 구축에 주 목적을 On-Premise 환경 그대로 가상화(Virtualization) 하는데 주력했다. 이는 IDC 를 사용하고 있는 고객을 흡수 하기 위한 유일한 선택이었고, 그들(기존 IDC에서 서비스를 운영하는 업체)은 베어메탈 형태로서는 성에 차지 않았기 때문이다. 이제, 대부분의 모든 서비스가 Cloud 에서 구현 가능한 시대가 왔다.
(불과?) 수년 전 부터 Cloud 는 서버리스(Serverless)를 지향하고 있다. 서버리스는 개발이 개인되는 관리형 인터페이스의 완성형이다. 일장일단이 명확하지만, 대부분 장점만 바라고고 만든다. (단점은 ‘비용’ 이 상대적으로 높고, 개발 운신의 폭이 넓지 않다는 것. 만약 복잡도가 높고, 응용해야 하는 경우가 많은 경우. ‘최신’의 ‘하이테크’ 기술이 들어갈 경우 고민이 필요하다.)
- 환경 구축의 최소화 (!!)
- 유연한 스케일링 (!!!)
- 명확한 모니터링 (!)
API Gateway 와 Lambda 는 AWS Serverless 솔루션 구축을 위한 핵심 서비스로 Lambda 는 기능을, API Gateway 는 통로(인터페이스)를 제공한다. 물론 빼먹을 수 없는건 API Gateway Cache 인데. 이 서비스는 ‘FastCGI 개념’으로 이해하면 쉽다. 이 포스트에선 API Gateway 와 Lambda 를 사용한 REST API 를 만들고자 한다.
아키텍쳐
사용자에게 배포된 어플리케이션 (또는 서비스)의 요청을 API Gateway 의 RESTful API 에서 받아, 처리한뒤 결과를 회신한다. 사용자는 API Gateway의 EndPoint만 바라보지만, 실제 처리는 Lambda Function 이 담당한다.
아래 구조에서는 ‘인증’ 및 ‘부하분산’ 그리고 ‘보안’ 요소를 감안하지 않고 있지만, 실제 서비스를 위해선 이 3가지 요소는 반드시 고려되어야 할 대상이다.
이 포스트에선 헤더(Header)를 동적으로 변경하고, XSS(Cross Site Scripting, 크로스 사이트 스크립트)에 대응부분도 포함하고자 한다. 가장 기본적인 API Gateway 를 다루고자 하니, 본인이 고급 개발자라면 어서 뒤로 가기 버튼 클릭을.
Lambda 생성
API Gateway 의 요청을 처리할 Lambda “Function”을 만든다. 만약, Stand-alone 형태라면 Lambda “Application” 을 만들어야 할 것이다. 별도의 예제 또는 기존에 만들어진 조건을 사용하지 않는다면 “Author from scratch”를 선택하면 된다.
Node, Python, Java, Go Lang 등의 다양한 언어를 제공하며, 버전은 LTS 기준이다. 실행 권한은 기본 상태로 두고 진행하자. 이 포스트에서는 NodeJS 를 선택했다. (단순 처리 용도에서 NodeJS 만큼 빨리 만들 수 있는 언어는 없다 확신한다. 루비가 없으니까!?)
트리거를 추가할 수 있는 디자이너와 함수코드를 위한 인라인 코드-에디터(Inline Code-Editor, 이하 코드 에디터)가 보인다. 우리는 API Gateway 와 이 함수를 연결할 것이다.
API Gateway 지정
Designer 최상단에 위치한 API Gateway 를 선택하면, 디자인 페이지에 API Gateway 가 추가 되며, 코드-에디터가 보였던 영역이 ‘트리거 구성’으로 바뀌게 된다.
이 Lambda 를 위한 API Gateway 가 존재하지 않기 때문에 ‘새 API 생성(Create a new API)’을 선택하고, 보안은 ‘열기(Open)’를 지정하자. 앞서 언급한 것 처럼, 이 예제에서는 ‘인증’ 절차를 감안하지 않고 있다. API 이름은 URL 의 구성요로소 사용되기 때문에 보다 신중한 선택이 필요하다.
새로운 트리거가 추가 됐다. (‘아니’라는 반말과 함께)
우측 상단의 저장 버튼을 클릭함으로서 Lambda 함수가 생성 된다.
생성된 Lamba Function은 목록에서 확인할 수 있다.
Lambda 함수 확인
이번에 생성한 함수는 이름에서 알 수 있듯 Heartbeat check 용이다. 하지만, 아키텍쳐를 보면 흐름은 RDS 까지 연결되어 있다. 즉, 흐름에서 알 수 있듯 성공적 Heartbeat check 를 위해선 RDS 연결까지 문제 없어야 한다. 이 부분은 다음 포스트에서 작성하고 오늘은 우선 여기까지.
exports.handler = async (event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
별도의 도구가 없어도 정상 동작 여부를 확이할 수 있다. 디자이너에서 API Gateway 를 선택하자. 그리고 API Gateway 의 이름을 선택하면 API Gateway Service 로 이동한다. 그리고 테스트 버튼을 누르면, 앞서 코딩되어 있던 Hello from Lambda 와 더불어 200 HTTP_CODE 가 회신됨을 확인할 수 있다.