はじめに
みなさんは型必要派でしょうか?不要派でしょうか?色々な意見があると思いますがぼくは必要派です。
Lambdaを作成するときにnodeを選択することが多いのですが、JavaScriptには静的型付けがなくてやりづらい思いをしています。
そこで、TypeScriptとServerlessを使ってLambdaを作成する方法を説明していきます。
リポジトリ
この記事の最終的なプロジェクトはGitHubにあります。
いいからコード見せろ派の方はこちらも合わせてどうぞ!
準備
Serverlessのインストール
$ npm install serverless -g
Serverlessのバージョンが表示されればOKです。
$ sls -v
1.1.0
- 注:
sls
はserverless
のショートカットです。
手順
Lambda Functionを作る
適当にlambda-with-typescriptなどと
$ sls create --t aws-nodejs --path lambda-with-typescript
- my-service
- event.json : テスト実行する際に使用するイベント(パラメタ)値のファイルです。
- handler.js : 関数の本体です。※後ほど".ts"へ変更します。
- serverless.yml : 設定ファイルです。
依存関連を追加
TypeScriptとwebpack関連のパッケージを追加します。
$ npm i --save-dev typescript webpack ts-loader serverless-webpack
node_modules内に
TypeScriptの設定
TypeScriptのコンパイラオプションを設定します。
とりあえず動かすだけなのでtscコマンドで生成するかtsconfig.jsonを作成してください。
tsc --init
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"noImplicitAny": false,
"sourceMap": false
}
}
ハンドラを修正
コードをTypeScriptで書くためhandler.jsをhandler.tsにリネームします。
ハンドラのコードは適当なTypeScriptコードを書いておきます。
export function hello(event, context, callback) {
callback(null, {
message: 'Hello from TypeScript!'
});
};
Webpackを設定を追加する
TypeScriptをトランスパイルさせるためwebpack.config.jsを修正します。
var path = require('path');
module.exports = {
entry: './handler.ts',
target: 'node',
module: {
loaders: [
{ test: /\.ts(x?)$/, loader: 'ts-loader' }
]
},
resolve: {
extensions: ['.ts', '.js', '']
},
output: {
libraryTarget: 'commonjs',
path: path.join(__dirname, '.webpack'),
filename: 'handler.js'
},
};
Serverlessのコンフィグを修正
serverless-webpackプラグインを使えるように末尾にpluginsを追加します。
~~~ 略 ~~~
plugins:
- serverless-webpack
実行
ローカル実行
ターミナルで下記のコマンドを実行します。
$ sls webpack invoke -f hello -p event.json
先ほど作成したHello from TypeScript!
が帰ってきていますね。
Serverless: Bundling with Webpack...
ts-loader: Using typescript@2.0.6 and /Users//Projects/lambda-with-typescript/tsconfig.json
Time: 785ms
Asset Size Chunks Chunk Names
handler.js 1.61 kB 0 [emitted] main
Serverless: Run function hello...
{ message: 'Hello from TypeScript!' }
おわりに
TypeScriptでLambda関数を作成できましたがいかがだったでしょうか。
しかし、この例ではeventなどがanyなのでまだ型の恩恵を受けられていません。次回はこのあたりを改善したいと思います。