作りながら覚えるTerraform入門シリーズの第5回です。
今回は独自ドメインでHTTPS接続するための準備として、Route53とACMを作成していきます。
独自ドメインはお名前.comで取得しているものを使います。
作りながら覚えるTerraform入門シリーズ
今回の学習ポイントは以下です。が、具体的に解説はできていません^^;
- lifecycle
- メタ引数
- for文
ホストゾーンの作成
まず、Route53のホストゾーンを作成します。
route53.tf
を作成し、以下のコードを貼り付けます。
################################
# Route 53
################################
resource "aws_route53_zone" "public" {
name = var.my_domain
}
output "name_servers" {
description = "A list of name servers in associated (or default) delegation set."
value = aws_route53_zone.public.name_servers
}
output
ブロックではRoute53のネームサーバを出力させるようにしています。
variables.tf
に独自ドメインの変数を追加します。
# Route53
variable "my_domain" {}
ドメイン名はterraform.tfvars
から読み込ませるようにしておきます(以下のドメインは適当です)
prefix = "cloud02"
my_domain = "example.com"
terraform apply
を実行してホストゾーンを作成後、Outputsで出力されるネームサーバをお名前.com側に登録します。(ネームサーバはコンソール画面から確認でもOK)
ネームサーバの変更が反映されるには少し時間がかかりますので気長に待ちましょう。dig
コマンドなどでNSレコードの反映が確認できたら次の手順へ進みます。
# ネームサーバ変更前
dig example.com ns +short
dns1.onamae.com.
dns2.onamae.com.
# ネームサーバ変更後
dig example.com ns +short
ns-1596.awsdns-07.co.uk.
ns-450.awsdns-56.com.
ns-656.awsdns-18.net.
ns-1045.awsdns-02.org.
ACMでパブリック証明書を作成
続いて、ACMでパブリック証明書(SSL証明書)を作成します。
route53.tf
に以下のコードを追加します。
################################
# ACM
################################
resource "aws_acm_certificate" "public" {
domain_name = aws_route53_zone.public.name
subject_alternative_names = ["*.${aws_route53_zone.public.name}"]
validation_method = "DNS"
lifecycle {
create_before_destroy = true
}
}
domain_name
には独自ドメインの名前を指定し、subject_alternative_names
には頭に*.
を付け加えてサブドメインにも対応したワイルドカード証明書を作成するようにしています。こうすることで、ネイキッドドメイン、サブドメインどちらとも保護することができます。たとえば、ドメイン名がexample.com
の場合、以下のようなドメインが保護されます。
- example.com (ネイキッドドメイン)
- www.example.com
- corp.example.com
validation_method
ではDNS検証を指定しています。lifecycle
は後述します。
terraform apply
を実行して、パブリック証明書が作成されることを確認しましょう。
メタ引数
ACMの lifecycle ブロックでは証明書再作成時の挙動を指定しています。デフォルトではリソースの再作成が必要な場合、「既存のリソースを削除してから新しいリソースを作成する」という挙動になります。lifecycleブロックでcreate_before_destroy = true
を指定することで「新しいリソースを作成してから、古いリソースを削除する」という動作になりますので、SSL証明書再作成時の影響を最小限にすることができます。
lifecycleのようにTerraformの挙動をコントロールするオプションを「メタ引数(Meta-Argument)」と呼び、ACMのみならずすべてのリソースで指定することができます。メタ引数は他にもあり、まとめると次のようになります。
種類 | 説明 |
---|---|
depends_on | 依存関係を定義する |
count | 指定回数ループする |
for_each | マップや文字列を元にループする |
provider | プロバイダーを上書きする |
lifecycle | ライフサイクルの挙動を定義する |
depends_on
はリソース間の依存関係を定義します。基本的にはTerraformによって自動的に依存関係を考慮しながら作成・更新・削除されるのですが、一部リソースなど、依存関係を明示的に指定してあげないとうまく動作しない場合に利用します。
count
とfor_each
はループ処理で利用します。前回のEC2編のENIやEC2の作成のように、同じようなリソースを複数作成したい場合に便利です。
provider.tf
にはプロバイダーにAWSを利用することを宣言し、デフォルトリージョンにap-northeast-1
を指定していますが、Resourceブロックにprovider
を指定することで上書きすることができます。例えば、別のリージョンに作成したい場合などでしょうか。追加のプロバイダーにはエイリアスを定義しておいて、Resourceブロックではエイリアスの名前を記述します。詳細は The Resource provider Meta-Argument を参照。
ACMのドメイン検証
ドメインの所有者を検証するために「DNS検証」を指定しましたので、Route53に検証用のCNAMEレコードを登録します。今はまだ証明書を作成しただけなので「検証保留中」となっている状態です。コンソール画面であれば「Route53でのレコードの作成」のボタンを押すだけなので非常に簡単なのですがこれをTerraformで行います。
route53.tf
に以下のコードを追加します。
resource "aws_route53_record" "public_dns_verify" {
for_each = {
for dvo in aws_acm_certificate.public.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
allow_overwrite = true
name = each.value.name
records = [each.value.record]
ttl = 60
type = each.value.type
zone_id = aws_route53_zone.public.id
}
resource "aws_acm_certificate_validation" "public" {
certificate_arn = aws_acm_certificate.public.arn
validation_record_fqdns = [for record in aws_route53_record.public_dns_verify : record.fqdn]
}
まず、aws_route53_record
でRoute53にCNAMEレコードを登録します。
コンソール画面で見たCNAMEレコードの名前と値のペアを取得したいのですが、これは先に作成したACMのリソースaws_acm_certificate.public
からdomain_validation_options
を参照することで取得できます。terraform console
で確認するとわかりやすいです。
for_each
と for
を使ってるので少しわかりづらいかもしれませんが、以下の記事を参考にしました。
Terraform で AWS Certificate Manager 無料証明書を発行する(AWS Provider 3.0.0 以降の場合)
aws_acm_certificate_validation
は検証が成功するまで待機するためのものです。新たにリソースが作成されることはありません。
CNAMEレコードの登録、DNS検証検証の待機とも for文 が使われていますが、これはリストやマップを変換したり、フィルタする時に使います。こちらもterraform console
で確認してみるとやっていることは理解できますが、書けと言われるとまだ書けないですね。。terraform console
で動きを確認しながら慣れていきたいと思います。
terraform apply
すると10分くらいでDNS検証が成功しました。
:
aws_acm_certificate_validation.public: Still creating... [9m50s elapsed]
aws_acm_certificate_validation.public: Still creating... [10m0s elapsed]
aws_acm_certificate_validation.public: Creation complete after 10m8s [id=2021-06-09 00:29:59 +0000 UTC]
コンソール画面で確認しても「発行済み」に変わっていることがわかります。
今回は以上です。次回はELB編ということで、ロードバランサを作成して独自ドメインでHTTPS接続できるようにしてみたいと思います!