【Terraform】importブロックを利用して既存リソースを爆速import【v1.5.0】

10月 11, 2023

どもども、6月から新米パパになりました。寝不足ですが頑張って書いていきます。


つい先日、terraform v1.5のbeta版が公開されました。これまでのterraformの常識を覆す驚きの追加要素があったので今回はそちらを紹介したいと思います。


その名も"importブロック"です!

terraform importの辛み

さて、これまでterraformを利用してきた皆様なら共感いただけるかと思いますが、既存リソースのterraform importってぶっちゃけ面倒ですよね。

resourceブロックを準備して…importコマンドを準備して…

もちろんterraformerのようなサードパーティツールを利用すればある程度簡略化されます。しかし、セキュリティやバージョン管理などの観点からサードパーティツールの利用はできるだけ控えたいものです。

そこで今回はimportブロックを利用してサクサクimportしてみたいとおもいます!

terraformバージョンの変更

まず、terraformバージョンを1.5.0に切り替えておきます。tfenvを利用している場合は

$ tfenv list-remote
...
1.5.0-beta2
1.5.0-beta1
...

でインストール可能なバージョンを確認し、

$ tfenv install 1.5.0-beta2
$ tfenv use 1.5.0-beta2

で切り替え可能です。その他のバージョン管理ツールをご利用の場合にも、それぞれの方法でバージョンを事前に切り替えておいてください。

その他providerやinitなどterraformが利用できるようになるまでの準備を済ませておきましょう。

importブロックを利用してみる

まずはterraformで管理されていないS3バケットを用意します。

$ aws s3 mb s3://terraform-generate-config-sample

続いて上記S3バケットを定義するresourceブロックを用意します。

resource "aws_s3_bucket" "generate-config" {
  bucket              = "terraform-generate-config-sample"
}

ここまではこれまでのterraform importと同じですね、ここからいよいよimportブロックを利用します。

import {
  id = "terraform-generate-config-sample" 
  to = aws_s3_bucket.generate-config         
}

importブロックにしているのは既存リソースIDとどのresourceブロックを対象とするか、たったこれだけです!

あとはapplyするだけでimportが完了します。

<省略>
Plan: 1 to import, 0 to add, 1 to change, 0 to destroy.

うまくいけばこのようにPlan結果に"import"という項目が明記され、実行するとimportされます。terraform state listなどで結果を確認いただければと思います!

terraform importの敷居がグッと下がったことがわかりますね!


しかし、これだけではありません。今回のバージョンではterraform importをさらに爆速にする驚きの新機能があります。

terraform plan でresourceブロックを書き出す

importブロックは確かに革命的ですが、やはりネックなのが対象とするresourceブロックをあらかじめ用意する必要があるという点です。


しかし今回のバージョンからはこのresourceブロックさえも自動作成することができます。


それがterraform planに新しく追加されたオプションである"-generate-config-out"です。


例えばimportブロックを残したまま、s3.tfとterraform stateを削除し、下記コマンドを実行してみてください。

$ terraform plan -generate-config-out=s3.tf(出力先ファイル名)

なんとresourceブロックが記載されたtfファイルが自動作成されます。

# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform from "terraform-generate-config-sample"
resource "aws_s3_bucket" "generate-config" {
  arn                 = "arn:aws:s3:::terraform-generate-config-sample"
  bucket              = "terraform-generate-config-sample"
<中略>
}

このままでももちろんterraform applyすればimportされますが、デフォルト設定や不要な項目は削除しておくといいでしょう。

terraform…新時代が来ましたね!

さいごに

昨今IaC化への波が加速する中、既存の巨大アーキテクチャをどのようにコード化していくかはエンジニア組織における大きな課題だと思います。


進化したTerraformを用いてよりスピーディーなコード化を目指したいところですね!


最後まで読んでいただきありがとうごいました。

Terraform

Posted by CY