ENECHANGE Developer Blog

ENECHANGE開発者ブログ

CloudFront Functions 関数でクエリ文字列を復元する

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 サービスがあれば、どんどん声を上げましょう。