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にロジックを記述
以下のようにコードを記述します。
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
を追加します。
テンプレートとしては、以下を追加します。
{
"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を追加します。
統合レスポンスの設定
[メソッドレスポンスのステータス]が302のものを追加します。ステータスが200のものは消します。
次に
[ヘッダーのマッピング]でメソッドレスポンスより追加した「Location」がレスポンスヘッダーとして表示されているので、それに対応するマッピングの値として、 integration.response.body.Location
を追加します。
これにより、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
のようにブラウザからアクセスしてみましょう。リダイレクトされるはずです。