serverless frameworkでLambdaにExpressをデプロイ

serverless frameworkというツールを使えば、LambdaにExpress(Node.js)のコードを簡単にデプロイできるよ!

・・という記事を書きます。

 

成果物がこちら👇

penpendayo/aws-node-express-api-project

Lamdaのデメリット

AWSのLambdaはめちゃくちゃ安いです。

100万リクエストまで無料な上に、通常時の価格も激安。

 

ですが、以下のようなデメリットがあります。

  • 書き方がややこしい
  • Gitで管理もできないので保守性が悪い

 

後述しているツールを使えば、これらのデメリットなしにLambdaを使えます。

serverless-express とは?

AWS Lambda上で、Expressを動かせるようにできるnpmパッケージです。

 

Express以外のフレームワークも動かせたり、AWS以外にもAzureのAzure Functionなどでも動かせたりするらしいです。

詳しい説明はGitHubを見て下さい。

vendia/serverless-express: Run Node.js web applications and APIs using existing application frameworks on AWS #serverless technologies such as Lambda, API Gateway, Lambda@Edge, and ALB.

serverless framework とは?

ローカルにあるコードをnpx serverless deployを実行するだけで、

  1. AWS Lambda関数を作って、
  2. ローカルのファイルを全部zipに圧縮して、
  3. zipをLambda関数にアップロードする

などを一気にバババーーーって実行できちゃうツール。

参考:Serverless Framework – Wikipedia

 

serverless-expressだけでも、LambdaにExpressをデプロイすることはできますが

以下の記事の内容などをぽちぽち手動で行う必要があります🤔

【10分AWSハンズオン】ExpressをAWS Lambda+API Gatewayにデプロイする – Qiita

 

このような手動作業を、serverless frameworkを使うことで簡略化できる!という感じです😀

使い方

インストール

npx serverlessを実行して「AWS – Node.js – Express API」を選択します。

▲ほかにもプロジェクトの名前とかいろいろ聞かれるので、テキトーに入力します。

 

これだけで、もう雛形が完成します!👇

▲serverless frameworkではデフォルトで「serverless-http」というパッケージを使っていますが、これは「serverless-express」と同じような機能をもったパッケージです。「serverless-express」と置き換え可能です。

デプロイ

たとえばプロジェクト名を「hoge」にしたとすると

  1. cd hogeして移動
  2. npx serverless deployを実行

とやるだけで、Lambda(+API Gateway)にデプロイできます!🎉

ただし、デプロイの前にaws cliをインストールしてaws configureしてアクセスキーやシークレットアクセスキーを設定しておく必要があります。

▲デプロイ後。

 

以下のようにAPI エンドポイントのURLを開くと、Expressでルーティングした値が出力されます。

 

デプロイしたリソースの削除

デプロイしたコードをAWSから全部削除したい場合、

npx serverless removeで、きれいさっぱり全削除できます🗑️

デプロイされるリソース

デプロイされるのはLambdaだけではなく、以下も同時にデプロイされるようです。

  • S3
  • CloudFormation
  • Cloudwatch
  • IAM(ポリシー)

 

特に、Cloudwatchは10個を超えると課金対象ですし、S3も有料(少額ですが)なので注意です。

ちなみに設定によってはDynamoDBとかも自動で作れたりするらしいです。

いろいろな設定

基本的にserverless.ymlというファイルを変更するだけです。

TypeScript化

以下の記事をそのまま真似するだけでTypeScript化できます。しかもesbuildなのでトランスパイルも高速です。

TypeScript on esbuildに対応しよう|Serverless Frameworkで運用可能なサービスを構築する本

 

ただ、👆記事の筆者の方も言われていますが、esbuildは型チェックがされないので、以下のような感じでデプロイ前に必ず型チェックする・・・みたいにしたほうが良いと思います。

"scripts": {
  ...
   "type-check": "tsc --noEmit",
   "deploy": "npm run type-check && serverless deploy",
  ...
 },

Lamda関数URLを使う

Lambda自体は激安ですが、API Gatewayは100万アクセスあたり1ドルとかかかります(REST APIではなくHTTP APIの場合)。

ですが、1年くらい前に追加されたLambdaの関数URL機能を使えば、この料金も無料にできます。

特に認証などを必要としない、シンプルな処理の場合はこちらを使ったほうが良いと思います。

使い方は以下のようにurl: trueと書くだけです。

functions:
  hello:
    handler: handler.hello
    url: true

参考:新機能AWS Lambda Function URLsをServerlessFrameworkで対応😎メリットデメリットも語ります🚀 | Ragate ブログ

▲API Gatewayの代わりに関数URLが追加される

まとめ

ほかにもいろいろ便利な設定ができるみたいなのですが、とりあえず今回は以上です!

AWS
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました