ALBとドメインの紐付けとhttpsの対応
ドメイン作成
- AWS Certificate Manager
- TLS証明書の発行
- Route 53 CNAMEレコード
- TLS証明書発行時にドメインの所有を証明するために作成
- AWS Certificate Manager Validation
- TLS証明書発行時にドメインの所有を証明するために作成
- ACMでドメインを使用して所有証明をする場合は基本的にCNAMEレコードとワンセットで定義する。
- Route 53 Aレコード
- ALBとドメインの紐付け用レコード
- セキュリティグループルール
- 作成済みのALB用セキュリティグループへhttpsも受け付けるようルールを追加する
- ALB httpリスナー
- httpリクエスト受けつけ、そのリクエストをhttpsへリダイレクトさせるルール
- ALB httpsリスナー
- httpsリクエストを受けつけ、そのリクエストを作成済みのECS(nginx)へ流すルール
コードの記述
variable は変数の定義に使用
data は既存のリソースを参照
variable はRoute53で管理しているドメイン名を入力
data でそのドメインを参照してACMの証明書発行やALBとドメインの紐付け
無料のFreenomでドメイン取得
https://my.freenom.com/clientarea.php
Route53でホストゾーン作成
NSレコードが4件生成されるのでFreenomで取得したDNSのNameserverへNSレコードを追記
variable "domain" {
description = "Route 53 で管理しているドメイン名"
type = "string"
#FIXME:
default = "<YOUR DOMAIN NAME>"
}
# Route53 Hosted Zone
# https://www.terraform.io/docs/providers/aws/d/route53_zone.html
data "aws_route53_zone" "main" {
name = "${var.domain}"
private_zone = false
}
# ACM
# https://www.terraform.io/docs/providers/aws/r/acm_certificate.html
resource "aws_acm_certificate" "main" {
domain_name = "${var.domain}"
validation_method = "DNS"
lifecycle {
create_before_destroy = true
}
}
# Route53 record
# https://www.terraform.io/docs/providers/aws/r/route53_record.html
resource "aws_route53_record" "validation" {
depends_on = ["aws_acm_certificate.main"]
zone_id = "${data.aws_route53_zone.main.id}"
ttl = 60
name = "${aws_acm_certificate.main.domain_validation_options.0.resource_record_name}"
type = "${aws_acm_certificate.main.domain_validation_options.0.resource_record_type}"
records = ["${aws_acm_certificate.main.domain_validation_options.0.resource_record_value}"]
}
# ACM Validate
# https://www.terraform.io/docs/providers/aws/r/acm_certificate_validation.html
resource "aws_acm_certificate_validation" "main" {
certificate_arn = "${aws_acm_certificate.main.arn}"
validation_record_fqdns = ["${aws_route53_record.validation.0.fqdn}"]
}
# Route53 record
# https://www.terraform.io/docs/providers/aws/r/route53_record.html
resource "aws_route53_record" "main" {
type = "A"
name = "${var.domain}"
zone_id = "${data.aws_route53_zone.main.id}"
alias = {
name = "${aws_lb.main.dns_name}"
zone_id = "${aws_lb.main.zone_id}"
evaluate_target_health = true
}
}
# ALB Listener
# https://www.terraform.io/docs/providers/aws/r/lb_listener.html
resource "aws_lb_listener" "https" {
load_balancer_arn = "${aws_lb.main.arn}"
certificate_arn = "${aws_acm_certificate.main.arn}"
port = "443"
protocol = "HTTPS"
default_action {
type = "forward"
target_group_arn = "${aws_lb_target_group.main.id}"
}
}
# ALB Listener Rule
# https://www.terraform.io/docs/providers/aws/r/lb_listener_rule.html
resource "aws_lb_listener_rule" "http_to_https" {
listener_arn = "${aws_lb_listener.main.arn}"
priority = 99
action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
condition {
field = "host-header"
values = ["${var.domain}"]
}
}
# Security Group Rule
# https://www.terraform.io/docs/providers/aws/r/security_group_rule.html
resource "aws_security_group_rule" "alb_https" {
security_group_id = "${aws_security_group.alb.id}"
type = "ingress"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
planで確認後apply
freenomで作成したドメインへhttpでアクセスし、httpsへリダイレクトされ、nginxが表示されることを確認