-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.tf
56 lines (48 loc) · 1.66 KB
/
main.tf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
// All hostnames given will be included in the SAN field of the certificate,
// but the ACM API automatically includes the domain_name in the SAN field of the cert,
// and *excludes* it in the response to acm.DescribeCertificate, so we split them here.
locals {
common_name = var.hostnames[0]
subject_alternative_names = slice(var.hostnames, 1, length(var.hostnames))
}
// For generating the DNS records, we convert hostnames into their zone name.
// This makes assumptions about the zone layout
locals {
host_to_zone_regex = "/^(?:.*\\.)?([^.]+\\.[^.]+)$/"
}
data "aws_route53_zone" "parent" {
for_each = toset(var.hostnames)
name = replace(each.value, local.host_to_zone_regex, "$1")
private_zone = false
}
resource "aws_acm_certificate" "this" {
domain_name = local.common_name
subject_alternative_names = local.subject_alternative_names
validation_method = "DNS"
}
resource "aws_route53_record" "validation" {
for_each = {
for dvo in aws_acm_certificate.this.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
zone_id = data.aws_route53_zone.parent[each.key].id
name = each.value.name
records = [each.value.record]
type = each.value.type
ttl = 60
}
resource "aws_acm_certificate_validation" "this" {
certificate_arn = aws_acm_certificate.this.arn
validation_record_fqdns = [for record in aws_route53_record.validation : record.fqdn]
}