TypeScript로 Lambda를 작성할 준비

하고 싶었던 일



AWS의 Lambda의 이야기를 듣고, Serverless에 흥미를 가지고 이미 3년(더?) 지났다.
그 무렵부터 만져보고 싶다고 생각하면서, 좀처럼 제대로 만질 기회가 없었기 때문에 만져 보았습니다 ❗

왜 TypeScript?



원래 자바를 만져 와서 지금은 Kotlin입니다만・・・
둘 다 Lambda로 쓰려면 그다지 적합하지 않습니다 (; ´∀`)

巷에서는 node나 Python 근처가 주류인가?
re:Invent에서 Ruby도 추가되었기 때문에 이쪽도 조금 늘어날까라고.

다만, 나 자신 Python도 Ruby도 그다지 만진 적 없고, 자신의 리소스적으로는 TypeScript일까라고.
그래서 TypeScript로 쓰려고 생각했습니다!

AWS-CLI는 포함되어 있으며 자격 증명도 구성되었습니다.

yarn을 넣어 보았습니다.



최근에는 npm이 아니라 yarn의 기사를 좀 봐서 이번에는 이쪽을 넣어 보았다.
Mac이므로 homebrew에서 Install
brew install yarn

설치 대상은/usr/local/Cellar/yarn/1.15.2/bin/yarn이었습니다.
우선 sample 프로젝트의 디렉토리를 끊고 그 안에서 yarn의 초기화
$ mkdir serverless-typescript-sample
$ cd serverless-typescript-sample
$ yarn init
yarn init v1.15.2
question name (serverless-typescript-sample): 
question version (1.0.0): 
question description: 
question entry point (index.js): 
question repository url: 
question author: 
question license (MIT): 
question private: 
success Saved package.json
✨  Done in 13.12s.

package.json이 완성됩니다.

package.json
{
  "name": "serverless-typescript-sample",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

환경 구축




패키지
버전


yarn
v1.15.2

nodejs
v11.12.0

typescript
v3.2.4

Serverless
v1.40.0

serverless-offline
v4.9.3


Git



Git 초기화 및 원격 리포지토리 추가.
리모트 리포지토리는 Github이므로 다른 경우에는 적절하게 변경합니다.
git init
git remote add origin [email protected]:*************************************.git

Serverless Framework



이번에는 글로벌 영역에 설치하지 말고 node_module 안에 둡니다.
방금 넣은 yarn으로 설치.
yarn add serverless
yarn add v1.15.2
info No lockfile found.
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 281 new dependencies.
info Direct dependencies
└─ [email protected]
info All dependencies

✨ Done in 6.61s.
``

설치가 끝나면 프로젝트도 만들어 버립니다.

aws-nodejs-typescript의 경우 package.json에 변경 사항이 추가되므로 이미 있으면 오류가 발생합니다.
우선 하나 아래의 계층에 패스 지정해 같은 이름의 디렉토리 만들기합니다.
yarn sls create -t aws-nodejs-typescript -p serverless-typescript-sample

이런 느낌이 들기 때문에 serverless-typescript-sample 디렉토리의 내용을 전부의 디렉토리로 이동합니다.
package.json만은 원코피하면 serverless가 사라져버리므로 수동으로 합니다.

이동 전 디렉토리 구성


이동 후 디렉토리 구성


수동으로 고친 후 package.json

package.json
{
  "name": "serverless-typescript-sample",
  "version": "1.0.0",
  "description": "Serverless webpack example using Typescript",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "serverless": "^1.40.0",
    "source-map-support": "^0.5.10"
  },
  "devDependencies": {
    "@types/aws-lambda": "^8.10.17",
    "@types/node": "^10.12.18",
    "serverless-webpack": "^5.2.0",
    "ts-loader": "^5.3.3",
    "typescript": "^3.2.4",
    "webpack": "^4.29.0"
  },
  "author": "The serverless webpack authors (https://github.com/elastic-coders/serverless-webpack)",
  "license": "MIT"
}

package.json을 변경했으므로 yarn install 에서 종속성을 업데이트합니다.

로컬 개발 환경 구축



serverless-offline



로컬에서 Lambda를 실행할 수 있도록 serverless-offline를 yarn으로 설치합니다.
$ yarn add -D serverless-offline
yarn add v1.15.2
[1/4] 🔍  Resolving packages...
warning serverless-offline > h2o2 > [email protected]: This version is no longer maintained. Please upgrade to the latest version.
warning serverless-offline > hapi > catbox > [email protected]: This version is no longer maintained. Please upgrade to the latest version.
warning serverless-offline > hapi > heavy > [email protected]: This version is no longer maintained. Please upgrade to the latest version.
warning serverless-offline > hapi > podium > [email protected]: This version is no longer maintained. Please upgrade to the latest version.
warning serverless-offline > hapi > shot > [email protected]: This version is no longer maintained. Please upgrade to the latest version.
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...
success Saved lockfile.
success Saved 37 new dependencies.

설치한 후 serverless.yml 의 plugin에

serverless.yml
plugins:
  - serverless-offline

추가할 수 있으면 yarn sls offline start 로 로컬 서버의 기동을 합니다.
yarn sls offline start
yarn run v1.15.2
$ /Users/hisayuki/vscode/serverless-typescript-sample/node_modules/.bin/sls offline start
Serverless: Bundling with Webpack...
Time: 1348ms
Built at: 2019/03/30 22:01:55
         Asset     Size   Chunks             Chunk Names
    handler.js  129 KiB  handler  [emitted]  handler
handler.js.map  146 KiB  handler  [emitted]  handler
Entrypoint handler = handler.js handler.js.map
[./handler.ts] 307 bytes {handler} [built]
[./node_modules/buffer-from/index.js] 1.56 KiB {handler} [built]
[./node_modules/source-map-support/register.js] 25 bytes {handler} [built]
[./node_modules/source-map-support/source-map-support.js] 17.6 KiB {handler} [built]
[./node_modules/source-map/lib/array-set.js] 3.12 KiB {handler} [built]
[./node_modules/source-map/lib/base64-vlq.js] 4.6 KiB {handler} [built]
[./node_modules/source-map/lib/binary-search.js] 4.15 KiB {handler} [built]
[./node_modules/source-map/lib/mapping-list.js] 2.28 KiB {handler} [built]
[./node_modules/source-map/lib/source-map-consumer.js] 39.6 KiB {handler} [built]
[./node_modules/source-map/lib/source-map-generator.js] 14 KiB {handler} [built]
[./node_modules/source-map/lib/source-node.js] 13.5 KiB {handler} [built]
[./node_modules/source-map/source-map.js] 405 bytes {handler} [built]
[fs] external "fs" 42 bytes {handler} [optional] [built]
[module] external "module" 42 bytes {handler} [optional] [built]
[path] external "path" 42 bytes {handler} [built]
    + 3 hidden modules
Serverless: Watching for changes...
Serverless: Starting Offline: dev/us-east-1.

Serverless: Routes for hello:
Serverless: GET /hello

Serverless: Offline listening on http://localhost:3000

이제 curl이나 직접 브라우저에서 Lambda를 실행할 수 있습니다!
$ curl http://localhost:3000/hello
{"message":"Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!",....

요약



템플릿의 aws-nodejs-typescript가 package.json이 있다면 작동하지 않는 곳에 대해서는 귀찮지만, 글로벌 영역에 serverless를 설치하면 특히 문제 없습니다.
이번에는 프로젝트 내에서 담아두고 싶다는 조건이 있었기 때문에 수고를 걸었습니다.

그 점 이외에 대해서는 비교적 부드럽게 환경 구축을 할 수 있었기 때문에 어렵지 않다고 생각합니다.
로컬 실행 환경이나 테스트 환경등도 이전 했을 때보다 간단하게 되어 버리는군요.

좋은 웹페이지 즐겨찾기