LoginSignup
20
10

More than 5 years have passed since last update.

TerraformでACMの証明書を取得する方法

Last updated at Posted at 2018-06-26

AWS Certificate Manager (ACM) で証明書を発行する方法は2017年の11月までは
メールアドレスによる認証が必要でした。現在ではDNSを使ったドメイン認証が出来るように
なっています。
Route53でDNSを管理している場合にはより簡単にACMで証明書を発行する
ことが出来るようになしました。
今回はACMの証明書発行リクエストとRoute53への検証レコードをTerraformのみで実現
してみます。

ACMのリクエストの作成

ACMでの証明書発行リクエストにはaws_acm_certificateのリソースを
作成します。
validation_method = "DNS"と定義することにより、DNSを使ったドメイン認証が使われます。

acm.tf
resource "aws_acm_certificate" "example-cert" {
  domain_name = "example.net"
  subject_alternative_names  = ["foo.example.net"]
  validation_method = "DNS"
  tags {
    Environment = "production"
  }
}

上記の例のファイルをterraform applyして実行するとdomain_validation_optionsというattributeにドメイン認証に必要な情報が格納されたstateが出来ます。
terraform consoleで内容を確認すると以下のような情報が得られます。

$ terraform console
> aws_acm_certificate.example-cert.domain_validation_options
[
  {
    "domain_name" = "example.net"
    "resource_record_name" = "_22222222222222222222222222222222.example.net."
    "resource_record_type" = "CNAME"
    "resource_record_value" = "_dddddddddddddddddddddddddddddddd.acm-validations.aws."
  },
  {
    "domain_name" = "foo.example.net"
    "resource_record_name" = "_33333333333333333333333333333333.foo.example.net."
    "resource_record_type" = "CNAME"
    "resource_record_value" = "_eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.acm-validations.aws."
  },
]

これらの情報をもとにRoute53のレコードを作成できれば、DNSでの検証を行うことが出来ます。

Route53での検証用レコードの作成

前段落で得た情報をもとにRoute53でレコードを作成してDNSによる検証を行います。
aws_route53_recordのリソースを使います。1つ1つレコードをする記述を書くことも出来ますが、
countやlookupを使うことにより、SANがあった場合でも一回の定義で複数のレコードを作成すること出来ます。

route53.tf
resource "aws_route53_record" "example_acm_public" {
  count = "${length(aws_acm_certificate.example-cert.domain_validation_options)}"
  zone_id = "${var.example_zone_id}"
  name = "${lookup(aws_acm_certificate.example-cert.domain_validation_options[count.index],"resource_record_name")}"
  type = "${lookup(aws_acm_certificate.example-cert.domain_validation_options[count.index],"resource_record_type")}"
  ttl = "300"
  records = ["${lookup(aws_acm_certificate.example-cert.domain_validation_options[count.index],"resource_record_value")}"]
}

まとめ

以上がTerraformでACMの証明書のリクエストとDNS認証を行う方法でした。
発行された証明書はaws_alb_listenerのcertification_arnに以下のように設定することが出来ます。
またメールアドレスで認証を行っていたときのようにデータソースのaws_acm_certificateから
arnを取得することも出来ます。

alb.tf
...
data "aws_acm_certificate" "example-acm" {
  domain   = "example.net"
}

resource "aws_lb_listener" "front_end" {
  load_balancer_arn = "${aws_lb.front_end.arn}"
  port              = "443"
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-2015-05"
  certificate_arn   = "${aws_acm_certificate.example-cert.arn}"
  #certificate_arn   = "${data.aws_acm_certificate.example-acm.arn}"

  default_action {
    target_group_arn = "${aws_lb_target_group.front_end.arn}"
    type             = "forward"
  }
}
...

ドメイン認証が行える前はメールアドレスで認証を行う必要があり、terraformで管理することは
出来ませんでしたが、DNS認証を使うことにより、ACMでの証明書発行もterraformのコードで
管理出来るようになったのは大きなメリットだと思います。

20
10
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
20
10