Serverless + Node.js + TypeScript でAWS Lambdaを構築してみた
こんにちは、Nextbeatで 育てるを考える 子育て情報メディア KIDSNA STYLE のテックリードをしている涌井です。
今回は、 Serverless Framework の TypeScript Node.js のテンプレートを使って AWS Lambdaを構築してみたいと思います。
構築するLambdaは以下の3つのトリガーで起動するLambdaです。
- APIGateway
- SNS Topic
- EventBridge
Serverless Framework とは
Node.jsで記述された AWS Lambdaなどのサーバレスコンピューティングプラットフォームを構築するフレームワークです。
デプロイコマンドを実行するだけで、Serverless が Croud Formation のスタックを作成し、Lambdaや各種トリガーをAWS環境に構築してくれます。
Nodeだけでなく python , Java , Go など様々な言語をサポートしています。
またプラットフォームも Google Cloud Platform や Azure などに対応しています。
Serverless 使ってみた
前提として、AWS Credentials の設定と Node.js のインストールが必要です。
まずは以下のコマンドで Serverless をインストールします。
npm install -g serverless
create コマンドでプロジェクトを作成します。
serverless create — template aws-nodejs-typescript — path serverless-node-ts-sample
— template aws-nodejs-typescript
この引数でプロジェクトのテンプレートを指定します。今回は AWS + Node.js + TypeScript のため aws-nodejs-typescript を指定しています。
— path serverless-node-ts-sample
この引数でプロジェクトのルートディレクトリ名を指定します。未指定の場合はカレントディレクトリ直下に作成されます。
次に npm install コマンドを実行して、モジュールをインストールします。
早速実行してみましょう。
ローカル実行
Serverlessにはローカル実行する機能があるので、サンプルで実装されている Lambda を実行してみます。
サンプル実装されている hello は APIGatewayをトリガーにしたLambdaです。
sls invoke local -f hello -p ./src/functions/hello/mock.json
- sls は serverlss コマンドの短縮形です。
- sls invoke local でローカル実行します。
- -f hello で実行する Lambda を指定します。
- -p ./src/functions/hello/mock.json でインプットファイルを指定します。APIGatewayのトリガーのためリクエストボディを設定したファイルです。
実行結果はこちらです。レスポンスボディに相当します。
{"statusCode": 200,"body": "{\"message\":\"Hello Frederic, welcome to the exciting Serverless world!\",\"event\":{\"headers\":{\"Content-Type\":\"application/json\"},\"body\":{\"name\":\"Frederic\"},\"rawBody\":\"{\\\"name\\\": \\\"Frederic\\\"}\"}}"}
デプロイ
AWSへのデプロイは以下のコマンドで実行します。実行前にAWS Credencials の設定をしておいて下さい。
sls deploy — region us-east-1
> ✔ Service deployed to stack serverless-node-ts-sample-dev (129s)> endpoint: POST — https://XXXXXXXX.execute-api.us-east-1.amazonaws.com/dev/hello> functions:> hello: serverless-node-ts-sample-dev-hello (14 kB)> Monitor all your API routes with Serverless Console: run “serverless — console”
— region us-east-1 でデプロイするリージョンを指定します。今回は us-east-1 にデプロイします。
これでAWSへのデプロイが完了しました。
curlでリクエストしてみましょう。endpoint に表示されているURLにリクエストします。
curl -X POST -H "Content-Type: application/json" -d '{"name":"Wakui"}' https://XXXXXXXX.execute-api.us-east-1.amazonaws.com/dev/hello> {“message”:”Hello Wakui, welcome to the exciting Serverless world!”,”event”:…(省略)}
実際にはローカル実行に比べて大量の情報が event に表示されますが、これは Lambda イベント情報のため今回は省略しています。
AWS
実際にAWSの環境を確認してみましょう。
Lambdaが作成され、APIGatewayをトリガーに設定されています。
APIGatewayも作成されています。
CloudWatchの設定もされていて、先程のリクエストした結果のログがあります。
環境を削除したい場合は以下のコマンドを実行します。
sls remove
プロジェクトの中身を見てみる
作成されたプロジェクトを見てみましょう。
フォルダ構成はこの様になっています。
├── src│ ├── functions│ │ ├── hello│ │ │ ├── handler.ts│ │ │ ├── index.ts│ │ │ ├── mock.json│ │ │ └── schema.ts│ │ ││ │ └── index.ts│ └── libs│ └── apiGateway.ts│ └── handlerResolver.ts│ └── lambda.ts├── package.json├── serverless.ts├── tsconfig.json└── tsconfig.paths.json
重要なファイルについて解説します。
serverless.ts
Serverlessの設定ファイルです。こちらの設定に従って AWS を構築します。
注意点として他のテンプレートでは serverlss.yml という YAML で設定します。
ネットの情報もほとんど YAML の記述のため、適宜 javascrpit に読み替えて設定する必要があります。(これが結構めんどくさいです。)
この設定ファイルでは主にLambdaの全般的な設定をしています。
region: 'us-east-1',
provider.region でデプロイするリージョンを設定します。今回は us-east-1 にデプロイするため追記しました。
functions: { hello },
functions で構築するLambda関数の個別設定をします。hello という Lambda を設定しています。
次に hello でインポートされたファイルを見てみましょう。
src/functions/hello/index.ts
ここではLambda関数の個別設定をしています。
handler で Lambdaで実行する関数を設定します。
events でトリガーの設定をします。ここでは APIGatewayの設定が記載されています。
- http.medhod : POST メソッド
- http.path : URLのパス
- request.schemas : リクエストのスキーマ
次に hello Lambdaの handler を見てみましょう。
/src/functions/hello/handler.ts
単純なレスポンスを返すLambdaです。
引数の event で Lambdaの情報やリクエストパラメータが渡されます。event.body でリクエストボディを受け取れます。
middyfy については今回解説はしませんが、Lambdaの前後処理を実装できるものです。(ExpressのMiddlewareみたいな感じです。)ここでは設定をしているだけで、前後処理はなにもしていません。
SNS Topics と EventBridgeの実装
弊社では SNS Topics と EventBridge のスケジュールをよく使うので、追加で実装しました。
SNS Topics
SNS Topics をトリガーにしたサンプルです。
/src/functions/sns-hello/index.ts
sns にTopic名を設定するだけです。
/src/functions/sns-hello/handler.ts
event.Records[0].Sns.Message
これで SNS Topics の Message を受け取れます。
EventBridge Schedule
EventBridge のスケジュールイベントをトリガーにしたサンプルです。
/src/functions/schedule-hello/index.ts
eventBridge.schedule に cron の設定をするだけです。
/src/functions/schedule-hello/handler.ts
あとがき
ここまで読んでいただきありがとうございました!
今回は Serverless + Node.js + TypeScript でAWS Lambdaを構築してみました。面倒な設定不要で簡単にLambdaを構築できるので、是非使ってみて下さい。
作成したサンプルは https://github.com/wakusan61/serverless-node-ts-sample で公開していますので、参考にして下さい。
We are Hiring!
「人口減少社会において必要とされるインターネット事業を創造し、ニッポンを元気にする。」
を理念に掲げ一緒に働く仲間を募集しております。
バックエンドにはPlay Framework(言語はScala)、フロントエンドの開発には主にAngularを用いています。フルスタックに開発したい!という方のご応募をお待ちしております。