7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

作りながら覚えるTerraform入門(5) - Route53 + ACM編

Last updated at Posted at 2021-06-09

作りながら覚えるTerraform入門シリーズの第5回です。
今回は独自ドメインでHTTPS接続するための準備として、Route53とACMを作成していきます。
独自ドメインはお名前.comで取得しているものを使います。

作りながら覚えるTerraform入門シリーズ
  1. インストールと初期設定
  2. 基本編
  3. VPC編
  4. EC2編
  5. Route53 + ACM編 => 今回はコチラ
  6. ELB編
  7. RDS編

今回の学習ポイントは以下です。が、具体的に解説はできていません^^;

  • lifecycle
  • メタ引数
  • for文

ホストゾーンの作成

まず、Route53のホストゾーンを作成します。
route53.tfを作成し、以下のコードを貼り付けます。

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のネームサーバを出力させるようにしています。
image.png

variables.tfに独自ドメインの変数を追加します。

variables.tf
# Route53
variable "my_domain" {}

ドメイン名はterraform.tfvarsから読み込ませるようにしておきます(以下のドメインは適当です)

terraform.tfvars
prefix    = "cloud02"
my_domain = "example.com"

terraform applyを実行してホストゾーンを作成後、Outputsで出力されるネームサーバをお名前.com側に登録します。(ネームサーバはコンソール画面から確認でもOK)

image.png

ネームサーバの変更が反映されるには少し時間がかかりますので気長に待ちましょう。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に以下のコードを追加します。

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によって自動的に依存関係を考慮しながら作成・更新・削除されるのですが、一部リソースなど、依存関係を明示的に指定してあげないとうまく動作しない場合に利用します。

countfor_eachはループ処理で利用します。前回のEC2編のENIやEC2の作成のように、同じようなリソースを複数作成したい場合に便利です。

provider.tfにはプロバイダーにAWSを利用することを宣言し、デフォルトリージョンにap-northeast-1を指定していますが、Resourceブロックにproviderを指定することで上書きすることができます。例えば、別のリージョンに作成したい場合などでしょうか。追加のプロバイダーにはエイリアスを定義しておいて、Resourceブロックではエイリアスの名前を記述します。詳細は The Resource provider Meta-Argument を参照。

ACMのドメイン検証

ドメインの所有者を検証するために「DNS検証」を指定しましたので、Route53に検証用のCNAMEレコードを登録します。今はまだ証明書を作成しただけなので「検証保留中」となっている状態です。コンソール画面であれば「Route53でのレコードの作成」のボタンを押すだけなので非常に簡単なのですがこれをTerraformで行います。
image.png

route53.tfに以下のコードを追加します。

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で確認するとわかりやすいです。
image.png

for_eachfor を使ってるので少しわかりづらいかもしれませんが、以下の記事を参考にしました。
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]

コンソール画面で確認しても「発行済み」に変わっていることがわかります。
image.png

今回は以上です。次回はELB編ということで、ロードバランサを作成して独自ドメインでHTTPS接続できるようにしてみたいと思います!

参考リンク

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?