はじめに
こんにちは。孔子の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は、サーバーレスアプリを作成するためによく使われる構成をデプロイおよび管理しやすくするためのフレームワークとなります。具体的な内容は以下のページをご参照ください。
それでは、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
それでは作成も完了したので、確認してみましょう。以下のように、予想通りに設定が完了しました!
それでは、リクエストボディも評価できるように設定してみましょう。前回のブログでボディの評価には「モデル」が必要との話がありましたね。このモデルを定義するためには以下の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で取り込んで開発を進めていますので、注意書きが出ます)デプロイが完了したら、確認してみましょう。
問題なくデプロイできてますね。モデルも確認してみると
となっていて、問題なくデプロイできてます。これで完了です!
最後に
サーバーレスアプリケーションを作るのは楽しいので、いろいろな構成と機能を使ってどんどん作ってみましょう!それでは、またいい勉強ができたら発信していきます。ありがとうございました!