ほぼ表題で言い切っちゃってるんですが、そういうことやりたいです。
tl;dr
- Lambda がリダイレクト先のURLを含めたJSONデータを返す
- メソッドレスポンスを302(あるいは301)にして、レスポンスヘッダーに
Location
を定義する - 統合レスポンスで302に対して、ヘッダーのマッピングで
Location
にintegration.response.body.location.フィールド
を指定する
やることその1:リダイレクトURLを含んだ結果を返すLambdaをAPI-Gatewayに通しておく
Lambdaとしては、例えば {"location":"http://example.com/"}
といったレスポンスを返せばOKです。
フィールド名は適当に location
としてますが、それこそ redirect_url
でもいいし hoge
でも fuga
でもお好きにどうぞ。
例えばこんな感じのLambdaをそれこそ適当に用意して、
API-Gatewayから呼び出すようにしておきます。
exports.handler = function(event, context) {
context.succeed({location: 'http://example.com/'});
};
やることその2: リダイレクトのためのメソッドレスポンスを作る
API-Gateway の設定画面で「メソッドレスポンス」を開くと、
デフォルトで200が定義されてると思いますが、今回はリダイレクトさせたいので、
200はおもむろに消します。
「+レスポンスの追加」をポチーっとして、「HTTPステータスコード」のところに「302」(301でもいいよ)を入力して「✔」ボタンをポチります。
「▼ 302」が増えるはずなので「▼」をポチーっとして、「ヘッダーの追加」をポチーっとすると、名前を入力するところがでてきます。
そこに「 Location
」を入力してください。
これで、レスポンスヘッダにLocationが含まれることが定義されています。
が、これだけだと何の値が返るかは未定義なので、統合レスポンスで値を定義します。
やることその3: レスポンスヘッダLocationに値をマッピングする
やりたいことは、Lambdaが返した {location: 'http://example.com/'}
の location
フィールドの値を、
「メソッドレスポンス」で定義した「 Location
」にマッピングしたいわけです。
統合レスポンスの設定を開いて、ここでもデフォルトで200が定義されていますが、
それはおもむろに削除して、「統合レスポンスの追加」を行います。
- Lambdaエラーの正規表現:
.*
- メソッドレスポンスのステータス: 302
追加したら「ヘッダーのマッピング」に Location
があると思いますので、
「マッピングの値」のところに integration.response.body.location
を定義します。
Lambdaの返り値を integration.response.body
で参照できるようになっていますので、
これで Location: http://example.com/
なマッピングができる事になります。
デプロイして確認すると、リダイレクトされることを確認できます。めでたしめでたし。