ENECHANGE Developer Blog

ENECHANGE開発者ブログ

CloudFront Functionsの新機能 rawQueryString() がマネコンだと空になる件(仕様でした)

AWS Community Builders Advent Calendar 2025」17日目の記事です。


VPoTの岩本 (iwamot) です。

2025年11月、CloudFront Functionsで rawQueryString() というヘルパーメソッドが使えるようになりました。

aws.amazon.com

名前のとおり、リクエストURLのクエリストリングをそのまま取得できるメソッドです。

Case 1: Full query string returned (without leading ?)
Incoming request URL: https://example.com/page?name=John&age=25&city=Boston
rawQueryString() returns: "name=John&age=25&city=Boston"
Case 2: Empty string returned (when ? is present but without parameters)
Incoming request URL: https://example.com/page?
rawQueryString() returns: ""
Case 3: undefined returned (no query string and no ?)
Incoming request URL: https://example.com/page
rawQueryString() returns: undefined

General helper methods - Amazon CloudFront

以前はパース後のオブジェクトしか参照できなかったため、うれしい機能追加です。たとえば、リダイレクトが必要でクエリストリングを維持したい場合などに便利でしょう。

しかし、この rawQueryString() には、ちょっとした罠があります。

罠:マネコンでテストすると空文字列を返す

下記の関数コードを、CloudFrontのマネジメントコンソールでテストしてみましょう。

function handler(event) {
  var request = event.request;
  console.log("querystring: '" + JSON.stringify(request.querystring) + "'");
  console.log("rawQueryString: '" + request.rawQueryString() + "'");
  console.log("typeof rawQueryString: " + typeof request.rawQueryString());
  return request;
}

テストイベントには、以下のJSONを指定します。

{
  "version": "1.0",
  "context": {
    "eventType": "viewer-request"
  },
  "viewer": {
    "ip": "1.2.3.4"
  },
  "request": {
    "method": "GET",
    "uri": "/index.html",
    "headers": {},
    "cookies": {},
    "querystring": {
      "key1": {
        "value": "val1"
      }
    }
  }
}

この場合、リクエストが GET /index.html?key1=val1 となるので、下記のようなログが出力されることを期待しますよね。

querystring: '{"key1":{"value":"val1"}}'
rawQueryString: 'key1=val1'
typeof rawQueryString: string

しかし、実際の出力はこうなってしまいます。

querystring: '{"key1":{"value":"val1"}}'
rawQueryString: ''
typeof rawQueryString: string

(ちなみに、クエリを指定しない場合も undefined ではなく空文字列が返ります。この点もドキュメントとは異なる挙動です)

ディストリビューションに適用すると、ちゃんと動く

この関数を実際にデプロイし、CloudFrontディストリビューションのビヘイビアに適用すると、ドキュメントどおりのログ出力が得られます。

表にまとめると、以下のとおりです。

実行箇所 出力されるログ
rawQueryString() の期待値 'key1=val1'
マネコンでのテスト結果 ''
ディストリビューションでの挙動 'key1=val1'

結論、マネコンのテストは諦めて、デプロイして確認するほうが早い場面が多そうです。

AWSサポートによれば、仕様とのこと

テストしづらいと不便なので、AWSサポートに問い合わせたのですが、この挙動は現時点での仕様とのことでした。改善してほしい旨はフィードバック済みです。

rawQueryString() を含む関数コードをマネコンでテストする際には、この仕様を頭に入れておきましょう。