4
2

More than 1 year has passed since last update.

NestJSをAPI Gateway + AWS Lambdaで構成する(その1)

Last updated at Posted at 2023-07-14

はじめに

  • いくつかの記事に分けて投稿していく予定です
  • NestJS + API Gateway で動かすことを目標にしていきます
  • NestJSの使い方等も調べていきます
  • 本題

別ページ

きっかけ

  • AWS Lambda Node.js をTypescriptで開発するのはよくある。TypescriptではなくNode.jsそのまま使う場合もある
  • AWS Lambdaを1つ1つのハンドラー(1つ1つのLambda function)だけでなく、共通コンポーネント 等が必要になる
  • 複数人でバックエンドを作成していくと、手元で 気軽にsls deploy したりして 知らぬ間にhandlerは指定されているけどコードが無いとか、Lambda Layerが変わったとか、CloudFormation 等が壊れるんじゃないか?
    • CICDに載せる前の段階で動作確認したい
    • GitHub等にpushしていない段階でクラウドに反映したい
    • GitHub等のfeatureブランチに対応した誰でも自由に使えるクラウドのENVが欲しい(クラウド側を壊しても作り直しですむようにしたい)
  • Fargateは使いたくない(常時利用料金がかかる)、サーバーレスLambdaとして動かすのは必須
  • NestJSはTypescriptでかつ、AWS Lambdaでも動かせるようなので、API Gateway で AWS LambdaとNestJSを動かすことを深く掘り下げていきたい

NestJS

  • https://nestjs.com/ , https://docs.nestjs.com/
  • Typescriptで作成できるWebフレームワーク
  • expressの後継のような存在
  • Webアプリケーションのバックエンド相当(Pythonでいうところの FastAPI, Flask,Chalice / JavaでのSpring )
  • MVC相当、DDD等の考え方を適用できる
  • トランザクションスクリプトで、Controller → Service → Dao(Repository)を扱いやすい。分けて考えやすい。
  • DIコンテナが備わっている
  • Webフレームワークの恩恵を受けられる

Serverless Framework

  • サーバーレスで開発する最もメジャーなツール(と思ってる)
  • 誇大かもしれないが、このツールを使わないでAppSyncやAPI Gatewayを開発しつつAWSクラウド側を手軽につくるには Amplify くらいしかない。CDKやTerraformもあるが開発者体験には疑問がある。
  • NestJS + API Gatewayの構成ができるみたいだ

懸念

  • 本来のLabmdaはFunctionモデル
  • 昨今 AWS Lambda Web Adapter は注目されている
  • ルーティングは本来のLambdaの役割とは少し違う
  • やってること → それLambdaでなくFargateで良いのでは? Fargateの方が負荷にも耐えられるだろうし、コールドスタート自体がないので処理スピードはメリットがある
  • Lambda functionごとの設定はできない
    • 使用メモリ、IAMロール
  • コールドスタート
    • この対応のために Lambdaを定期実行、Provisioned Concurrencyを使うのは、なんだかなー
    • 行き着くのはFargateで良いのでは?

サンプルを動かす

  • すんなり動きません
  • 別記事で記載していきます

参考

主観

  • 個人的には軽量な構成の方が好きです(昨今、大規模・大人数で開発することはないですし)
  • ずいぶん昔(かれこれ10年以上前)はWebフレームワーク、フルスタックフレームワークは良いと思いました
  • サーバーレスキャッシュで有名な momento の https://github.com/momentohq/serverless-tutorial はLambdaとDynamoDBの非常にわかりやすい
    • DynamoDB接続は src/clients/dynamodb.js
    • momento への接続は src/clients/momento.js
    • サービスclass は、src/accounts/service.js
    • DynamoDBのエンティティclassは、src/accounts/entities/エンティティ.js
    • ハンドラーのラップ、src/handlers/utils.js
    • この辺のソースから考えるトランザクションスクリプトやDDDを考えてみたいと思う

本題

Serverless FrameworkでのNestJSのサンプル

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2