AWS
redirect
lambda
APIGateway

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

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

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

参考