

CloudFront Functionsでリライトしても、アクセスログには元のURIが残る
この記事は、構成と文章の整理に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() 追加の経緯から導いたもの。挙動としてはほぼ間違いないはずだが、公式の一次情報として明言している記述があれば教えてほしい。