🚑

【AWS/Serverless Framework】Expressを用いて、スタブ環境を一瞬で作成する。

2021/09/25に公開1

環境

$ node -v
v15.2.0
$ aws --v
aws-cli/1.18.69 Python/3.8.5 Linux/5.4.72-microsoft-standard-WSL2 botocore/1.16.19
$ sls -v
Framework Core: 2.47.0
Plugin: 5.4.0
SDK: 4.2.3
Components: 3.12.0

GitHub リンク

コードは下記からクローンしてください。
https://github.com/Ken3-4649/lambdaStubPub

Serverless Framework 初めての方へ(参考資料)

Serverless Framework の基礎情報
Serverless Framework の使い方まとめ

serverless framework で AWS にデプロイするための awscli の初期設定

$ aws configure
AWS Access Key ID [None]: sample
AWS Secret Access Key [None]: sample
Default region name [None]: ap-northeast-1
Default output format [None]: json

node_modules のインストール

$ cd lambdaLayer/nodejs
$ npm i

serverless framework のデプロイ

※注 1

$ sls deploy

curl で API を呼び出す

GET の API

  • リクエストパラメータを付けた場合(string)
    正常に返却される。
$ curl -i -X GET https://xxx.amazonaws.com/dev/api/v1/books/?bookCode="sample"
HTTP/2 200
content-type: application/json; charset=utf-8
中略
{"data":{"bookFolderId":"111111","bookFolderName":"folderSample","bookCode":"sample","updateDate":"2021-06-25 11:06:27"}}
  • リクエストパラメータを付けた場合(integer)
    string 型に変換され、返却される。
$ curl -i -X GET https://xxx.amazonaws.com/dev/api/v1/books/?bookCode=1111111
HTTP/2 200
content-type: application/json; charset=utf-8
中略
{"data":{"bookFolderId":"111111","bookFolderName":"folderSample","bookCode":"1111111","updateDate":"2021-06-25 11:06:13"}}
  • リクエストパラメータを付けない場合
    エラーが返却される。
$ curl -i -X GET https://xxx.amazonaws.com/dev/api/v1/books/
HTTP/2 404
content-type: application/json; charset=utf-8
中略
{"errorCode":"E10202","errorMessage":"リクエストパラメータ不正:必須項目"}
  • 複数リクエストパラメータ使用時
    サンプル
$ curl -i -X GET https://xxx.amazonaws.com/dev/api/v1/code-master/?mainCode=sample\&secondaryCode=sample1\&codeValue=sample2

HTTP/2 200
content-type: application/json; charset=utf-8
中略
{"data":{"codeValue":"sample2","secondaryCode":"sample1","minorCode":"111","codeCategoryName":"test","codeName":"testname","detail1":"detail1","detail2":"detail2","detail3":"detail3"}}

参考文献

cURL コマンドで「クエリ文字列が在る URL」を扱うときは URL を囲もう

POST/PUT/DELETE の API

  • json をそのまま書いてリクエストパラメータを渡した場合
$ curl -i -X DELETE https://xxx.amazonaws.com/dev/api/v1/books -d '{"bookFolderId":"111111"}' -H "Content-Type: application/json"
HTTP/2 200
content-type: application/json; charset=utf-8
中略
{"data":{"bookFolderId":"111111"}}
  • json 位置を絶対パスで指定してリクエストパラメータを渡した場合
$ curl -i -X DELETE https://xxx.amazonaws.com/dev/api/v1/books -d @/絶対パス/sampleJsons/books/delete.json -H "Content-Type: application/json"
HTTP/2 200
content-type: application/json; charset=utf-8
中略
{"data":{"bookFolderId":"111111"}}
  • リクエストパラメータを渡さない場合
$ curl -i -X DELETE https://xxx.amazonaws.com/dev/api/v1/books -H "Content-Type: application/json"
HTTP/2 404
content-type: application/json; charset=utf-8
中略
{"errorCode":"E10202","errorMessage":"リクエストパラメータ不正:必須項目"}

Lambda 内で express を動かすために、@vendia/serverless-express を導入する

express の導入理由

  • すべてのエンドポイントを 1 つの Lambda へルーティングさせ、エンドポイントの管理を簡単にするため。
  • 1 つの Lambda で管理するため。

ライブラリ選定理由

同様のライブラリと比較しても、ダウンロード数や github のスター数が多いため。
aws-serverless-express vs serverless-http

参考文献

serverless-express で API Gateway から Lambda を実行する

注 1:特にコマンドを打つ必要はないが、serverless.yml を書く際の注意事項

node_modules を Lambda Layer に登録する際、layers の名前と service の名前が一致していると、公式ドキュメントの書き方では Lambda Layer に正しくデータが送信されない。正しくデータを送信するには公式ドキュメントのAWS - Layers:Using your layersにある下記の箇所を修正するか、もしくは layers の名前と service の名前を違う名前で記載する必要がある。今回は、layers の名前と service の名前を変更することで解決した。

layers:
  test:
    path: layer
functions:
  hello:
    handler: handler.hello
    layers:
      - { Ref: TestLambdaLayer }
layers:
  Test:
    path: layer
functions:
  hello:
    handler: handler.hello3
    layers:
      - { Ref: TestLambdaLayer }

上記の問題は Serverless Framework のフォーラムにも記載した。
https://forum.serverless.com/t/aws-lambda-layers-node-modules-not-working/7914/4
https://forum.serverless.com/t/lambda-layers-node-require-the-layer-code-sls-invoke-local/6673/20

おまけ:ローカルでの Lambda の開発に便利な Serverless-Dev-Tools を試す

serverless-Dev-Tools: ローカルで lambda の状況を観察するツール
インストールと試し方 (ローカル無理ならグローバル-g でインストール)

$ npm i -D sls-dev-tools
$ sls-dev-tools

参考文献

ローカルでの Lambda の開発に便利な Serverless-Dev-Tools を試す

Discussion