AWSコンソールから手動で作成した環境をterraformで後追いするために必要なこと、やることをメモします。 コマンドの詳しい説明や使い方は省略します。
terraform
terraform init
: 作業ディレクトリを初期化します。terraform plan
: 差分確認ようです。terraform import
: 既存環境をtfstateにインポートします。terraform state rm
: インポートを取り消したいときに使います。
terraform import
terraformはtfstateと呼ばれるファイルにterraformの実行後の環境を保存しています。
既存の環境をtfstateに書き込むことで、terraform plan
を実行したときに差分がでなくなります。
あくまでtfstateに現在の状態を書き込むだけなので、 xxx.tf
などのコードを作成してくれるわけではありません。
terraform import
はリソースひとつひとつに対して実行していく必要があります。
下記のような感じで指定します。
$ terraform import <terraformのmodule名>.<リソース名(変数名)> <リソースを特定するIDなど>
ex)
$ terraform import aws_cloudwatch_log_group.test_group yada
リソースを特定するIDなど
は、moduleによって指定するものが違って、nameだったりidだったりします。
terraform
のドキュメントの最後のところに参考例があります。
実際に指定する値はAWSコンソールから取ってきます。
terraform state rm
terraform import
でインポートしたものをtfstateから削除します。
tfstateからの削除なので、AWS環境には影響ありません。
terraforming
terraforming
は、 terraform
のコードを書き出してくれるものです。
terrafrom
とは別物なので、別途インストールする必要があります。
terraform import
と違って、リソースの種類を指定してそのすべてのコードを出力します。
例えばセキュリティグループを指定したら、アカウントに紐づくすべてのセキュリティグループを取ってきます。
便利ですが、対応していないリソースも多いのですべてを terraforming
任せにするわけにもいきません。
また、 terraforming
には、 tfstate
を管理するオプションもあります。
terraform import
とどっちを使うかは、 既存の環境のどれくらいを terraform
化したいかによると思います。
流れ
今回は、既存AWS環境のうち一部を terraform
化したいので、
terraform import
を使った方法を想定します。
terraform init
でtfstateを作成- リバースエンジニアリング
terraforming
に対応しているものterraforming
に対応していないもの
といった感じです。
terraform init でtfstateを作成
特に気をつけることもないので割愛
リバースエンジニアリング
terraforming
に対応しているものいないものがあるのでそれぞれ対応します。
対応しているもの
流れ
- terraforming でコードの書き出し
- 作成したtfファイルの中身を確認・修正
- terraform import
- 差分確認
terraforming でコードの書き出し
リソースごとにコードを書き出していきます。
例)
$ terraforming sg > sg.tf
作成したtfファイルの中身を確認・修正
resource "aws_cloudwatch_log_group" "foo" { name = "Bar" }
terraform import
terraforming
には、tfstateも一緒に更新してくれるオプションがありますが、
今回は一部だけをterraform化するため、個別にインポートする方法を取ります。
差分確認
terraform plan
で差分の確認をします。
差分が出るようならでなくなるまで修正します。
対応していないもの
まず、リソース用のtfファイルを用意して 下記のように空でリソース名(変数名)を書いておきます。
resource "aws_cloudwatch_log_group" "foo" { }
このリソース名(変数名)を使って terraform import
します。
インポートが成功したら、差分を確認して、差分が出なくなるまで修正を繰り返します。