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

# Invalid index のエラー

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402286/f81b3a3e-abc0-e8c7-9db0-412ef46fd7c6.png)

コードはこちら。`domain_validation_options[0]` の箇所がダメみたいです。

```terraform
################################
# 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 無料証明書を発行する](https://dev.classmethod.jp/articles/terraform-aws-certificate-validation/)

>domain_validation_options は以下のような形で返されます。ぱっと見た感じ list タイプなのですが、3.0.0 以降では set タイプに変更されています。


# 対処方法

先の記事を参考に `domain_validation_options` の箇所を `for_each` に書き換えました。
`for_each` の使い方はまだよくわかっていないので、これで型問題が解消されている理由もまだ腹落ちしていませんが、とりあえず動くようになりました。。

```terraform
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が出た時の対処](https://qiita.com/fullsat_/items/a2843ec5fe36484f8e19)

```terraform
  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 無料証明書を発行する](https://dev.classmethod.jp/articles/terraform-aws-certificate-validation/)

[TerraformのバージョンアップでInvalid indexが出た時の対処](https://qiita.com/fullsat_/items/a2843ec5fe36484f8e19)

[Resource: acm_certificate](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate)

[Resource: acm_certificate_validation](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate_validation)