21
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS API-Gateway でLambdaの結果に合わせてリダイレクトする

Posted at

ほぼ表題で言い切っちゃってるんですが、そういうことやりたいです。

tl;dr

  • Lambda がリダイレクト先のURLを含めたJSONデータを返す
  • メソッドレスポンスを302(あるいは301)にして、レスポンスヘッダーに Location を定義する
  • 統合レスポンスで302に対して、ヘッダーのマッピングで Locationintegration.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/ なマッピングができる事になります。

デプロイして確認すると、リダイレクトされることを確認できます。めでたしめでたし。

参考

21
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?