web-dev-qa-db-ja.com

AWS API Gateway:すべてのパラメーターをパススルーします

私はAmazonのAPIGatewayをバックエンドAPIへの単純なプロキシとして使用しています。これを使用する主な理由は次のとおりです。APIキーを取得する簡単な方法と、「環境」の認証、追跡、および処理。

私の問題は、すべてのクエリパラメータ、ヘッダーなどをバックエンドに渡して、それを処理させたいということです。その後、帰りに、サービスから適切な応答コードをクライアントに返したいと思います。それらを明示的にマップする必要はありません。私が理解しているように、ほとんどすべてのクエリパラメータを指定する必要があり、パラメータが変更されたり、さらに追加されたりした場合は、APIを更新する必要があります。これは、開発/テスト中に私たちにとって退屈なものです。

クエリパラメータやヘッダーなどを受け入れて渡すようにGatewayに指示して、明示的に指定する必要がないようにする方法はありますか?応答ステータスコードについても同じ質問ですか?

15
alph486

残念ながら、すべてのパラメータのパススルーを実行する方法はありません。メソッドリクエストで各パラメータを指定する必要があります。ステータスコードについても同じ答えです。

それ以来、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と見なします。

12
Jack Kohn - AWS

リクエストには、すべてを簡単に通過するためのマッピングがあります。これは私が最近使用したものです。

_{
  "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応答に簡単にマッピングできると思います。

8
Mark B

API Gatewayのhttp-proxy機能(送信する方法ですべてのパラメーターを取得します)を、前述のEC2URLまたはその他のURLに使用できると思います。

2