まだドメインのリダイレクトをAmazon S3でやっているの?


はじめに

サブドメインをネイキッドドメインにリダイレクトする方法を探していたら、AWSが出しているある記事を見つけました。

そこには、あるドメインを別のドメインにリダイレクトするときのAWSベストプラクティスが、Amazon S3でリダイレクトするのではなくて、ALBを使ってリダイレクト設定することになっていました。
参考資料: https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-redirect-to-another-domain-with-alb/

今まで私はAmazon S3のWebサイトホスティングでサブドメインのリダイレクトをかけてました(www.XXXX.jp → XXXX.jp へのリダイレクト)。また、S3単体ではHTTPSに対応していないため、CloudFront+S3でリダイレクトをしていた人も多いのではないでしょうか。

ですが、ALBのリダイレクト機能を使えば、CloudFrontがなくてもHTTPSのリダイレクトもできます。

前提条件

以下の前提で手順は行います。

  • 証明書はACMで発行しており、ワイルドカードを取得している
  • ALBはすでに構築済み
  • Terraformのバージョンはv0.14以降であること

今回のお題

www.example.comexample.com にリダイレクトさせようと思います。

Terraformコード

GUIの手順としてはAWSの資料に記載の通りなので、
ここでは、手順をTerraformのコードに落とそうと思います。
ちなみにあるALBのリスナーをこのように編集すれば特定のURLをリダイレクトしてくれます。

# このコードでは *.example.comとexample.comをACMで証明書取得していることにします
# www.example.comとexample.comは同じALBに向けています。
data "aws_route53_zone" "example_com" {
  name = "example.com"
}

resource "aws_route53_record" "a_example_com" {
  zone_id = data.aws_route53_zone.example_com.zone_id
  name    = "example.com."
  type    = "A"

  alias {
    name                   = aws_lb.example.dns_name
    zone_id                = aws_lb.example.zone_id
    evaluate_target_health = false
  }
}

resource "aws_route53_record" "a_www_example_com" {
  zone_id = data.aws_route53_zone.example_com.zone_id
  name    = "www.example.com."
  type    = "A"

  alias {
    name                   = aws_lb.example.dns_name
    zone_id                = aws_lb.example.zone_id
    evaluate_target_health = false
  }
}

# ALBの設定 
resource "aws_lb" "example" {
  # ...
}

resource "aws_lb_listener" "example" {
  # Other parameters
}

## ALBのリスナールールでリダイレクトを記載
## ここでwww.example.comをexample.comにリダイレクトする
resource "aws_lb_listener_rule" "example" {
  listener_arn = aws_lb_listener.example.arn
  priority     = 1

  condition {
    host_header {
      values = ["www.example.com"]
    }
  }

  action {
    type = "redirect"
    redirect {
      host        = "example.com"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}