serverless-offline と serverless-dynamodb を使ってローカルで API をテストする

Serverless Framework を使って API を開発する時に、逐一デプロイしてデバッグすると時間がかってしょうがないので、ローカルでテストする方法を試してみました。

前提として、今回は Amazon Cognito をオーサーライザーとして使用し、Amazon DynamoDB を使用した構成を想定しています。

◾️依存関係のインストール

以下を実行して下さい。

$ npm install serverless-offline serverless-dynamodb --save-dev

◾️設定ファイルを修正

serverless.yml に以下を追加します。

plugins:
  - serverless-dynamodb
  - serverless-offline // NOTE: 必ず「serverless-dynamodb」の後に読み込む

◾️ローカル環境の立ち上げ

$ sls offline --noAuth を実行すると、http://localhost:3000 にローカル環境が立ち上がります。
アクセスするには、http://localhost:3000/<APIのエンドポイント> にリクエストすると、レスポンスが返ってきます。

Postman 等でテストする時には、認証は無い方が便利なので、--noAuth オプションを追加しています。

自分の場合は、フロントエンドの開発環境とポート番号が被るので、package.json に以下のように追加しています。

  "scripts": {
    "start": "sls offline --httpPort 3001 --noAuth"
  }

◾️備考

DynamoDB をローカルで使うのに、有名なプラグインに serverless-dynamodb-local があるのですが、試してみると Error getting DynamoDb local latest tar.gz location: 403 というエラーが出ました。

以下の issue を見ると、修正はマージされたそうですが npm モジュールが 2年以上リリースされていないとの事で、代替策として serverless-dynamodb をお勧めされていたのでそちらを使用しました。

https://github.com/99x/serverless-dynamodb-local/issues/294

◾️追記

後日試してみた所、HTTP API (API ゲートウェイ v2) の書き方でないと、TypeError: Cannot read properties of undefined (reading 'dynamodb') のエラーが出ました。かなり時間を使ってしまったので、ご注意ください。

▽ HTTP API (API ゲートウェイ v2) と REST API (API ゲートウェイ v1)の違いについては以下をご参考ください。
https://www.serverless.com/framework/docs/providers/aws/events/http-api