kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

手動で作成したAWS環境をterraformで後追い

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 でコードの書き出し
  • 作成したtfファイルの中身を確認・修正
  • terraform import
  • 差分確認

terraforming でコードの書き出し

リソースごとにコードを書き出していきます。

例)

$ terraforming sg > sg.tf

作成したtfファイルの中身を確認・修正

  • いらないものは削除
  • 必要ならリソース名(変数名)を変更
    • terraforming が勝手に命名するので分かりやすいとは言えない
    • 自分の考える命名規則とあってないなど
    • 下記の foo の部分のこと
resource "aws_cloudwatch_log_group" "foo" {
  name = "Bar"
}

terraform import

terraforming には、tfstateも一緒に更新してくれるオプションがありますが、 今回は一部だけをterraform化するため、個別にインポートする方法を取ります。

差分確認

terraform plan で差分の確認をします。 差分が出るようならでなくなるまで修正します。

対応していないもの

まず、リソース用のtfファイルを用意して 下記のように空でリソース名(変数名)を書いておきます。

resource "aws_cloudwatch_log_group" "foo" {
}

このリソース名(変数名)を使って terraform import します。 インポートが成功したら、差分を確認して、差分が出なくなるまで修正を繰り返します。