Invalid index のエラー
以前動かしたことがあるコードを元にして久々に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 無料証明書を発行する