web-dev-qa-db-ja.com

サーバーレスフレームワークを使用した検証のリクエスト

バックエンドにサーバーレスフレームワークを使用しています。リクエストの検証を実装するにはどうすればよいですか? (ラムダ関数内に検証を記述したくない)。

13
Annie Alan

serverlessを使用してリクエストの検証を実装するには、いくつかのことを行う必要があります。スタックにモデル/ヘッダー定義を含め、APIゲートウェイにリクエストの検証にそれらを使用するように指示します。

次のパッケージをインストールする必要があります。

そして、それらをserverless.ymlに含める必要があります。

plugins:
  - serverless-reqvalidator-plugin
  - serverless-aws-documentation

注:以下は、パッケージを組み込む方法の簡単な概要です。より包括的な例については、パッケージのドキュメントページをご覧ください...

  1. モデル/ヘッダーの説明を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
    
  2. 実際に検証にモデルを使用するように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
23
Nicholas Sizer

これは現在、サーバーレスフレームワークでサポートされているため、外部プラグインを使用する必要はありません。

リクエストの検証を有効にするには、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)}
12
Ivan Mushketyk