Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
23
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

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

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/ なマッピングができる事になります。

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
23
Help us understand the problem. What are the problem?