CTO室の岩本 (iwamot) です。「小ネタでも積極的に投稿する」をモットーとしております。
先日、Amazon CloudFront の CloudFront Functions を使って、HTTP リクエストのリダイレクト処理を実装しました。https://example.com/foo?key1=A&key2=B&key2=C
へのリクエストを https://other.example.com/bar?key1=A&key2=B&key2=C
にリダイレクトするだけの内容です。
しかし、実装の際、CloudFront Functions の関数にはクエリ文字列そのものが渡らないことを知りました。かわりに、解析後のオブジェクト ({key1:{value:'A'},key2:{value:'B',multiValue:[{value:'B'},{value:'C'}]}}
) が渡ってきます。
今回の記事では、リダイレクトを実現するために採用した、クエリ文字列の復元方法をご紹介します。
クエリ文字列モジュールを使う
解析後のオブジェクトは event.request.querystring
で参照できます。関数のハンドラに渡される唯一の引数 event
オブジェクトに含まれているものです。
オブジェクトをクエリ文字列に復元するため、今回はクエリ文字列モジュールを使うことにしました。querystring.stringify(object)
でクエリ文字列を返してくれます。
具体的な実装は、下記のサンプルをご覧ください。event.request.querystring
の内容に基づき、querystring.stringify
が処理できる形式の query
オブジェクトを組み立てています。
var querystring = require('querystring'); function stringifyQueryString(eventQueryString) { var query = {}; Object.entries(eventQueryString).forEach(function(q) { query[q[0]] = q[1].multiValue ? q[1].multiValue.map(function(m) {return m.value}) : q[1].value; }); return querystring.stringify(query); } function handler(event) { console.log(event.request.querystring); console.log(stringifyQueryString(event.request.querystring)); return { statusCode: 200, statusDescription: 'OK' }; }
マネジメントコンソールでテストすると、意図どおりに復元できていることが分かります。
復元不要にしてほしいと AWS に伝えた
以上のように処理すれば復元できるとはいえ、ちょっと面倒です。そもそも event オブジェクトにクエリ文字列そのものが含まれていれば、復元せずに済みます。
そこで、AWS のサポートケースを開き、復元不要にしてほしいと伝えました。実際に対応されるかどうかは分かりませんが、ニーズは伝わったはずです。
ちなみに、改善要望をサポートケースで受け付けていることは「技術的なお問い合わせに関するガイドライン」に明記されています。
- 各サービスの機能追加、改善のご要望を承っています。
- サポートケースのテキストに直接記入いただいて構いません。エンジニアが承り、サービス開発チームに連携いたします。
- 実現のお約束や、実現時にご連絡を個別に差し上げることはできかねますが、お客様の声をサービス開発チームにフィードバックすることは、AWS のサービス改善にとって有益であると考えています。
使いづらい AWS サービスがあれば、どんどん声を上げましょう。