【Terraform】ACMでSSL証明書を作成しDNS認証するときに遭遇したエラーたち

エラー

 

Terraformを使ってACMでSSL証明書を発行しようとした際にいくつかエラーにはまったので、記事にしておきます。

 

ゴール

 

  • Terraformを使ってACMでSSL証明書を発行する
  • 認証方法はRoute53を使用したDNS認証

 

現状

 

現在のtfファイルの中身はこんな感じ。

※Cloudfrontで使用するためバージニア北部でSSL証明書を作成しています。

 

このまま terraform plan をすると、エラーをはきます。

 

エラー①:DNSレコードの定義でエラー

エラーの内容確認

 

 

インデックス系のエラーがでてますね。

 

DeepLでエラー文を翻訳してみると、、、

セットの要素は、その値によってのみ識別され、
選択するための個別のインデックスやキーを持たないため、
セットのすべての要素に対してのみ操作を行うことが可能です。

 

うーーん、いまいちよくわからない。。。

 

原因調査

 

エラー文で検索したところ、以下の記事を発見しました。

Terraform で AWS Certificate Manager 無料証明書を発行する(AWS Provider 3.0.0 以降の場合) | DevelopersIO
ACM の無料証明書発行、Terraform でやると面倒くさいかと思ってましたが、めっちゃ楽やん

 

aws provider 3.0.0 以降domain_validation_options がSet型で返ってくるようになりました。

それ以前はList型だったのでインデックスを指定できたのですが、
Set型になり順序付けされなくなったため、インデックスを指定不可となったようです。

 

コード修正

 

下記のように aws_route53_record のコードを修正しました。

 

for文でmap型へ変換して、それをname, type, records に設定しています。

詳しい解説は以下をご覧ください

 

これで、terraform planをしてみると、、、まだエラーが出ています。。。

 

エラー②:検証待ちのFQDN指定でエラー

エラーの内容確認

 

 

DNS検証用のレコードを指定している部分(validation_record_fqdns)でエラーになっています

どうやら aws_route53_record.cert もSet型で返ってきているみたいです。

 

コード修正

 

 

values関数を使用して、aws_route53_record.cert を Set→Listへ変換しています。

そして、Splat演算子([*])で aws_route53_record.cert 内のすべての要素からfqdnを取り出しています。

それらをflatten関数で囲むことで取り出したfqdnをリスト内に並べています。

 

これで無事 plan, apply両方通るコードになりました!

 

修正後のコード

 

最後に、修正後のコード全体を載せておきます

 

 

参考文献

 

Terraform で AWS Certificate Manager 無料証明書を発行する(AWS Provider 3.0.0 以降の場合) | DevelopersIO
ACM の無料証明書発行、Terraform でやると面倒くさいかと思ってましたが、めっちゃ楽やん
flatten - Functions - Configuration Language | Terraform | HashiCorp Developer
The flatten function eliminates nested lists from a list.
values - Functions - Configuration Language | Terraform | HashiCorp Developer
The values function returns a list of the element values in a given map.
【Terraform】 countからfor_eachへ書き換えたらスプラット演算子の動きが変わった - Qiita
いままでcountで記述していたものをfor_eachに直してみたところスプラット演算子の動きが変わったのでメモ状況いままではVPCのサブネットリソースをcountで複数作ってそれをoutput…

コメント

タイトルとURLをコピーしました