🦔

terraform plan -generate-config-outの使い方

2023/08/17に公開

terraform plan -generate-config-outの使い方

Webコンソールからった作ったALBをterraform管理にしたかった。手順はこんな感じ。

  1. 生成したいリソース用にimportブロックを書く
  2. terraform importを実行する
  3. terraform plan -generate-config-out=generate.tfを実行する
  4. 1で書いたimportブロックを消す

つまり、Webコンソールで作ったリソースをterraformで管理すると宣言し(手順1)、terraformの管理下に置き(手順2)、tfファイルを生成し(手順3)、実際にtfファイルが作成されたことで不要になった宣言を消す(手順4)。

1. importブロックを書く

terraformのドキュメントに各リソースのimportブロックの書き方が書いてあるので、これをmain.tfに書く。例えば、ALBの例だと以下のように書けと書いてある。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lb.html#import

import {
  to = aws_lb.bar
  id = "arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188"
}

このときresouceブロックは書かなくて良い。

terraform plan -generate-config-outでtoに書いてある名前でresouceブロックが生成される。↑の例だと resouce "aws_lb" "bar" {...} のようなresouceブロックが生成される。

idは見た目通りarnをAWSのWebコンソールからコピーしてくればよい。

2. terraform importを実行する

↑のimportブロックで書いたarnを指定してterraform importを実行する。

$ terraform import aws_lb.bar arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-load-balancer/50dc6c495c0c9188

これでWebコンソールで作成したリソースをterraformに管理下に置かれる。しかし、tfファイル自体は作成されていないので次の手順でtfファイルを生成する。

3. terraform plan -generate-config-out=generate.tfを実行する

generate.tfは好きな名前に変えればよい。例えば、albをterraformで管理したいならalb.tfとかだろうか。

生成されたら好きに編集すれば良い。

4. importブロックを消す

tfファイルが出来てしまえば、もうimportブロックはいらない。1で書いたimportブロックを削除して手順は完了する。

terraform管理下に入れてしまったあとに取り消したい場合

試行錯誤のうちに間違えて管理下に入れてしまうことがあるかも。そういうときはterraform state rm aws_lb.bar とすれば管理下から外すことができる。

生成されたファイルを修正する

生成されたファイルはsecurity groupとかsubnetの値とかがベタ書きになっているが、当然それらもterraformで管理しているはずなので、生成されたファイルを修正してやる必要がある。しかし、ベタ書きを置き換えていくときに間違うかもしれない。適当に修正したらterraform planを叩いて変更がないことを確認しながら作業すると良い。

GitHubで編集を提案

Discussion