ServerlessのTypeScript公式テンプレートを使ってみる
Serverlessをしばらく触ってこなかったので、気づかなかったのですが、v1.21.0からsls create
の際に指定する公式テンプレートにaws-nodejs-typescript
と言うものが追加されたようです。(結構前ですね...)
以前から、プラグインとして、serverless-webpackというものがあり、デプロイコマンド実行時にwebpackを使ってTypeScript→JavaScriptへのビルドタスクを実行するという方法がありましたが、公式テンプレートでもserverless-webpackを使う際の一連のセットアップなどが済んだテンプレートを提供しているようです。
使ってみる
テンプレートからプロジェクトを作成して、とりあえずデプロイしてみます。
プロジェクトの作成
まずは、serverlessのインストールから。
インストールしたバージョンは、現時点での最新版1.24.0
になります。
$ npm i -g serverless
createコマンドでテンプレートからプロジェクトを作成してみます。
$ sls create -t aws-nodejs-typescript -p sls-ts
作成したプロジェクトの内容を確認ると、次のファイルが作成されていました。
./sls-ts/ ├── handler.ts ├── package.json ├── serverless.yml ├── tsconfig.json └── webpack.config.js
aws-nodejs
のテンプレートで作成した際に作成される、ファイルに加え、package.json、tsconfig.json、webpack.config.jsが作成されるようです。
それぞれのファイルの内容を見ていきます。
package.json
プラグインであるserverless-webpack、webpackで使うTypeScriptのローダーなどがインストールされているようです。
{ "name": "aws-nodejs-typescript", "version": "1.0.0", "description": "Serverless webpack example using Typescript", "main": "handler.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { "serverless-webpack": "^3.0.0", "ts-loader": "^2.3.7", "typescript": "^2.5.2", "webpack": "^3.6.0" }, "author": "The serverless webpack authors (https://github.com/elastic-coders/serverless-webpack)", "license": "MIT" }
serverless.yml
plugins
にserverless-webpackが設定されています。
service: name: aws-nodejs-typescript # Add the serverless-webpack plugin plugins: - serverless-webpack provider: name: aws runtime: nodejs6.10 functions: hello: handler: handler.hello events: - http: method: get path: hello
webpack.config.js
entry
にslsw.lib.entriesが指定されていますが、これはserverless-webpack側でエントリポイントを自動で解決してくれているらしいです。(./handler.tsを指定したい気分ですが、どんな動きになっているかは後々調べてみよう...)
ts-loaderの設定もされた状態ですね。
const path = require('path'); const slsw = require('serverless-webpack'); module.exports = { entry: slsw.lib.entries, resolve: { extensions: [ '.js', '.jsx', '.json', '.ts', '.tsx' ] }, output: { libraryTarget: 'commonjs', path: path.join(__dirname, '.webpack'), filename: '[name].js', }, target: 'node', module: { loaders: [ { test: /\.ts(x?)$/, loader: 'ts-loader' }, ], }, };
その他のファイルに関しては、割愛します。
とりあえずデプロイしてみる
AWS CLIで必要なcredentが設定されている前提で、デプロイをしてみます。
$ sls deploy
デプロイ中のコンソールを眺めていると、まずwebpack(ts-loader)でTypeScriptが実行され、終わったタイミングでServerlessの実行結果が流れ始めるのがわかります。 ※ グローバルにTypeScriptがインストールされた環境で実行した場合は、そちらが使われるようです。
また、デプロイが完了後に.serverlessディレクトリ以下に生成されている.zipファイルの内容を確認してみると、JavaScriptにビルド済みのhandler.jsが確認できるかと思います。
作成されたAPI Gatewayのエンドポイントを叩いてみると...
動いてますね。
所感
webpackの設定なしに、気軽にTypeScriptが使えるようになってて最高です。