APIGW リクエスト検証とは?実装する方法までわかりやすく解説!-その2

記事タイトルとURLをコピーする

はじめに

こんにちは。孔子の80代目子孫兼ディベロップメントサービス課の孔です。前回のブログではコンソール上でAPIGWリクエスト検証機能をつけるのかをみてみました。今回はServerless Frameworkを使って前回同様にリクエスト検証機能を付けてみます。

前回のブログはこちら

Serverless FrameworkでAPIGW リクエスト検証を実装する

※ 本記事は以下の環境で作成されました。 macOS Catalina 10.15.7 Framework Version: 2.18.0 serverless-aws-documentation: 1.1.0 serverless-reqvalidator-plugin: 1.0.4

Serverless構成に欠かせないこのAPIGWですので、やっぱりServerless Frameworkで記述できるようになると嬉しいですね。Serverless Frameworkは、サーバーレスアプリを作成するためによく使われる構成をデプロイおよび管理しやすくするためのフレームワークとなります。具体的な内容は以下のページをご参照ください。

www.serverless.com

それでは、APIGWのリクエスト検証機能をServerless Frameworkで実装してみましょう!

やってみる

APIGWに関するServerless Frameworkのドキュメントリンクはこちらのリンクになります。まずはrequest parametersで検索してみましょう。すると以下のサンプルが出てきます。

functions:
  create:  # 関数名
    handler: posts.create  # Lambda handler指定(posts関数のcreate function)
    events:  # Lambdaのトリガー
      - http:  # APIGWへのリクエストがトリガーになる
          path: posts/create
          method: post
          request:
            parameters:
              querystrings:
                url: true
              headers:
                foo: false

functions.create.events.httpの中身をみていただくと、おそらくお気づきになられたのではないでしょうか。pathに指定されたAPIにpostする際のリクエストは、クエリストリングはurlが絶対必要、ヘッダーはfooが必要ではないけど設定、という記述になります。このままデプロイしてみましょう。デプロイした際のserverless.ymlは以下にになります。(その他のリソースはslsコマンドで初作成されたものをそのまま使用)

service: req-test

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  region: ap-northeast-1

functions:
  create:
    handler: handler.hello
    events:
      - http:
          path: posts/create
          method: post
          request:
            parameters:
              querystrings:
                url: true
              headers:
                foo: false

作成するにはsls deployコマンドをserverless.ymlがあるフォルダー内で実行します。

$ sls deploy
(省略)
Serverless: Stack update finished...
Service Information
service: req-test
stage: dev
region: ap-northeast-1
stack: req-test-dev
resources: 12
api keys:
  None
endpoints:
  POST - https://y7kmbn32l8.execute-api.ap-northeast-1.amazonaws.com/dev/posts/create
functions:
  create: req-test-dev-create
layers:
  None

それでは作成も完了したので、確認してみましょう。以下のように、予想通りに設定が完了しました!

f:id:swx-kong:20210313072824p:plain

それでは、リクエストボディも評価できるように設定してみましょう。前回のブログでボディの評価には「モデル」が必要との話がありましたね。このモデルを定義するためには以下のServerless Frameworkのプラグインが必要となります。

  • serverless-reqvalidator-plugin
  • serverless-aws-documentation

それでは、プラグインを追加してモデルを定義してみましょう。以下のような記述になります。

service: req-test

frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  region: ap-northeast-1

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

custom:
  documentation:
    models:
      - name: sampleModel
        contentType: "application/json"
        schema:
          required: 
            - id
          type: object
          properties:
            id:
              type: string

functions:
  create:
    handler: posts.create
    events:
      - http:
          path: posts/create
          method: post
          documentation:
            requestModels:
              "application/json": sampleModel  # valueはcustom.documentation.models.nameと一致。ここで定義したモデルを使用。
          reqValidatorName: 'reqValidatorTest'  # resourcesで定義

resources:
  Resources:
    ApiGatewayRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Name: sample-api
    reqValidatorTest:
      Type: AWS::ApiGateway::RequestValidator
      Properties:
        Name: 'req-validator-test'
        RestApiId:
          Ref: ApiGatewayRestApi
        ValidateRequestBody: true  # bodyをチェック
        ValidateRequestParameters: false  # paramはチェックしない

それではデプロイです。

$ sls deploy
Serverless: Configuration warning at 'functions.create.events.0.http': unrecognized property 'documentation'
(中略)
Serverless: Checking Stack update progress...
........................
Serverless: Stack update finished...

いくつか注意が出ますが、スルーして問題ないです(Serverless Frameworkではfunctions.funcname.event.http.documentationを2.5.0以降サポートしてなく、serverless-aws-documentationで取り込んで開発を進めていますので、注意書きが出ます)デプロイが完了したら、確認してみましょう。

f:id:swx-kong:20210313141542p:plain

問題なくデプロイできてますね。モデルも確認してみると

f:id:swx-kong:20210313141629p:plain

となっていて、問題なくデプロイできてます。これで完了です!

最後に

サーバーレスアプリケーションを作るのは楽しいので、いろいろな構成と機能を使ってどんどん作ってみましょう!それでは、またいい勉強ができたら発信していきます。ありがとうございました!