Serverless(2) Advent Calendar 2016の記事です。
投稿がギリギリになってしまいました。
私の現在携わっているプロジェクトではServerless+TypeScriptでアプリケーションを実装しています。
今のプロジェクトではまだserverless v0.5系なのですが、そろそろv1に移行したいと思っているので
serverless v1系とTypeScriptの組み合わせの開発環境を作って検証してみたいと思います。
環境
- serverless 1.3.0
- TypeScript 2.1.4
手順
Serverlessでサービスを作成
serverless create --template aws-nodejs --name sls-ts-sample
TypeScriptの構成ファイルtsconfig.jsonを作ります。
tsc --init
型定義ファイルの導入
TypeScriptの型定義ファイル(d.ts)を読み込みます。
念のための補足ですが、TypeScript 2.0以降はtypingsを使う必要はなくなり
npmだけで型定義ファイルの管理ができるようになっています。 (⇒参考: 型定義ファイルのインストール方法(TypeScript 2.0版) )
今回、aws-lambdaという型定義ファイルが用意されているのでそれを使用します。
npm i @types/aws-lambda
テンプレートから作成されたJavaScriptのハンドラーに相当するTypeScript用のhandler.tsというファイルをプロジェクト直下に作成します。
先ほどインストールしたaws-lambda
という型定義ファイルをimportして、仮引数contextとcallbackの型を指定します。
import * as lambda from 'aws-lambda';
export const hello = (event: any, context: lambda.Context, callback: lambda.Callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
}),
};
callback(null, response);
};
eventパラメータに対する型は提供されていないのでanyとしています。
プロジェクトフォルダ内でtsc
コマンドを実行すればhandler.jsがコンパイルされるます。
これで普通にデプロイコマンドを叩けば正常にデプロイされると思います。
sls deploy
--strictNullChecksを試す
また、最近null安全が話題のようですが、TyepScript 2.0以上だとNon-nullable typesの指定ができます。
tsconfig.jsonに"strictNullChecks": true,
を1行追加してコンパイルしてみます。
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"strictNullChecks": true,
"noImplicitAny": false,
"sourceMap": false
}
}
$ tsc
handler.ts(12,12): error TS2345: Argument of type 'null' is not assignable to parameter of type 'Error | undefined'.
残念ながらまだ型定義のstrictNullChecks対応がまたのようです。
あまり気持ちよくは無いですがcallbackの引数のnull⇒undefinedにすればコンパイルが通るようになります。
// 修正前
callback(null, response);
// 修正後
callback(undefined, response);
最後に
本格的に開発するならwebpackなどの設定も行った方がいいと思いますが
特に難しい設定はなくてもTypeScriptでの開発ができることが分かりました。
lambdaはまだNode 4.3のランタイムまでしかサポートされていないため
その為es5をターゲットにしていると一部対応していない文法があります。
早くNode 6も対応してくれるとありがたいなと思います。
2017/04/01 追記
AWS LambdaでNode.js 6.10がサポートされたようです。
参考:https://aws.amazon.com/jp/about-aws/whats-new/2017/03/aws-lambda-supports-node-js-6-10/