はじめに
最近はAWSLambdaをデプロイするにあたって、ServerlessFrameworkやAWS SAMを利用することが多いと思います。
簡単なソースコードならコンソール画面からインラインで実装すればいいですが(Cloud9で書けるようになったので、かなり書きやすくなりましたね)、複数のLambdaを管理する必要がある場合は、フレームワーク等を利用することで管理コストを削減できます。個々のLambdaをZipに固めてアップロードするわけにもいきませんからね…
そんなときにJavaScriptで書いているソースコードをTypeScriptで書けたらいいのになーとか思っていると、「ServerlessFrameworkにもTypeScriptのプラグインありますよ」という情報を手に入れたので、本格導入する前に個人で試してみました。
ServerlessFrameworkのインストール
下記コマンドでインストールします
$ npm i -g serverless
プロジェクトの作成
TypeScriptで書いたソースコードでデプロイするためには、もちろんですがTypeScriptをJavaScriptにコンパイルしなければなりません。
そのために serverless-webpack
というプラグインをインストールする必要があります。
本来であれば上記のプラグインをインストールしてWebpackの設定をしてなどしなくてはいけないのですが、ServerlessFrameworkがテンプレートを用意してくれています。
$ sls create -t aws-nodejs-typescript -p serverless-typescript
serverless-typescript
というディレクトリにプロジェクトが用意されています。ディレクトリに移動してパッケージをインストールします。
$ cd serverless-typescript
$ npm i
内容の確認
デフォルトではAPIGateway経由でレスポンスを返すようになっています。
import { APIGatewayEvent, Callback, Context, Handler } from 'aws-lambda';
export const hello: Handler = (event: APIGatewayEvent, context: Context, cb: Callback) => {
const response = {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
input: event,
}),
};
cb(null, response);
};
service:
name: serverless-typescript
# Add the serverless-webpack plugin
plugins:
- serverless-webpack
provider:
name: aws
runtime: nodejs8.10
functions:
hello:
handler: index.hello
events:
- http:
method: get
path: hello
aws-lambda
というパッケージの中に、Lambdaが受け取るEventの型宣言が書いてあります。
なので event
の型宣言をLambdaのトリガーごとに書き換える必要があります。
デプロイ
デプロイするのは普段どおりです
$ sls deploy
(省略)
Service Information
service: serverless-typescript
stage: dev
region: us-east-1
stack: serverless-typescript-dev
api keys:
None
endpoints:
GET - https://xxxxxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/hello
functions:
hello: serverless-typescript-dev-hello
確認する
デプロイ時に確認できるAPIGatewayのエンドポイントにブラウザからアクセスすると、メッセージとAPIGatewayからLambdaに渡されている event
の中身がJSON文字列として表示されます。
さいごに
こうして、AWSLambdaのNode.jsをTypeScriptで書くことができるようになりました。
やっぱりTypeScriptで書くことができるのっていいですねー(適当)
これから本格的に導入していこうと思います。これでLambdaライフがより一層快適なものになりますね!
ではまた!