Edited at

API Gateway + Lambdaで任意のURLにリダイレクトする方法

More than 1 year has passed since last update.

Web開発をしているときに、クライアントからアクセスされたサーバーでリダレクトさせたい場合があるとします。

そのとき、サーバーを立ててWebサーバーをインストールしてredirectの設定をして...等行うと思いますが、それをAWSのサービスでサーバレスに行う方法を紹介します。

これは、

「Webサーバーリクエストを受け付けて、リダイレクト処理 + ちょっとしたロジック」

「API Gatewayでリクエストを受け付けて、Lambdaでリダレクト用のヘッダーを作成 + ちょっとしたロジック。それを、API Gatewayでまた返却」

という形で実現します。

使用するサービスはタイトルにもあるように、


  • API Gateway

  • AWS Lambda

Lambda上のランタイムは、

version

Node.js
v6.10

となります。

これら作るのは

あるURLにGETメソッドのクエリパラメータにリダイレクトするという機構です。

さて、実際には以下の作業を行っていきます。


  • Lambdaにロジックを記述

  • API Gatewayの設定をする

Lambdaを先に設定するのは、API Gatewayの設定中、Lambdaを設定する箇所が出てくるからです。


Lambdaにロジックを記述

以下のようにコードを記述します。


index.js

exports.handler = (event, context, callback) => {

var location = decodeURI(event["params"]["target"])

context.succeed({"Location": location});
};


event["params"]["target"] : eventオブジェクトのtargetがgetのパラメータと紐付いてます。


API Gatewayの設定をする


  • APIの作成

  • Lambdaの設定

  • 統合リクエストの設定

  • メソッドレスポンスの設定

  • 統合レスポンスの設定


APIの作成/Lambdaの設定


統合リクエスト

[本文マッピングテンプレート]から[Content-Type]として、 application/json を追加します。

スクリーンショット 2017-08-03 16.04.01.png

テンプレートとしては、以下を追加します。

{

"params": {
#foreach($param in $input.params().querystring.keySet())
"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}
}

これにより、GETメソッドのparameterをeventオブジェクトのkey, objectに展開できます。


メソッドレスポンスの設定

デフォルトで、HTTPのステータスコードが200がレスポンスとして設定されているので、それを削除します。

[レスポンスの追加]より、ステータスコード302を追加します。

[302 のレスポンスヘッダー]において、

Locationを追加します。

スクリーンショット 2017-08-03 15.53.11.png


統合レスポンスの設定

[メソッドレスポンスのステータス]が302のものを追加します。ステータスが200のものは消します。

次に

[ヘッダーのマッピング]でメソッドレスポンスより追加した「Location」がレスポンスヘッダーとして表示されているので、それに対応するマッピングの値として、 integration.response.body.Location を追加します。

スクリーンショット 2017-08-03 15.55.12.png

これにより、LambdaでのLocationの値が、レスポンスヘッダー「Location」にマッピングされるようになります。


実行してみる

[ステージ名]を test 等にして、APIをDeployすると、

 https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/test

と呼び出し用のURLが発行されます。

https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/test?target=https%3A%2F%2Fwww.google.co.jp

のようにブラウザからアクセスしてみましょう。リダイレクトされるはずです。


参考