なになれ

IT系のことを記録していきます

Terraform1.5で追加されたimportブロックを試す

importブロックは宣言的に既存のリソースをTerraform管理下にできるTerraformの構文です。今まではterraform import で既存のリソースをTerraform管理下にできましたが、一つ一つのリソースしかインポートできずに面倒でした。また、今まではできなかったHCLのコードを生成することも可能になっています。
developer.hashicorp.com

実践

EC2のインスタンスAWSマネジメントコンソールから作成し、それをimportブロックでTerraform管理下にします。

まず、importブロックのコードを書きます。toにはインポート先となるresourceブロックのIDを指定します。
idにはインポートする個々のリソースを識別するIDを設定します。これはリソースの種類によって異なります。EC2の場合はインスタンスIDになります。

imports.tf

import {
  to = aws_instance.example
  id = "i-00000000000000000"
}

この状態でterraform planを実行すると、toにあたるインポート先がないためにエラーになります。そして、terraform plan -generate-config-out=generated.tfでコードを生成することができる旨のメッセージが表示されます。親切です。これに従って、HCLのコードを生成します。

EC2の場合は、コードを生成すると、設定がコンフリクトしている旨のエラーが出力されます。

│ Error: Conflicting configuration arguments
│
│   with aws_instance.example,
│   on generated.tf line 14:
│   (source code not available)
│
│ "ipv6_address_count": conflicts with ipv6_addresses
╵
╷
│ Error: Conflicting configuration arguments
│
│   with aws_instance.example,
│   on generated.tf line 15:
│   (source code not available)
│
│ "ipv6_addresses": conflicts with ipv6_address_count

ipv6_address_countipv6_addressesはどちらか一方あればよい値です。コード生成をした場合はどちらも出力されてしまいます。
どちらかの記述を削除して、terraform planterraform applyを実行します。そうすると、importすることができます。

コードの生成は完璧ではありませんが、かなりの部分のコードを補完してくれるため、便利です。

感想

terraform importで行っていた既存リソースのインポートをTerraformのコードでできるようになり、操作性がよくなったと思います。また、コードの生成も便利なので、これからはimportブロックを使った書き方を採用していきたいと思います。

おわりに

Udemy講座を公開しています。AWSやTerraformの入門から実践的な内容までを学べるものになっています。ぜひ受講ください。