CloudFront Functionsでリライトしても、アクセスログには元のURIが残る

  • AWS
  • CloudFront

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

何が起きたか

CloudFront FunctionsのViewer Requestで、ディレクトリっぽいパスにアクセスしたら /index.html を返すようにするやつ。よくあるやつ。

function handler(event) {
var request = event.request;
if (request.uri === "/example/example/") {
request.uri = "/index.html";
}
return request;
}

これ自体は動く。オリジンには /index.html がリクエストされる。

問題はアクセスログ。「じゃあアクセスログには何て記録されるの?」って聞いたら、最初は「書き換え後の /index.html が記録される」という回答が返ってきた。

でも実際にアクセスログを確認したら /example/example/ のまま記録されていた。書き換え後の値じゃない。

聞き直したら今度は「元のURIが記録される」に回答が変わった。同じ質問に対して矛盾した答えが返ってきたことになる。

結論

CloudFrontの標準アクセスログ(cs-uri-stem)には、Functionでの書き換え前、つまりビューアが実際にリクエストしてきたURIが記録される。書き換え後のURIではない。

CloudFront Functionsの公式ドキュメント(イベント構造のページ)を見ても、request.uri を変更した場合の説明は「オリジンにリクエストするオブジェクトが変わる」「キャッシュビヘイビアやオリジンの割り当ては変わらない」という2点だけで、アクセスログへの反映については特に書かれていない。

ただ、2026年7月にCloudFront Functionsから cf.logCustomData() というアクセスログへの書き込み機能が追加されている。用途としては「Function内でのA/Bテスト振り分けやルーティング判断をアクセスログに直接残せる」というもので、これが必要になった経緯自体が「今まではFunction内での処理結果(リライトも含む)がアクセスログとは別系統でしか見えなかった」ことの裏付けになっている。

つまり構造としては、

flowchart LR
    A[ビューアからのリクエスト] --> B[CloudFront Functions viewer request]
    B -->|uriを書き換え| C[オリジンへのリクエスト]
    A -->|元のuriのまま| D[アクセスログ cs-uri-stem]

Functionでの書き換えは「オリジンに何を取りに行くか」には効くが、「アクセスログに何が残るか」には効かない。この2つは別の系統として動いている。

リライト後のパスもログに残したい場合

書き換え後の値を見たいなら、Function内で cf.logCustomData() を呼んで明示的にログへ書き込むか、リアルタイムログ側の設定を確認する必要がある。標準ログだけ見て「リライトされたはずのパスが記録されていない」と悩むのは、多分よくあるやつだと思う。

未確認事項

cs-uri-stem が元のURIを記録する挙動について、AWS公式ドキュメントに明文化された一文は見つけられなかった。今回の結論は、実際のアクセスログでの実測結果と、CloudFront Functionsのイベント構造ドキュメント、および cf.logCustomData() 追加の経緯から導いたもの。挙動としてはほぼ間違いないはずだが、公式の一次情報として明言している記述があれば教えてほしい。