web-dev-qa-db-ja.com

Lambdaを使用してAWS API GatewayにリクエストするためにHTTPヘッダーにアクセスする方法は?

API Gateway FAQ では、API Gatewayに送信されたリクエストヘッダーにアクセスできることがわかります...

既にOAuthトークンまたはその他の認証メカニズムを利用している場合、署名済みAPI呼び出しを必要とせず、検証のためにトークンヘッダーをバックエンドに転送するようにAPI Gatewayを簡単にセットアップできます。

ただし、ドキュメントでその方法の例を見つけることはできません。Lambdaを使用してこのデータにアクセスする方法は不明です。

オープンAPIをセットアップし、POST( ウォークスルー:API GatewayおよびLambda関数 )の一部であるJSONオブジェクトにアクセスできますが、自分のプロバイダーでOAuth 2.0スタイルAPIを実装するには、「Authorization」ヘッダーにアクセスする必要があります。

私の好みは、LambdaとJava 8を使用してこれをセットアップすることですが、node.jsを使用した例は、これを実現する方法を理解するのにも役立ちます。

43
JaredHatfield

APIメソッドを説明するダッシュボード画面のIntegration Requestパネル内に入力マッピングを作成する必要があります。

次のコードは、nameクエリ入力パラメーターをLambda Event input objectに変換します。

{
   "name": "$input.params('name')"
}

スクリーンショット:

API Dashboard screenshot

これに関する詳細は、元の AWSフォーラムのLambda入力スレッドへのAPIゲートウェイ で確認できます。

21
kixorz

最初に、HTTP GETリクエストからAuthorizationヘッダーをトラップする必要があります。次に、その値をLambdaイベントオブジェクトにマッピングする必要があります。

APIメソッドダッシュボードに移動し、[メソッドリクエスト]をクリックします。以下に示すように、そこにAuthorizationというHTTP Request Headerを追加できます。

HTTP Request Headers

これにより、Authorizationヘッダーがトラップされるため、後で使用できます。

メソッドダッシュボードに戻り、Integration Requestをクリックします。ここから、このようなマッピングを使用して、ヘッダーの値をLambda関数に渡すことができます。

{
    "Authorization": "$input.params('Authorization')"
}

Lambda関数で、このような値を取得できます。

event.Authorization
31
David Fevre

統合リクエストで次のマッピングテンプレートを使用して、すべてのパス、クエリ、ヘッダーパラメーターをLambdaイベントに一般的にマッピングできます。 API GatewayのMethod Requestセクションでそれらを登録する必要がありますが、使用する特定のパラメーターからマッピングテンプレートを少なくとも分離できます。この方法では、ヘッダー、クエリ、またはパスパラメーターを変更するたびにマッピングテンプレートコードを変更する必要はありません。

マッピングテンプレートの詳細と説明を提供するブログ投稿を書きました。 http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your -lambda-event-from-api-gateway /

使用できるマッピングテンプレートは次のとおりです。

{
  "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
  }  
}
28
kennbrodhagen

これは古いスレッドですが、目的のためにラムダプロキシ統合を使用するのが最適であることがわかりました。これにより、APIゲートウェイで何も設定する必要がなく、ラムダ関数のすべてのヘッダーを取得できます...

11
Prabhat

ラムダプロキシ統合リクエストで設定するPrabhatの答えによると、これを行う最も簡単な方法です。その後、リクエストヘッダー、パスパラメーター、クエリパラメーターにアクセスできます。

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
1
Jonathan

Kennbrodhagenによる解決策は私にとってはうまくいきました。詳細については彼の答えとブログをご覧ください。ポスターはJava実装の優先順位を表明し、JavaでKennのハンドラーを実装する方法を理解するのに時間がかかったので、対応するJavaコードを共有しています。

public class MyHandler implements RequestHandler<Map<String,Object>,String> {

    @Override
    public String handleRequest(Map<String,Object> eventMap, Context context) {
        LambdaLogger logger = context.getLogger();
        logger.log("Body:" + eventMap.get("body"));
        logger.log("Headers:" + eventMap.get("headers"));
        logger.log("Method:" + eventMap.get("method"));
        logger.log("Params:" + eventMap.get("params"));
        logger.log("Query:" + eventMap.get("query"));
        return("{}");
    }
}
0
mojoken