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へ移行を行う

terraformingとTerraformを使って、EC2をVPCからVPCへ移行を行う