Terraform에 의한 DNS 인증 레코드 등록에서 "Invalid index"오류

10467 단어 TerraformAWS

유효하지 않은 색인 오류



이전에 실행한 적이 있는 코드를 바탕으로 오랫동안 ACM의 DNS 인증을 시도하면 "Error: Invalid index"오류가 발생했습니다. This value does not have any indices. → 이 값에는 인덱스가 없습니다. 그리고 화가났다.



코드는 이쪽. domain_validation_options[0] 의 부분이 안 되는 것 같습니다.
################################
# 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
  }

  tags = {
    Name = aws_route53_zone.public.name
  }
}

resource "aws_route53_record" "public_dns_verify" {
  name    = aws_acm_certificate.public.domain_validation_options[0].resource_record_name
  type    = aws_acm_certificate.public.domain_validation_options[0].resource_record_type
  records = [aws_acm_certificate.public.domain_validation_options[0].resource_record_value]
  zone_id = aws_route53_zone.public.id
  ttl     = 60
}

resource "aws_acm_certificate_validation" "public" {
  certificate_arn         = aws_acm_certificate.public.arn
  validation_record_fqdns = [aws_route53_record.public_dns_verify.fqdn]
}

원인



아래의 기사에 알기 쉽게 쓰고 있었습니다. domain_validation_options 의 형태가 바뀐 것 같습니다.
Terraform에서 AWS Certificate Manager 무료 인증서 발급

domain_validation_options 는 다음과 같은 형태로 반환됩니다. 확실히 본 느낌 list 타입입니다만, 3.0.0 이후에서는 set 타입으로 변경되고 있습니다.

해결 방법



앞의 기사를 참고로 domain_validation_options 의 개소를 for_each 에 재기입했습니다.for_each 의 사용법은 아직 잘 모르기 때문에, 이것으로 형 문제가 해소되고 있는 이유도 아직 배고프지 않았습니다만, 일단 움직이게 되었습니다. .
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]
}

다음 기사에 쓰여진 것처럼 tolist 에서 형식 변환하고 대처하는 방법도 있는 것 같습니다.
Terraform의 버전 업으로 Invalid index가 나왔을 때의 대처
  name    = tolist(aws_acm_certificate.public.domain_validation_options)[0].resource_record_name
  type    = tolist(aws_acm_certificate.public.domain_validation_options)[0].resource_record_type
  records = [tolist(aws_acm_certificate.public.domain_validation_options)[0].resource_record_value]

참고 링크



Terraform에서 AWS Certificate Manager 무료 인증서 발급

Terraform의 버전 업으로 Invalid index가 나왔을 때의 대처

Resource: acm_certificate

Resource: acm_certificate_validation

좋은 웹페이지 즐겨찾기