[개발] AWS Lambda with Apex

Tamm
6 min readApr 3, 2016

--

지난 해 Amazon은 AWS Lambda 라는 새로운 서비스를 발표했다. 당시 별다른 관심이 없어서 넘어갔는데 얼마전에 Outsider님이 작성한 AWS Lambda를 이용해서 HTTP API 만들기 라는 글을 보고 급 관심이 생겼다. 자세한 내용은 위 링크에서 단계별로 잘 정리되어 있으니 참고하면 좋을 것 같다.

AWS Lambda에 대해 모르는 사람들을 위해 간단하게 설명하자면 AWS에 있는 수많은 서비스들을 이용해 실제 서버를(혹은 인스턴스) 구축하지 않고 순수하게 함수만으로 서비스를 구축할 수 있는 일종의 Serverless Architecture라고 할 수 있다. 비용도 인스턴스를 직접 운영하는 것에 비해 저렴하며, 처음에는 Node.js 만을 지원했지만 현재는 Java, Python 등 다양한 언어를 지원하고 있다.

이번 글에서는 Node.js에 막대한 기여를 하고 Go로 홀연히 떠나간(…) TJ Holowaychuk이 AWS Lambda를 조금 더 쉽게 관리하고 배포할 수 있게 만든 Apex에 대해 간단하게 알아보려고 한다.

개요

Apex는 Go로 작성되었으며 AWS Lambda를 보다 쉽게 관리할 수 있게 만들어진 도구이다. TJ가 Apex를 개발하게 된 동기는 혼자서 여러 프로젝트를 개발하고 관리하는데 있어 직접 서버를 관리하고 유지보수 하는 것에 대한 부담을 느꼈었다고 한다. 그래서 처음에는 AWS Lambda와 API Gateway를 사용하게 되었는데 사용성이 영 별로라 Apex를 만들게 되었다고 한다.

설치 및 기본 설정

Linux, Mac OS에서는 쉘 스크립트를 통해 설치할 수 있다. Windows는 직접 바이너리를 받아 설치해야 한다.(이것도 올해 여름이면 해방되는건가?)

또한 최신 버전 업데이트는 apex upgrade 명령어로 할 수 있다.

curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

다음으로 본인이 가지고 있는 AWS IAM에 대한 정보를 설정해야 한다. 예를 들어 아래와 같이 설정하면 된다.

$ export AWS_ACCESS_KEY=AKIBIU2SHFK2JDE13GFF
$ export AWS_SECRET_KEY=AkwofxB3fK2sbGFDcy+F2xzsffkAdosFDHlIQ
$ export AWS_REGION=ap-northeast-1

AWS CLI 설정 파일인 ~/.aws/config를 사용해서도 가능하긴 한데 테스트 중에 이쪽에서 계속 NoCredentialProviders 에러가 발생해서 포기했다.

프로젝트 생성

Apex는 기본적으로 프로젝트 단위로 동작한다. Lambda는 그냥 함수의 집합이지만 이러면 함수가 많아졌을 때 관리가 어렵기 때문이 아닌가 싶다. 기본적인 구조는 다음 트리를 참조하자.

project.json
functions
├── bar
│ ├── function.json
│ └── index.js
└── foo
├── function.json
└── index.js

첫 번째로는 프로젝트로 사용할 디렉토리를 하나 만들고 project.json 파일을 설정해야 한다.

$ mkdir apex-project
$ vi project.json

project.json 파일에는 해당 프로젝트에서 사용할 기본적인 설정들을 담고 있다. 물론 각 함수별로 function.json을 통해 설정할 수도 있지만 공통적인 부분은 project.json에 담아두면 편할 것 같다. 기본 설정은 다음과 같다.

{ 
“name”: “node”,
“description”: “Node.js example project”,
“role”: “arn:aws:iam::293503197324:role/lambda”,
“memory”: 512
}

중요한 부분만 살펴보면 첫 번째 name 속성은 프로젝트의 이름을 지정하는 부분으로 별다른 nameTemplate 속성을 지정하지 않으면 name_functionName 형태로 함수가 업로드 된다. 다음은 role 부분인데 이건 Lambda에 대한 ARN을 넣어주면 된다. 마지막 memory는 해당 함수에 얼마나 메모리를 할당할지를 설정할 수 있다.

다음으로 함수들을 저장할 functions 디렉토리를 생성하고 실제 Node.js 파일을 생성해보자.

$ mkdir functions
$ cd functions && mkdir foo && cd foo
$ vi index.js

소스코드는 Apex 소개에 나와있는 예제를 사용해보자. 이벤트를 출력하고 간단한 JSON을 반환하는 함수이다.

console.log(‘start foo’)
exports.handle = function(e, ctx) {
console.log(‘processing event: %j’, e)
ctx.succeed({ hello: ‘from foo’ })
}

배포

이제 실제 배포를 해볼 차례이다. 위에서 AWS IAM 설정을 정확히 했다면 apex deploy 명령을 통해 현재 프로젝트를 Lambda에 배포할 수 있다.

apex$ apex deploy
• creating function function=foo
• config unchanged function=test
• code unchanged function=test
• created alias current function=foo version=1
• function created function=foo name=node_foo version=1

본인 같은 경우에는 이미 test라는 함수를 만들어놓고 배포된 상태이기 때문에 변경점을 확인하는 부분이 들어가 있지만 정상적으로 foo 함수를 생성했다는 메세지가 출력되었다. 만약 특정 함수만 배포하고 싶다면 apex deploy FUNC 형태로 배포하면 된다.

이제 실제 AWS Lambda 콘솔에 접속하게 되면 다음과 같이 정상 배포된 모습을 확인할 수 있을 것이다.

AWS Lambda 배포 결과

이 외에도 실행 결과를 터미널 상에서 직접 확인할 수 있거나 CloudWatch를 통해 로그를 추적 하는 등 여러 기능들이 있으니 Apex 공식 사이트에 가서 확인해보는 것을 추천한다.

결론

확실히 Apex를 사용하게 되면 AWS Lambda를 보다 쉽게 관리할 수 있을 것 같다. 조금 더 공부해보고 실제 서비스에 적용할 수 있는 부분을 찾아봐야겠다.

Reference

https://blog.outsider.ne.kr/1205

--

--