TerraformでACM証明書を作成してみた

TerraformにてACM証明書を作成する機会があったので、そのコードを共有いたします。とても簡単に作成することができました。
2019.09.25

こんにちは、大阪オフィスの数枝です。

先日、TerraformにてACM証明書を作成する機会があったので、そのコードを共有いたします。とても簡単に作成することができました。

前提条件

  • ALBで使用するACM証明書を発行します
  • 検証方法はEメールではなくDNSです
  • DNS検証ではCNAMEレコードを作成する必要がありますが、作成先のホストゾーンはRoute53で作成済みとします
  • www.example.comというドメイン名で証明書を取得します
  • Terraformとaws providerのバージョンは以下です
    • Terraform v0.12.8
    • provider.aws v2.27.0

コード

data aws_route53_zone route53-zone {
  name         = "example.com."
  private_zone = false
}

resource aws_acm_certificate cert {
  domain_name       = "www.example.com."
  validation_method = "DNS"
}

resource aws_route53_record cert_validation {
  zone_id = data.aws_route53_zone.route53-zone.zone_id
  name    = aws_acm_certificate.cert.domain_validation_options[0].resource_record_name
  type    = aws_acm_certificate.cert.domain_validation_options[0].resource_record_type
  records = [aws_acm_certificate.cert.domain_validation_options[0].resource_record_value]
  ttl     = 60
}

resource aws_acm_certificate_validation cert {
  certificate_arn = aws_acm_certificate.cert.arn
  validation_record_fqdns = [aws_route53_record.cert_validation.fqdn]
}

resource aws_lb_listener listener {
	//他パラメーター省略
  certificate_arn = aws_acm_certificate.cert.arn
}

解説

data aws_route53_zone route53-zone

data aws_route53_zone route53-zone {
  name         = "example.com."
  private_zone = false
}

Data Source はTerraform外(State外)で定義したリソースをTerraform内で参照可能にする機能です。今回の場合ホストゾーンをTerraform外で作成していますが、Terraform内で参照したかったのでこのaws_route53_zoneを使います。便利。zone_idnameが必須パラメーターです。

resource aws_acm_certificate cert

resource aws_acm_certificate cert {
  domain_name       = "www.example.com."
  validation_method = "DNS"
}

ACM証明書です。検証方法の指定はvalidation_methodで行ないますが、その中身については取り扱いません。

DNS検証を指定すると、Attributesでdomain_validation_optionsが返ってきます。これを次のリソースで活用します。

resource aws_route53_record cert_validation

resource aws_route53_record cert_validation {
  zone_id = data.aws_route53_zone.route53-zone.zone_id
  name    = aws_acm_certificate.cert.domain_validation_options[0].resource_record_name
  type    = aws_acm_certificate.cert.domain_validation_options[0].resource_record_type
  records = [aws_acm_certificate.cert.domain_validation_options[0].resource_record_value]
  ttl     = 60
}

ホストゾーン内にレコードを作成します。

ホストゾーンはData Sourceで参照可能にしたリソースのidを使います。あとは前段のaws_acm_certificateのAttributesdomain_validation_optionsの値の参照ばかりですね。

resource aws_acm_certificate_validation cert

resource aws_acm_certificate_validation cert {
  certificate_arn = aws_acm_certificate.cert.arn
  validation_record_fqdns = [aws_route53_record.cert_validation.fqdn]
}

作ったACM証明書とCNAMEレコードの連携をします。

resource aws_lb_listener listener

resource aws_lb_listener listener {
	//他パラメーター省略
  certificate_arn = aws_acm_certificate.cert.arn
}

ALBとACM証明書の紐付けは、aws_lb_listenercertificate_arn Argumentに証明書のARNを代入することでできます。

Resource: aws_lb_listener_certificate というリソースもありますが、こちらは二つ目以降の証明書をALBに紐づける際に使用するものとのことです。