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 リソースを作成できることを承認します。
-
[送信] を選択します。
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
と入力します。[必須] をオンにします。
[キャッシュ] はオフのままにします。
-
[Save] を選択します。
-
[統合リクエスト] タブの [統合リクエストの設定] で、[編集] を選択します。
[URL クエリ文字列パラメータ] で、次の操作を行います。
[クエリ文字列の追加] を選択します。
[名前] に
petType
と入力します。[マッピング元] として「
method.request.querystring.petType
」と入力します。これは、petType
をペットの種類にマッピングします。データマッピングの詳細については、データマッピングチュートリアルを参照してください。
[キャッシュ] はオフのままにします。
[Save] を選択します。
GET
メソッドのリクエスト検証をテストするには
-
[テスト] タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。
-
[クエリ文字列] に「
petType=dog
」と入力し、[テスト] を選択します。 -
メソッドテストが
200 OK
と犬のリストを返します。この出力データを変換する方法については、データマッピングチュートリアルを参照してください。
-
petType=dog
を削除して [テスト] を選択します。 -
メソッドテストは、
400
エラーを返し、次のエラーメッセージを表示します。{ "message": "Missing required request parameters: [petType]" }
POST
メソッドのリクエスト検証を設定するには
-
メインナビゲーションペインで、[ステージ]、[POST] メソッドの順に選択します。
-
[メソッドリクエスト] タブの [メソッドリクエスト設定] で、[編集] を選択します。
-
[リクエストの検証] で [本文を検証] を選択します。
-
[リクエスト本文] で、[モデルを追加] を選択します。
-
[コンテンツタイプ] に「
application/json
」と入力し、[モデル] で [PetStoreModel] を選択します。 [Save] を選択します。
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-id
abc123
\ --no-validate-request-body \ --validate-request-parameters \ --name params-onlyparams-only
検証の ID をメモしておきます。 -
リクエスト本文のみを検証する検証を作成するには、次のコマンドを使用します。
aws apigateway create-request-validator --rest-api-id
abc123
\ --validate-request-body \ --no-validate-request-parameters \ --name body-onlybody-only
検証の ID をメモしておきます。 -
受信リクエストの本文でリクエストの検証を行うには、モデルが必要です。モデルをインポートするには、以下のコマンドを使用します。
aws apigateway create-model --rest-api-id
abc123
--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
メソッドを作成するには
-
次のコマンドを使用して、
GET
HTTP メソッドを/validate
リソースに追加します。このコマンドは、GET
メソッドを作成して、params-only
検証を追加し、必要に応じてクエリ文字列petType
を設定します。aws apigateway put-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET \ --authorization-type "NONE" \ --request-validator-idaaa111
\ --request-parameters "method.request.querystring.petType=true"次のコマンドを使用し、
POST
HTTP メソッドを/validate
リソースに追加します。このコマンドは、POST
メソッドを作成して、body-only
検証を追加し、モデルを本文専用の検証にアタッチします。aws apigateway put-method --rest-api-id
abc123
\ --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-id
abc123
\ --resource-idefg456
\ --http-method GET \ --status-code 200次のコマンドを使用して、
POST /validate
メソッドの200 OK
レスポンスを設定します。aws apigateway put-method-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --status-code 200 -
次のコマンドを使用して、
GET /validation
メソッドの指定された HTTP エンドポイントをIntegration
に設定します。aws apigateway put-integration --rest-api-id
abc123
\ --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-id
abc123
\ --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-id
abc123
\ --resource-idefg456
\ --http-method GET \ --status-code 200 \ --selection-pattern ""次のコマンドを使用して、
POST /validation
メソッドの統合レスポンスを設定します。aws apigateway put-integration-response --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --status-code 200 \ --selection-pattern ""
API をテストするには
-
クエリ文字列に対するリクエストの検証を実行する
GET
メソッドをテストするには、次のコマンドを使用します。aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET \ --path-with-query-string '/validate?petType=dog'結果として、
200 OK
と犬のリストが返されます。 -
次のコマンドを使用して、クエリ文字列
petType
を含めずにテストします。aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method GET結果として
400
エラーが返されます。 -
リクエスト本文に対するリクエストの検証を実行する
POST
メソッドをテストするには、次のコマンドを使用します。aws apigateway test-invoke-method --rest-api-id
abc123
\ --resource-idefg456
\ --http-method POST \ --body '{"id": 1, "name": "bella", "type": "dog", "price" : 400 }'結果として、
200 OK
と成功メッセージが返されます。 -
次のコマンドを実行し、無効な本文を使用してテストします。
aws apigateway test-invoke-method --rest-api-id
abc123
\ --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 にインポートする に対する次の手順を参照してください。