Serverless + Node.js + TypeScript でAWS Lambdaを構築してみた

Yusuke Wakui
nextbeat-engineering
10 min readMay 18, 2022

こんにちは、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
  • slsserverlss コマンドの短縮形です。
  • 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 TopicsEventBridge のスケジュールをよく使うので、追加で実装しました。

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を用いています。フルスタックに開発したい!という方のご応募をお待ちしております。

--

--