☁️

CloudFront Functions を使ったリダイレクトを Terraform で設定する

2021/08/02に公開

以前は CloudFront でリダイレクトを設定する場合、origin に ALB を配置し、ALB の listener rule として設定したりしていました。
ですが ALB はトラフィックに関係なく時間課金も発生してしまうため、個人開発等においてはできれば使いたくありません。

ですが、2021 年 (だったかな?) に発表された CloudFront Functions を利用して実装すれば、課金はリクエスト回数に対してのみで、かつ無料枠も大きいので現在はこちらを利用するのがいいでしょう。

CloudFront Functions の料金についてはこちらを参照。

Terraform で設定してみる

以下は /foo から /bar にリダイレクトするときの設定です。
ホスト名はリクエストヘッダのものをそのまま利用しますが、ホスト名も変更したい場合は適宜工夫してください。
まずは CloudFront の Distributioin と Function。

resource "aws_cloudfront_distribution" "cdn" {
  // ...

  ordered_cache_behavior {
    // ...
    path_pattern = "foo"

    function_association {
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.redirector.arn
    }
  }

  // ...
}

resource "aws_cloudfront_function" "redirector" {
  name    = "redirector"
  runtime = "cloudfront-js-1.0"
  comment = "Redirect to /bar"
  publish = true
  code    = file("redirector.js")
}

リダイレクトのための JavaScript コードは file 関数で以下のファイルを読み込みます。

function handler(event) {
  var request = event.request;
  var headers = request.headers;
  var host = headers.host.value;
  var newurl = `https://${host}/bar`; 
  
  var response = {
    statusCode: 301,
    statusDescription: 'Moved Permanently',
    headers: { location: { value: newurl } }
  };

  return response;
}

あとはこれを terraform apply すれば動きます。多分。
自分のウェブサイトで実際に動いているものをコピペで持ってきているので動くはずですが、説明用に余計なところを省いたり直したりしているのでその過程で壊れていたらすいません。

書いていて、CloudFront Functioins 以前も Lambda@Edge とか使えば使えば ALB よりも安価にできたのでは、ということに気づきましたが、まぁ気にしないことにします。
2021 年的には設定の容易さ・コストの両面で CloudFront Functions で間違いないでしょう。

Discussion