API Gateway で基本的なリクエストの検証を設定する
このセクションでは、コンソール、AWS CLI、OpenAPI 定義を使用して API Gateway のリクエストの検証を設定する方法を示します。
トピック
API Gateway コンソールを使用してリクエストの検証を設定する
API Gateway コンソールで API リクエストの 3 つの検証から 1 つを選択して、リクエストを検証できます。
-
本体の検証。
-
クエリ文字列パラメータとヘッダーの検証。
-
本文、クエリ文字列パラメータ、ヘッダーの検証。
上記のいずれかの検証を API メソッドに適用すると、API Gateway コンソールは検証を API の RequestValidators マップに追加します。
このチュートリアルに従うには、AWS CloudFormation テンプレートを使用して不完全な API Gateway API を作成します。この API には、GET メソッドと POST メソッドを持つ /validator リソースがあります。どちらのメソッドも http://petstore-demo-endpoint.execute-api.com/petstore/pets HTTP エンドポイントと統合されています。次の 2 種類のリクエストの検証を設定します。
-
GETメソッドでは、URL クエリ文字列パラメータに対するリクエストの検証を設定します。 -
POSTメソッドでは、リクエスト本文に対するリクエストの検証を設定します。
これにより、特定の API コールのみを API にパススルーできます。
AWS CloudFormation のアプリケーション作成テンプレートをダウンロードして解凍します。このテンプレートを使用して不完全な API を作成します。残りのステップは API Gateway コンソールで完了します。
AWS CloudFormation スタックを作成するには
https://console.aws.amazon.com/cloudformation
で AWS CloudFormation コンソール を開きます。 -
[スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。
-
[Specify template (テンプレートの指定)] で、[Upload a template file (テンプレートファイルのアップロード)] を選択します。
-
ダウンロードしたテンプレートを選択します。
-
[Next (次へ)] を選択します。
-
[Stack name] (スタックの名前) で、
request-validation-tutorial-consoleと入力し、[Next] (次へ) を選択します。 -
[Configure stack options] (スタックオプションの設定) で、[Next] (次へ) を選択します。
-
[Capabilities] (機能) で、AWS CloudFormation がアカウントに IAM リソースを作成できることを承認します。
-
[Submit] を選択してください。
AWS CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。AWS CloudFormation スタックのステータスが CREATE_COMPLETE の場合は、次のステップに進む準備ができています。
新しく作成した API を選択するには
新しく作成した
request-validation-tutorial-consoleスタックを選択します。[リソース] をクリックします。
[物理 ID] で API を選択します。このリンクを使用して API Gateway コンソールに移動します。
GET メソッドと POST メソッドを変更する前に、モデルを作成する必要があります。
モデルを作成するには
-
受信リクエストの本文でリクエストの検証を使用するには、モデルが必要です。モデルを作成するには、メインナビゲーションペインで [モデル] を選択します。
-
[モデルの作成] を選択します。
-
[名前] に
PetStoreModelと入力してください。 -
[コンテンツタイプ] として、「
application/json」と入力します。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、「$default」と入力します。 -
[説明] に、モデルの説明として「
My PetStore Model」と入力します。 -
[モデルスキーマ] で、次のモデルをコードエディタに貼り付け、[作成] を選択します。
{ "type" : "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : { "type" : "integer" }, "type" : { "type" : "string", "enum" : [ "dog", "cat", "fish" ] }, "name" : { "type" : "string" }, "price" : { "type" : "number", "minimum" : 25.0, "maximum" : 500.0 } } }
これらのモデルの詳細については、「REST API のデータモデル」を参照してください。
GET メソッドのリクエスト検証を設定するには
-
メインナビゲーションペインで [リソース]、[GET] メソッドの順に選択します。
-
[メソッドリクエスト] タブの [メソッドリクエスト設定] で、[編集] を選択します。
-
[リクエストの検証] で、[クエリ文字列パラメータおよびヘッダーを検証] を選択します。
[URL クエリ文字列パラメータ] で、次の操作を行います。
[クエリ文字列の追加] を選択します。
[名前] に
petTypeと入力してください。[必須] をオンにします。
[キャッシュ] はオフのままにします。
-
[保存] を選択します。
-
[統合リクエスト] タブの [統合リクエストの設定] で、[編集] を選択します。
[URL クエリ文字列パラメータ] で、次の操作を行います。
[クエリ文字列の追加] を選択します。
[名前] に
petTypeと入力してください。[マッピング元] として「
method.request.querystring.petType」と入力します。これは、petTypeをペットの種類にマッピングします。データマッピングの詳細については、データマッピングチュートリアルを参照してください。
[キャッシュ] はオフのままにします。
[保存] を選択します。
GET メソッドのリクエスト検証をテストするには
-
[テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。
-
[クエリ文字列] に「
petType=dog」と入力し、[テスト] を選択します。 -
メソッドテストが
200 OKと犬のリストを返します。この出力データを変換する方法については、データマッピングチュートリアルを参照してください。
-
petType=dogを削除して [テスト] を選択します。 -
メソッドテストは、
400エラーを返し、次のエラーメッセージを表示します。{ "message": "Missing required request parameters: [petType]" }
POST メソッドのリクエスト検証を設定するには
-
メインナビゲーションペインで、[ステージ]、[POST] メソッドの順に選択します。
-
[メソッドリクエスト] タブの [メソッドリクエスト設定] で、[編集] を選択します。
-
[リクエストの検証] で [本文を検証] を選択します。
-
[リクエスト本文] で、[モデルを追加] を選択します。
-
[コンテンツタイプ] に、「
application/json」と入力します。一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、「$default」と入力します。[モデル] で、PetStoreModel を選択します。
[保存] を選択します。
POST メソッドのリクエスト検証をテストするには
-
[テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。
-
[リクエスト本文] で、次の内容をコードエディタに貼り付けます。
{ "id": 2, "name": "Bella", "type": "dog", "price": 400 }[テスト] を選択します。
-
メソッドテストは、
200 OKと成功メッセージを返します。 -
[リクエスト本文] で、次の内容をコードエディタに貼り付けます。
{ "id": 2, "name": "Bella", "type": "dog", "price": 4000 }[テスト] を選択します。
-
メソッドテストは、
400エラーを返し、次のエラーメッセージを表示します。{ "message": "Invalid request body" }テストログの一番下に、無効なリクエスト本文の理由が表示されます。この場合、ペットの価格はモデルに指定されている上限を超えていました。
AWS CloudFormation スタックを削除するには
AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation
) を開きます。 -
AWS CloudFormation スタックを選択します。
-
[Delete] (削除) を選択し、選択を確定します。
次のステップ
出力データを変換して、より多くのデータマッピングを実行する方法については、データマッピングチュートリアルを参照してください。
AWS CLI を使用して基本的なリクエストの検証を設定するチュートリアルに従い、AWS CLI を使用して同様の手順を実行します。
AWS CLI を使用して基本的なリクエストの検証を設定する
AWS CLI を使用してリクエストの検証を設定するための検証を作成できます。このチュートリアルに従うには、AWS CloudFormation テンプレートを使用して不完全な API Gateway API を作成します。
注記
これはコンソールチュートリアルと同じ AWS CloudFormation テンプレートではありません。
事前に公開されている /validator リソースを使用して GET メソッドと POST メソッドを作成します。どちらのメソッドも http://petstore-demo-endpoint.execute-api.com/petstore/pets HTTP エンドポイントと統合されます。次の 2 つのリクエストの検証を設定します。
-
GETメソッドでは、params-only検証を作成して URL クエリ文字列パラメータを検証します。 -
POSTメソッドでは、body-only検証を作成してリクエスト本文を検証します。
これにより、特定の API コールのみを API にパススルーできます。
AWS CloudFormation スタックを作成するには
AWS CloudFormation のアプリケーション作成テンプレートをダウンロードして解凍します。
次のチュートリアルを完了するには、AWS Command Line Interface (AWS CLI) バージョン 2 が必要です。
コマンドが長い場合は、エスケープ文字 (\) を使用してコマンドを複数行に分割します。
注記
Windows では、一般的に使用する Bash CLI コマンドの一部 (zip など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、Windows Subsystem for Linux をインストール
次のコマンドを使用して AWS CloudFormation スタックを作成します。
aws cloudformation create-stack --stack-name request-validation-tutorial-cli --template-body file://request-validation-tutorial-cli.zip --capabilities CAPABILITY_NAMED_IAM-
AWS CloudFormation は、テンプレートで指定されたリソースをプロビジョニングします。リソースのプロビジョニングには数分かかることがあります。次のコマンドを使用して AWS CloudFormation スタックのステータスを確認します。
aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli -
AWS CloudFormation スタックのステータスが
StackStatus: "CREATE_COMPLETE"になったら、次のコマンドを使用して関連する出力値を取得し、以後のステップで使用します。aws cloudformation describe-stacks --stack-name request-validation-tutorial-cli --query "Stacks[*].Outputs[*].{OutputKey: OutputKey, OutputValue: OutputValue, Description: Description}"出力値は以下のとおりです。
ApiId。API の ID です。このチュートリアルの場合、API ID は
abc123です。ResourceId。
GETメソッドとPOSTメソッドが公開されている検証リソースの ID です。このチュートリアルの場合、リソース ID はefg456です。
リクエストの検証を作成してモデルをインポートするには
-
AWS CLI でリクエストの検証を行うには、検証が必要です。リクエストパラメータのみを検証する検証を作成するには、次のコマンドを使用します。
aws apigateway create-request-validator --rest-api-idabc123\ --no-validate-request-body \ --validate-request-parameters \ --name params-onlyparams-only検証の ID をメモしておきます。 -
リクエスト本文のみを検証する検証を作成するには、次のコマンドを使用します。
aws apigateway create-request-validator --rest-api-idabc123\ --validate-request-body \ --no-validate-request-parameters \ --name body-onlybody-only検証の ID をメモしておきます。 -
受信リクエストの本文でリクエストの検証を行うには、モデルが必要です。モデルをインポートするには、以下のコマンドを使用します。
aws apigateway create-model --rest-api-idabc123--name PetStoreModel --description 'My PetStore Model' --content-type 'application/json' --schema '{"type": "object", "required" : [ "name", "price", "type" ], "properties" : { "id" : {"type" : "integer"},"type" : {"type" : "string", "enum" : [ "dog", "cat", "fish" ]},"name" : { "type" : "string"},"price" : {"type" : "number","minimum" : 25.0, "maximum" : 500.0}}}}'一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、キーとして
$defaultを指定します。
GET メソッドと POST メソッドを作成するには
-
次のコマンドを使用して、
GETHTTP メソッドを/validateリソースに追加します。このコマンドは、GETメソッドを作成して、params-only検証を追加し、必要に応じてクエリ文字列petTypeを設定します。aws apigateway put-method --rest-api-idabc123\ --resource-idefg456\ --http-method GET \ --authorization-type "NONE" \ --request-validator-idaaa111\ --request-parameters "method.request.querystring.petType=true"次のコマンドを使用し、
POSTHTTP メソッドを/validateリソースに追加します。このコマンドは、POSTメソッドを作成して、body-only検証を追加し、モデルを本文専用の検証にアタッチします。aws apigateway put-method --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --authorization-type "NONE" \ --request-validator-idbbb222\ --request-models 'application/json'=PetStoreModel -
次のコマンドを使用して、
GET /validateメソッドの200 OKレスポンスを設定します。aws apigateway put-method-response --rest-api-idabc123\ --resource-idefg456\ --http-method GET \ --status-code 200次のコマンドを使用して、
POST /validateメソッドの200 OKレスポンスを設定します。aws apigateway put-method-response --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --status-code 200 -
次のコマンドを使用して、
GET /validationメソッドの指定された HTTP エンドポイントをIntegrationに設定します。aws apigateway put-integration --rest-api-idabc123\ --resource-idefg456\ --http-method GET \ --type HTTP \ --integration-http-method GET \ --request-parameters '{"integration.request.querystring.type" : "method.request.querystring.petType"}' \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'次のコマンドを使用して、
POST /validationメソッドの指定された HTTP エンドポイントをIntegrationに設定します。aws apigateway put-integration --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --type HTTP \ --integration-http-method GET \ --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets' -
次のコマンドを使用して、
GET /validationメソッドの統合レスポンスを設定します。aws apigateway put-integration-response --rest-api-idabc123\ --resource-idefg456\ --http-method GET \ --status-code 200 \ --selection-pattern ""次のコマンドを使用して、
POST /validationメソッドの統合レスポンスを設定します。aws apigateway put-integration-response --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --status-code 200 \ --selection-pattern ""
API をテストするには
-
クエリ文字列に対するリクエストの検証を実行する
GETメソッドをテストするには、次のコマンドを使用します。aws apigateway test-invoke-method --rest-api-idabc123\ --resource-idefg456\ --http-method GET \ --path-with-query-string '/validate?petType=dog'結果として、
200 OKと犬のリストが返されます。 -
次のコマンドを使用して、クエリ文字列
petTypeを含めずにテストします。aws apigateway test-invoke-method --rest-api-idabc123\ --resource-idefg456\ --http-method GET結果として
400エラーが返されます。 -
リクエスト本文に対するリクエストの検証を実行する
POSTメソッドをテストするには、次のコマンドを使用します。aws apigateway test-invoke-method --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'結果として、
200 OKと成功メッセージが返されます。 -
次のコマンドを実行し、無効な本文を使用してテストします。
aws apigateway test-invoke-method --rest-api-idabc123\ --resource-idefg456\ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 1000 }'犬の価格がモデルで定義されている最大価格を超えているため、結果として
400エラーが返されます。
AWS CloudFormation スタックを削除するには
AWS CloudFormation リソースを削除するには、次のコマンドを使用します。
aws cloudformation delete-stack --stack-name request-validation-tutorial-cli
OpenAPI 定義を使用して基本的なリクエストの検証を設定する
API レベルでリクエストの検証を宣言するには、x-amazon-apigateway-request-validators オブジェクト マップ内の x-amazon-apigateway-request-validators.requestValidator オブジェクト オブジェクトのセットを指定して、リクエストのどの部分を検証するかを選択します。OpenAPI 定義の例では、次の 2 つの検証があります。
all検証では、本文 (RequestBodyModelデータモデルを使用) とパラメータの両方を検証します。RequestBodyModelデータモデルでは、入力 JSON オブジェクトにname、type、priceの各プロパティを含める必要があります。nameプロパティは任意の文字列にすることができ、typeは指定された列挙フィールド (["dog", "cat", "fish"]) のいずれかでなければなりません。また、priceは 25 から 500 の範囲にする必要があります。idパラメータは必須ではありません。param-only検証では、パラメータのみを検証します。
API のすべてのメソッドでリクエストの検証を有効にするには、OpenAPI 定義の API レベルで x-amazon-apigateway-request-validator プロパティ プロパティを指定します。OpenAPI 定義の例の場合、all 検証は、オーバーライドされない限り、すべての API メソッドで使用されます。モデルを使用して本文を検証する際、一致するコンテンツタイプが見つからない場合、リクエストの検証は実行されません。コンテンツタイプに関係なく同じモデルを使用するには、キーとして $default を指定します。
個々のメソッドでリクエストの検証を有効にするには、メソッドレベルで x-amazon-apigateway-request-validator プロパティを指定します。OpenAPI 定義の例の場合、param-only 検証は GET メソッドの all 検証を上書きします。
OpenAPI のサンプルを API Gateway にインポートするには、リージョン API を API Gateway にインポートする または エッジ最適化 API を API Gateway にインポートする に対する次の手順を参照してください。