がじぇ

お金と家電とプログラミングのブログ

【AWS】構成情報をぶっこ抜くterraformerは運用効率化の救世主になるのか?

こんにちわ

がじぇったー (@hackmylife7) | Twitter


です。

一度構築した環境をterraformのcodeに落とし込むのはかなり骨が折れますよね。
エンタープライズレベルの環境でリバースエンジニアリングをしながらterraform化を行うのは、
正直難しいという実感です。

かといって、最初からterraformでcodeを書きながらリソースを作るのは時間がかかります。

マネジメントコンソールでポチッとリソース作成できるのに、code書いてPull Requestを通さないといけないんだからそりゃそうですよね。
しかし、マネジメントコンソールでぽちぽちを続けると永遠に自動化できないですし、サービスが大きくなるにつれて工数がリニアに増えて行きます。


しかし、terraformerというツールを使うと既存のAWS環境をterraformのcodeに
変換できるみたいなので検証しようと思います。





TL;DR(要約)


初期構築時に作る際はマネジメントコンソール上でリソースを作り、
運用フェーズにはいったらterraformerでterraform化を行う、という使い方ができそうです。

小規模なサービスならterraformerでterraform化を行い、その後は、terraformで運用することは現実的だと思います。

ただ、エンタープライズレベルのサービスで使うとなるとそもそも存在するリソースが多いと思うので、terraformerを使ってcodeに落とした後、被って書かれている箇所をfor文でまとめたり、変数化したり、tfstateをs3においたり等、リファクタリングする手間がまだまだかかると思います。

terraformerとは何か?

githubには以下のように書かれています。
既存のクラウド環境をTerraform化できるツールです。google のエンジニアに寄って書かれているのでクオリティは高いでしょう。

A CLI tool that generates tf and tfstate files based on existing infrastructure (reverse Terraform).

Disclaimer: This is not an official Google product
Status: beta - we still need to improve documentation, squash some bugs, etc...
Created by: Waze SRE

ちなみにソースはこちらで公開されています。

github.com

使用イメージ

こちらの動画が公開されてました。
asciinema.org


install

macbrew install でterraformerをインストールできます

brew install terraformer

環境変数の設定

Credential情報を環境変数にセットします。

~/tmp/terraformer
❯ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX

~/tmp/terraformer
❯ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXX

~/tmp/terraformer
❯ export AWS_DEFAULT_REGION=ap-northeast-1

初期化

~/tmp/terraformer
❯ echo 'provider "aws" {}' > init.tf

~/tmp/terraformer
❯ terraform init

vpc,subnet,igw,sg,alb,ec2_instanceを出力する

~/tmp/terraformer
❯ terraformer import aws --resources=vpc,subnet,igw,sg,alb,ec2_instance --connect=true --regions=ap-northeast-1

出力

実行が成功すると以下のように出力されます。

~/tmp/terraformer
❯ tree -L 5
.
├── generated
│   └── aws
│       ├── alb
│       │   └── ap-northeast-1
│       │       ├── lb.tf
│       │       ├── lb_listener.tf
│       │       ├── lb_listener_rule.tf
│       │       ├── lb_target_group.tf
│       │       ├── lb_target_group_attachment.tf
│       │       ├── outputs.tf
│       │       ├── provider.tf
│       │       ├── terraform.tfstate
│       │       └── variables.tf
│       ├── ec2_instance
│       │   └── ap-northeast-1
│       │       ├── instance.tf
│       │       ├── outputs.tf
│       │       ├── provider.tf
│       │       ├── terraform.tfstate
│       │       └── variables.tf
│       ├── igw
│       │   └── ap-northeast-1
│       │       ├── internet_gateway.tf
│       │       ├── outputs.tf
│       │       ├── provider.tf
│       │       ├── terraform.tfstate
│       │       └── variables.tf
│       ├── sg
│       │   └── ap-northeast-1
│       │       ├── outputs.tf
│       │       ├── provider.tf
│       │       ├── security_group.tf
│       │       └── terraform.tfstate
│       ├── subnet
│       │   └── ap-northeast-1
│       │       ├── outputs.tf
│       │       ├── provider.tf
│       │       ├── subnet.tf
│       │       ├── terraform.tfstate
│       │       └── variables.tf
│       └── vpc
│           └── ap-northeast-1
│               ├── outputs.tf
│               ├── provider.tf
│               ├── terraform.tfstate
│               └── vpc.tf
└── init.tf

エラー対応

下記のエラーが出力される場合は、A/S Keyに割り当てられている権限がたりません。Adminレベルの権限が必要です。

❯ terraformer import aws --resources=vpc,subnet --connect=true --regions=ap-northeast-1
2019/09/25 11:56:58 aws importing region ap-northeast-1
2019/09/25 11:56:58 aws importing... vpc
2019/09/25 11:56:59 UnauthorizedOperation: You are not authorized to perform this operation.
	status code: 403, request id:

対応しているリソースは?

結構満遍なくあります。
基本的にterraformのaws-providerが対応していればぶっこぬけるようです。
つまりterraformで作れるAWSリソースならterraformerは対応している、ということです。

https://github.com/GoogleCloudPlatform/terraformer#use-with-aws

結構アップデートされているので引き続きwatchして行きたいと思います。

以上です



Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス