はじめに
サブドメインをネイキッドドメインにリダイレクトする方法を探していたら、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.com
を example.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"
}
}
}