0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

TerraformによるDNS認証のレコード登録で「Invalid index」のエラー

Last updated at Posted at 2021-05-31

Invalid index のエラー

以前動かしたことがあるコードを元にして久々にACMのDNS認証をしようとすると、「Error: Invalid index」のエラーが起こりました。「This value does not have any indices.」 → この値にはインデックスがありません。と怒られています。

image.png

コードはこちら。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

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?