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_count
とipv6_addresses
はどちらか一方あればよい値です。コード生成をした場合はどちらも出力されてしまいます。
どちらかの記述を削除して、terraform plan
とterraform apply
を実行します。そうすると、importすることができます。
コードの生成は完璧ではありませんが、かなりの部分のコードを補完してくれるため、便利です。
感想
terraform import
で行っていた既存リソースのインポートをTerraformのコードでできるようになり、操作性がよくなったと思います。また、コードの生成も便利なので、これからはimportブロックを使った書き方を採用していきたいと思います。
おわりに
Udemy講座を公開しています。AWSやTerraformの入門から実践的な内容までを学べるものになっています。ぜひ受講ください。