私はAmazonのAPIGatewayをバックエンドAPIへの単純なプロキシとして使用しています。これを使用する主な理由は次のとおりです。APIキーを取得する簡単な方法と、「環境」の認証、追跡、および処理。
私の問題は、すべてのクエリパラメータ、ヘッダーなどをバックエンドに渡して、それを処理させたいということです。その後、帰りに、サービスから適切な応答コードをクライアントに返したいと思います。それらを明示的にマップする必要はありません。私が理解しているように、ほとんどすべてのクエリパラメータを指定する必要があり、パラメータが変更されたり、さらに追加されたりした場合は、APIを更新する必要があります。これは、開発/テスト中に私たちにとって退屈なものです。
クエリパラメータやヘッダーなどを受け入れて渡すようにGatewayに指示して、明示的に指定する必要がないようにする方法はありますか?応答ステータスコードについても同じ質問ですか?
残念ながら、すべてのパラメータのパススルーを実行する方法はありません。メソッドリクエストで各パラメータを指定する必要があります。ステータスコードについても同じ答えです。
それ以来、HTTPエンドポイントとLambda関数の「プロキシ」統合を開始しました。これは、リクエスト入力のプロキシとして機能し、すべてのパラメーターとペイロードを統合に送信します。 Lambda関数の場合、すべてのパラメーターとペイロード、およびリクエストコンテキストとステージ変数を含むビルド済みのJSON構造があります。
このドキュメントを参照してください: http://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-set-up-lambda- proxy-integration-on-proxy-resource
これは過去に行った機能リクエストであり、バックログにありますが、現時点ではETAはありません。これを両方のパススルー機能の別の+1と見なします。
リクエストには、すべてを簡単に通過するためのマッピングがあります。これは私が最近使用したものです。
_{
"method": "$context.httpMethod",
"body" : $input.json('$'),
"headers": {
#foreach($param in $input.params().header.keySet())
"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end
#end
},
"queryParams": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
},
"pathParams": {
#foreach($param in $input.params().path.keySet())
"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end
#end
},
"stage-variables" : {
#foreach($key in $stageVariables.keySet())
"$key" : "$util.escapeJavaScript($stageVariables.get($key))"
#if($foreach.hasNext),#end
#end
},
"context" : {
"account-id" : "$context.identity.accountId",
"api-id" : "$context.apiId",
"api-key" : "$context.identity.apiKey",
"authorizer-principal-id" : "$context.authorizer.principalId",
"caller" : "$context.identity.caller",
"cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
"cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
"cognito-identity-id" : "$context.identity.cognitoIdentityId",
"cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
"http-method" : "$context.httpMethod",
"stage" : "$context.stage",
"source-ip" : "$context.identity.sourceIp",
"user" : "$context.identity.user",
"user-agent" : "$context.identity.userAgent",
"user-arn" : "$context.identity.userArn",
"request-id" : "$context.requestId",
"resource-id" : "$context.resourceId",
"resource-path" : "$context.resourcePath"
}
}
_
すべてのヘッダーとパラメーターをループして、すべてをマップします。 昨日発表 という新機能もあります。これにより、生のリクエスト本文を渡すことができます。
ユニバーサルレスポンスマッピングを作成するために同様のアプローチを取ることができると思います。 昨日発表 でもあったparseJson()
マッピング関数を確認することをお勧めします。新しいparseJson()
関数を使用すると、バックエンドからJSONデータを含む文字列を返すことができ、APIゲートウェイのJSON応答に簡単にマッピングできると思います。
API Gatewayのhttp-proxy機能(送信する方法ですべてのパラメーターを取得します)を、前述のEC2URLまたはその他のURLに使用できると思います。