はじめに
こんにちは!Product Unit SINIS for Instagram開発チームでテックリードをしています工藤(@metalic_kudo_h)です。
みなさんのインフラ環境は、IaC(Infrastructure as Code)となっていますでしょうか?
弊社では、インフラの構築をすべてTerraformを用いて行うようになりましたが、過去に構築された古いインフラは未だにTerraformで管理されておらず、手動での運用が続いているという状況がありました。
既存のインフラリソース(AWS)をTerraformで管理できるように移行することを検討しましたが、0から全てのTerraformコードを手書きで作成するのは非常に手間がかかります。
そこで効率的にTerraformコードを生成できるツールはないかと調査したところ、「Terraformer」という便利なツールを発見しました。
この記事では、このTerraformerを使ってAWSリソースからTerraformコードを生成する方法について解説します。
サンプルプロジェクト
DockerでTerraformerが動かせる最低限の構成をしたサンプルプロジェクトです
サンプルプロジェクト解説
Terraformerインストール
- TerraformerのインストールはDockerfileで実行しています
- 今回はAWSリソースをTerraformコードにしたいため terraformer-aws-linux-amd64 をインストールしていますが、PROVIDERの変数を書き換えることで他リソースにも対応することができます。対象リソースはGitHubのAssetsから確認できます
- この記事を書いている時のTerraformerは Terraform 0.13 がサポートされており、それ以降の新しいバージョンではエラーになるため、Terraformのバージョンは0.13.7で固定しています
- Terraformを併用したい場合、上述の通り古いバージョンで固定されてしまうため、弊社ではDockerサービスを分けることで対応しています
【イメージ】
version: "3" services: terraform: image: hashicorp/terraform:1.7.1 # https://releases.hashicorp.com/terraform volumes: - ./terraform/:/infra working_dir: /infra env_file: .env terraformer: build: context: . dockerfile: ./Dockerfile volumes: - ./terraformer:/app/terraform env_file: .env
.envファイルの作成
- プロジェクト直下で
make env
を実行し .env ファイルを生成 - .envファイルの AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY に、AWSアクセスキーとシークレットキーを設定する
terraformer init
make terraformer/init
を実行し、terraformer initを実行する- プロジェクト直下に
.terraform
ディレクトリが作られればOK
terraformer import
- docker/run のcommand引数に実行したいimportコマンドを渡す(下記はecsのリソースをimportする例)
- terraformer/generatedディレクトリ配下にterraformファイルが生成されていればOK
make docker/run command="import aws --resources ecs --regions ap-northeast-1 --profile ''"
感想
Terraformerを使うことで、手書きでコードを書くよりも効率的に作業を進められますが、生成されたコードには注意が必要です。 例えば、リソースの参照が行われずにハードコーディングされている箇所があり、そのまま運用するとリソースが変更された際に対応できなくなる可能性があります。 Terraformerでベースとなるコードを自動生成し、後は手動でリファクタリングや修正を加えることが理想的です。
テテマーチでは、一緒にサービスを作り上げてくれる仲間を募集中です。ご興味のある方は、以下のリンクからぜひご応募ください! herp.careers
エンジニアチームガイドはこちら! tetemarche01.notion.site