LoginSignup
6
4

TerraformによるAWS Certificate Manager(ACM)からの証明書取得とドメイン検証

Last updated at Posted at 2018-10-11

掲載したコードをみてくださいで終わっても良いのですが、まぁそれではあんまりだと言うことで。
まぁ、Terraformの公式サイトと大差ありませんがコメントは入ってるよと言うくらいです。

※ 2024-02-18 検証用レコードの登録方法を修正しました

前提

  • ワイルドカードはやりません
  • SANの利用も同様にしません
  • なので、対象はFQDN(サブドメイン付き)1つのみ

補足

ワイルドカードの証明書は便利ですが、万が一の場合利用する全サービスに影響が及ぶことを考えれば利用すべきではないと思っています。
特に、ACMのようにマネージドで自動的に更新されるのにワイルドカード証明書を使う必要はないと思います。

セキュリティのために証明書を利用するのに、セキュリティを損ねる運用を採用するのは本末転倒だと思っています。

実際のスクリプト


# zone apex domain:サブドメインを含まないものを書く
variable "aws_acm_domain_name" {
  description = "Domain Name"
  default = "example.com"
}
# 取得対象のFQDN(サブドメイン付き)
variable "aws_acm_sub_domain_name" {
  description = "Sub Domain Name"
  default = "ex.example.com"
}
# 検証方法(mailはterraform外部で手作業が必要なので非推奨)
variable "aws_acm_validation_method" {
  description = "validation method"
  default = "DNS"
}
# tagはお好みでどうぞ
variable "aws_acm_env_tag" {
  description = "environment tag"
  default = "sample"
}
# 証明書発行リクエスト
resource "aws_acm_certificate" "cert" {
  domain_name       = "${var.aws_acm_sub_domain_name}"
  validation_method = "${var.aws_acm_validation_method}"

  tags {
    Environment = "${var.aws_acm_env_tag}"
  }

  lifecycle {
    # lifecycleにこれを入れておくのが推奨されています
    create_before_destroy = true
  }
}

# Route53で管理されているドメインの情報を持ってきます
data "aws_route53_zone" "zone" {
  name = "${var.aws_acm_domain_name}"
  private_zone = false
}

# DNSによる検証用レコードの登録
resource "aws_route53_record" "cert_validation" {
  zone_id = "${data.aws_route53_zone.zone.id}"
  for_each = {
    for dvo in aws_acm_certificate.cert.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]
  type    = each.value.type
  ttl     = 60
}

# 検証
resource "aws_acm_certificate_validation" "cert" {
  certificate_arn = "${aws_acm_certificate.cert.arn}"
  validation_record_fqdns = ["${aws_route53_record.cert_validation.fqdn}"]
}

利用

certのarnを利用します

  resource "aws_lb_listener" "alb" {
    # snip...
    certificate_arn   = "${aws_acm_certificate_validation.cert.certificate_arn}"
  }
6
4
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
6
4