Linux環境でTerraformerを使って既存AWSリソースをコード化してみる
こんにちは。今回は既存のAWSリソースの設定をterraformのtfファイルへ書き出してくれるterraformerについて書いてみたいと思います。
Terraformer とは
Google Cloud Platform が OSS で提供しているツールで、各種環境の情報を読み取って設定情報を Terraform の tf ファイルにしてくれます。AWS や GCPなどのメジャーなクラウドサービスだけではなく、datadog やKubernetes、GitHub などのクラウドサービスにも対応しています。対応している環境については公式のページを参照してください。
事前準備
AWS 環境に対して Terraformer を使うには事前に Terraform と AWS CLIを使えるようにしておく必要があります。AWS CLIにはプロファイルを作成しアクセスキーIDとシークレットアクセスキーを登録しておいてください。これらのインストール、設定については今回は対象ではないので省略します。
インストール
公式の手順で大丈夫です。
環境変数 PROVIDER で Terraformer で設定をコード化する環境のプロバイダーを設定します。今回の場合はAWSが対象なので aws を設定します。
export PROVIDER=aws
curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
chmod +x terraformer-${PROVIDER}-linux-amd64
sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
Terraformer実行前の事前準備
init.tf ファイルに provider “aws” {}
を書き込み、terraform init
を実行します。実行後下記のようなメッセージが出ていれば事前準備は完了です。
sugiyama@RRC74-1:~/test$ echo 'provider "aws" {}' > init.tf
sugiyama@RRC74-1:~/test$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v4.36.1...
- Installed hashicorp/aws v4.36.1 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Terraformerの実行
TerraformerでAWS環境の設定を取得するコマンドは以下となります。
terraformer import aws --resources=<リソース名>
--resources
で取得するAWSのサービスを指定します。とりあえず全部取得したい場合は *
を指定します。--excludes
で除外することもできます。例えば ec2 の設定を取得する場合は以下となります。
sugiyama@RRC74-1:~/test$ terraformer import aws --resources=ec2_instance
2022/10/23 17:55:08 aws importing default region
2022/10/23 17:55:08 aws importing... ec2_instance
2022/10/23 17:55:09 aws done importing ec2_instance
2022/10/23 17:55:09 Number of resources for service ec2_instance: 1
2022/10/23 17:55:09 Refreshing state... aws_instance.tfer--i-0585xxxxx5dxxxx75_T-XXX-WEB-XXXX
2022/10/23 17:55:09 Filtered number of resources for service ec2_instance: 1
2022/10/23 17:55:09 aws Connecting....
2022/10/23 17:55:09 aws save ec2_instance
2022/10/23 17:55:09 aws save tfstate for ec2_instance
複数のリソースを指定する場合はカンマ区切りにします。ec2とvpcの場合は以下のようになります。
sugiyama@RRC74-1:~/test$ terraformer import aws --resources=ec2_instance,vpc
2022/10/23 17:55:01 aws importing default region
2022/10/23 17:55:02 aws importing... ec2_instance
2022/10/23 17:55:02 aws done importing ec2_instance
2022/10/23 17:55:02 aws importing... vpc
2022/10/23 17:55:02 aws done importing vpc
2022/10/23 17:55:02 Number of resources for service ec2_instance: 1
2022/10/23 17:55:02 Number of resources for service vpc: 3
2022/10/23 17:55:02 Refreshing state... aws_vpc.tfer--vpc-01dfxxxxxxxxxc006
2022/10/23 17:55:02 Refreshing state... aws_vpc.tfer--vpc-0788xxxxxxxxx0fc9
2022/10/23 17:55:02 Refreshing state... aws_vpc.tfer--vpc-05f4c40ece0b78ed6
2022/10/23 17:55:02 Refreshing state... aws_instance.tfer--i-05859cxxxxxxxxc75_T-xxx-WEB-xxxx
2022/10/23 17:55:03 Filtered number of resources for service ec2_instance: 1
2022/10/23 17:55:03 Filtered number of resources for service vpc: 3
2022/10/23 17:55:03 aws Connecting....
2022/10/23 17:55:03 aws save ec2_instance
2022/10/23 17:55:03 aws save tfstate for ec2_instance
2022/10/23 17:55:03 aws save vpc
2022/10/23 17:55:03 aws save tfstate for vpc
指定できるリソースは以下のコマンドで取得できます。
terraformer import aws list
terraform import
コマンドの実行に成功すると作業ディレクトリに以下のような構成でtfファイル、tfstateファイルが作成されます。以下の例はec2_instance、vpcを指定した場合になります。
./
├── generated
│ └── aws
│ ├── ec2_instance
│ │ ├── instance.tf
│ │ ├── outputs.tf
│ │ ├── provider.tf
│ │ └── terraform.tfstate
│ └── vpc
│ ├── outputs.tf
│ ├── provider.tf
│ ├── terraform.tfstate
│ └── vpc.tf
└── init.tf
以上がTerrafromerで設定を取得する場合の基本となります。
フィルタリング
一部の環境の設定だけ取得したい時があると思います。その場合にリソースIDや属性でフィルタリングできる --filter
オプションがあります。
タグを指定してフィルタリングする
terraformer import aws --resource=ec2_instance,vpc,subnet --filter="Name=tags.Service_Name;Value=RMSS"
VPC IDでフィルタリングする
terraformer import aws --resource=ec2_instance,vpc,subnet --filter="vpc-0e9xxxxxxx729"
プロファイル
terraformerを実行するとき、使用するAWS CLIプロファイルを指定できる --profile
オプションがあります。
aws-backupというプロファイルを指定する
terraformer import aws -r=ec2_instance --profile=aws-backup
取得したtfファイルを他環境で使用するときの注意
取得したリソースIDがtfファイルにべた書きされていたり、tfstateファイルから取得するようになっているため、他環境で使う場合は各リソースの依存関係がある部分は書き換えなければいけません。バックアップ目的ではなく、例えば別のAWSアカウントに環境を作りたいといった場合、Terraformerで取得したものはtfファイルを作る際のたたき台として使用したほうがいいと思います。
まとめ
以上、簡単ですがTerraformerの使用方法について紹介しました。Terraformerはコンソールから手作業で設定したリソースをTerraformでコード化する際にどのように書いたらいいのかという場合に非常に参考になる有用なツールです。このドキュメントがインフラのIaC化を進める一助になると幸いです。
Discussion