terraform importメモ

terraform importは、既存のリソースをTerraformの管理下に置くためのコマンドです。

マネジメントコンソールから手動で作成したリソースはその時点ではterraform管理下に無く、差分として検出してくれないので、importコマンドで管理下に追加してあげます。

具体的な手順は以下の2通りあります。

  • CLI
  • importブロック
  • インポートのイメージは下記
    • terraform importで管理外のリソースを管理下に置く
    • terraform planを実行するとインポートされた分の差分が出る
    • 手動でリソース定義を記述して差分が出ないように合わせる

CLIから作成する方法

  • フォーマット
    • terraform import {リソースタイプ}.{リソース名} "{リソースID}"
    • ex) terraform import aws_instance.my_instance i-1234567890abcdef0
      • リソースタイプ:terraformによって予め決められたキーワードを設定します
      • リソース名:一意に振られたそのリソースを識別する名前。プロジェクトのの命名規則に従って設定
      • リソースID:設定したリソースタイプによって指定の仕方が異なるので、適時どんな感じに指定するのかを調べてください。例えばEC2インスタンスだったら管理したい対象のインスタンスIDを指定します。
  • インポートが成功してもソース上は特に変更されないので、terraform planで差分を確認してソースを合わせていきます。

importブロックから作成する方法

  • フォーマット
    • import { to = {リソースタイプ}.{リソース名} id = "{リソースID}" } resource "{リソースタイプ}" "{リソース名}" { database_name = "jpn" name = "sips_datalake_mysql_sips_inventories" }
  • 任意のtfファイル内にimportブロックを追加して、予めインポートされるリソースのresourceブロックを作成しておきます。
  • terraform applyをすることでインポートが完了される(planではだめ)
  • リソースタイプそれぞれに必須のプロパティが存在するので、それらを予め指定しておかないとエラーになります。(指定がなければご丁寧に教えてくれます)
  • インポートし終わったらimportブロックは不要になるので削除しましょう。あえて残すのはインポートした事をドキュメント的に残すケースのみだと思います。

自動でリソースを定義

  • importブロックを使用
  • terraform plan コマンドにHCLコード自動生成オプション -generate-config-out を付けるとimportリソースに対応する .tf を自動生成してくれます
$ terraform plan -generate-config-out=〇〇.tf

個人的なベストプラクティス

  • importブロックは一度terraform applyをしないといけないのがなんか怖いので、terraform管理下への取り込み自体はCLIでやるのを推奨
    • 取り込み以外にも何か作業をしていたりするとそれもまとめて適用されてしまう可能性があるのでリスクがある
  • その後にリソース定義を自動生成させて、そこからterraform planを流して差分を手動で調整するのがいい
  • その後に新しく作られた.tfの中身だけ適切なリソース.tfにコピペしとく