API Gateway의 request validation을 serverless framework로 배포

Api Gateway request validation



api gateway에는 request validation이라는 검증 기능이 있습니다. 물론 api gateway에 붙이는 lambda등으로 요구의 검증을 하는 것도 가능합니다만, lambda에는 비즈니스 로직만을 포함하고 싶다고 하는 경우에는 편리한 기능입니다.

방법



공식 serverless framework에는 request validation 배포가 포함되어 있지 않으므로 serverless-reqvalidator-pluginserverless-aws-documentation를 결합하여 배포를 실현합니다.

최종 코드를 git에 업로드하고 있습니다.
htps : // 기주 b. 코 m / 후 ゔ ぇ 510 / 세 r ゔ ぇ r

a 이번에 사용한 플러그인
htps : // 기주 b. 이 m / da ゔ ぇ ry 헤로 / r r r r ぇ
htps //w w. 음 pmjs. 코 m / Pac 가게 / 세 r

이번은 기사의 등록을 하는 api를 소재로, author , contents , title 구현을 해 봅니다.

1. 문서화와 모델 만들기



serverless.yml에 다음과 같이 설명
service: serverless-blog-api 
plugins:
  - serverless-reqvalidator-plugin
  - serverless-aws-documentation

custom:
  documentation:
    api:
      info:
        version: '1.0.0'
        title: Aritcle API
        description: This is article API
      tags:
        -
          name: Article
          description: Article Management
    models:
      - name: articleModel
        contentType: "application/json"
        schema: ${file(model/article.json)}

model/article.json에 json schema 형식으로 ( htps : // j 그렇습니다. rg/ )로 모델을 기재

{
    "title": "articleModel",
    "type": "object",
    "properties": {
        "author": {
            "type": "string"
        },
        "contents": {
            "type": "string"
        },
        "title": {
            "type": "string"
        }
    },
    "required": ["author", "contents","title"]
}

2. serverless.yml의 Resource로 RequestValidator 만들기



이번에는 요청 본문 유효성 검사 만 활성화했습니다.
resources:
  Resources:
    # APIG
    ApiGatewayRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Name: article-api
    # APIG Request Validation
    onlyBody:  
      Type: "AWS::ApiGateway::RequestValidator"
      Properties:
        Name: 'only-body'
        RestApiId: 
          Ref: ApiGatewayRestApi
        ValidateRequestBody: true
        ValidateRequestParameters: false

3. function에 requestModels로서 RequestValidator를 붙인다



serverless.yml에 다음과 같이 설명
functions:
  postArticle:
    handler: handlers/article.put_article_handler
    name: postArticle
    memorySize: 1024
    timeout: 300
    events:
      - http:
          path: /article
          method: post
          integration: lambda-proxy
          reqValidatorName: 'onlyBody'
          cors:
            origin: '*'
            headers:
              - Content-Type
              - X-Amz-Date
              - Authorization
              - X-Api-Key
              - X-Amz-Security-Token
              - X-Amz-User-Agent
              - Pragma
              - Cache-Control
              - If-Modified-Since
            allowCredentials: true
          documentation:
            summary: "Post a article"
            description: "Post a article"
            requestModels:
              "application/json": "articleModel"

4. 해당 lambda handler를 작성


import json

def put_article_handler(event,context):
  article_info = json.loads(event['body'])
  author = article_info['author']
  contents = article_info['contents']
  title = article_info['title']
  return {
            "isBase64Encoded": True,
            "statusCode": 200,
            "headers": { 
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Credentials': 'true'
            },
            "body": json.dumps({'msg': 'ok'})
        }

5. 배포



친숙한 사람
sls deploy

유효성 검사가 유효한지 확인



api gateway > 리소스 > 테스트


body에 아무것도 포함하지 않고 테스트하면 오류가 반환되는 것을 확인할 수 있습니다.


테스트 어떻게 하는 문제



validation을 lambda 내부에서 가지고 있는 경우는 handler에 이상계의 파라미터를 넣고 있었지만, request validation을 사용하는 경우는 이상계의 테스트는 e2e test로 보충할 필요가 있을 것 같다. 그 경우는 로컬 개발 환경에서 테스트가 완결되지 않기 때문에 staging 환경 있음의 개발이 된다. 미묘.

좋은 웹페이지 즐겨찾기