terraformingとAWS CLIとTerraform importを使って、tfファイルを修正するところまでのメモ
福岡オフィスの梶原です。
AWS環境をTerraformで作成する機会があり、ちょこちょこ作っているとあれ?tfstateどこ行った?という状況に陥ってしまいました。(git xxxxx したのが原因です) さてどうしよう・・・と困っていたところ、terraformingなる、AWSの既存の環境からtfファイルを作るツールを見つけたので使ってみました。
対象のリソースはec2, s3, redshiftになります。 やり方は他のリソースでもあまり変わらないかと思いますのでメモ程度ですが公開します。
さて、サクサク行きます。
環境の準備
- Terraform
- terraforming
- json2hcl
Terraform
https://learn.hashicorp.com/terraform/getting-started/install.html#installing-terraform
ここら辺を参考にインストールをお願いします。
terraforming
$ gem install terraforming
https://github.com/dtan4/terraforming
json2hcl
tfファイルをjson形式にパースするツールです
$ curl -SsL https://github.com/kvz/json2hcl/releases/download/v0.0.6/json2hcl_v0.0.6_linux_amd64 \ | sudo tee /usr/local/bin/json2hcl > /dev/null && sudo chmod 755 /usr/local/bin/json2hcl $ json2hcl --version
https://github.com/kvz/json2hcl
terraformingでtfファイルを作る
terraformingは terraforming <<対象のリソース>> といった感じでtfファイルの内容が標準出力されますので、tfファイルを作成します。
環境変数の定義
$ export AWS_PROFILE=hogehoge $ export AWS_DEFAULT_REGION=ap-northeast-1
EC2
$ terraforming ec2 > ec2.tf
S3
$ terraforming s3 > s3.tf
Redshift
$ terraforming rs > rs.tf
Terraform Import
ツールとしては、tfsteteを作成するコマンドがありterraforming --tfstate でtfstateファイルができるはずなのですが、うまく動かなかったのでterraform純正のImportコマンドを使ってみました。かといってIDなどを指定しないといけないのがリソースも多くてつらかったのでtfファイルをパースして、AWS CLIでID取得してパラメータに使用してImportを実施しています。
準備
$ tee provider.tf <<EOF variable "region" { type = "string" default = "$AWS_DEFAULT_REGION" } provider "aws" { profile = "$AWS_PROFILE" region = "\${var.region}" } EOF $ terraform init
EC2
$ json2hcl -reverse < ec2.tf \ | jq -rc '.resource[].aws_instance[][][].tags[].Name' \ | xargs -L 1 -I{} aws ec2 describe-instances --filter "Name=tag:Name,Values={}" \ | jq -rc '.Reservations[].Instances[] | (.Tags[] | select(.Key=="Name").Value) + " " + .InstanceId' \ | xargs -I{} sh -c "terraform import aws_instance.{}"
※注意 Nameタグを元にインスタンスIDを抽出しています。一意のIDの決め方は--filter部分をカスタマイズしてください。
S3
$ json2hcl -reverse < s3.tf \ | jq -r '.resource[][][][][].bucket' \ | xargs -I{} sh -c "terraform import aws_s3_bucket.{} {}"
Redshift
$ json2hcl -reverse < rs.tf \ | jq -r '.resource[][][][][].cluster_identifier' \ | xargs -I{} sh -c "terraform import aws_redshift_cluster.{} {}"
Terraform Plan
$ terraform refresh $ terraform plan
tfファイルの修正
terraformingではすべてのプロパティなどは対応していないので、 terraform planで差分がでなくなるまで、tfファイルを修正していきます。
まとめ
結局tfファイルを修正する部分は残ってしまうのですがリソースによってはほぼ変えなくていいtfファイルも生成されますので、0から記載するのにくらべてとても楽でした。 オープンソースですので、もし個別に対応したらpullリクエストやフォークをしようと思ってます。
参考
terraformingとTerraformを使って、EC2をVPCからVPCへ移行を行う