バックエンドにサーバーレスフレームワークを使用しています。リクエストの検証を実装するにはどうすればよいですか? (ラムダ関数内に検証を記述したくない)。
serverless
を使用してリクエストの検証を実装するには、いくつかのことを行う必要があります。スタックにモデル/ヘッダー定義を含め、APIゲートウェイにリクエストの検証にそれらを使用するように指示します。
次のパッケージをインストールする必要があります。
そして、それらをserverless.yml
に含める必要があります。
plugins:
- serverless-reqvalidator-plugin
- serverless-aws-documentation
注:以下は、パッケージを組み込む方法の簡単な概要です。より包括的な例については、パッケージのドキュメントページをご覧ください...
モデル/ヘッダーの説明をAPIゲートウェイに提供します。
モデルのjsonスキーマをインポートし、serverless-aws-documentation
プラグインを使用してhttpヘッダーを宣言できます。 serverless.yml
にモデルを追加する方法は次のとおりです:
custom:
documentation:
api:
info:
version: v0.0.0
title: Some API title
description: Some API description
models:
- name: SomeLambdaRequest
contentType: application/json
schema: ${file(models/SomeLambdaRequest.json)} # reference to your model's json schema file. You can also declare the model inline.
そして、ラムダ定義でモデルを参照する方法は次のとおりです。
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
documentation:
summary: some summary
description: some description
requestBody:
description: some description
requestModels:
application/json: SomeLambdaRequest
次のように、ラムダ定義に対してリクエストヘッダーを宣言することもできます。
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
documentation:
summary: some summary
description: some description
requestHeaders:
- name: x-some-header
description: some header value
required: true # true or false
- name: x-another-header
description: some header value
required: false # true or false
実際に検証にモデルを使用するようにAPIゲートウェイに指示する
この部分ではserverless-reqvalidator-plugin
パッケージを使用しており、AWS::ApiGateway::RequestValidator
リソースをserverless.yml
ファイルに追加する必要があります。リクエストの本文、リクエストヘッダー、またはその両方を検証するかどうかを指定できます。
resources:
Resources:
onlyBody:
Type: AWS::ApiGateway::RequestValidator
Properties:
Name: 'only-body'
RestApiId:
Ref: ApiGatewayRestApi
ValidateRequestBody: true # true or false
ValidateRequestParameters: false # true or false
そして、個々の関数で次のようにバリデーターを利用できます:
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
reqValidatorName: onlyBody # reference and use the 'only-body' request validator
すべてをまとめると、ラムダ定義は次のようになります。
functions:
someLambda:
handler: src/someLambda.handler
events:
- http:
# ... snip ...
reqValidatorName: onlyBody # reference and use the 'only-body' request validator
documentation:
summary: some summary
description: some description
requestBody:
description: some description
requestModels:
application/json: SomeLambdaRequest
requestHeaders:
- name: x-some-header
description: some header value
required: true # true or false
- name: x-another-header
description: some header value
required: false # true or false
これは現在、サーバーレスフレームワークでサポートされているため、外部プラグインを使用する必要はありません。
リクエストの検証を有効にするには、serverless.yml
に以下を追加する必要があります。
HttpHandler:
handler: src/lambda/http/create.handler
events:
- http:
method: post
path: items
request:
schema:
application/json: ${file(models/create-todo-model.json)}