🚑
【AWS/Serverless Framework】Expressを用いて、スタブ環境を一瞬で作成する。
環境
$ 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 リンク
コードは下記からクローンしてください。
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 のフォーラムにも記載した。
おまけ:ローカルでの Lambda の開発に便利な Serverless-Dev-Tools を試す
serverless-Dev-Tools: ローカルで lambda の状況を観察するツール
インストールと試し方 (ローカル無理ならグローバル-g でインストール)
$ npm i -D sls-dev-tools
$ sls-dev-tools
Discussion
AWSのスタブは今は、下記のツールが最強です。