はじめに
備忘録です(予防線)
また、本記事ではterraformerを使用していますが、万一を想定して.tf
コード生成のみの目的で使用しています。
(2022年3月4日時点で、terraformの最新はv1.1.7
に対し、terraformerの対応はv0.13
)
環境
- クラウド先: GCP
- コード管理: github
- apply環境: CircleCI
- terraformバージョン
- ci上コンテナ: v0.14
- ローカル: v0.13 (後述)
やったこと
手順1 terraformer導入(ローカル)
既にあるリソースをterraform管理したい場合、terraform import
が一般的だと思います。
しかし、このコマンドでは、tfstateのみしか更新を行いません。
Webコンソール画面・terraformドキュメント・エディタを行き来して、tf
コードを生成するのは大変です。
そこで、.tf
コードを自動作成してくれるterraformerを用いました。
brew環境だと、以下でインストールできます。
brew install terraformer
また、私の環境だとterraform v0.14以上だと動きませんでした(2022年3月4日時点)
以下記事にもあるように、v0.13を導入すると良いでしょう
https://dev.classmethod.jp/articles/terraformer-version-dependence/
手順2 安全な環境の作成
作業前に、既存環境を壊さない準備をします。
以下の作業を行いました。
- tfstateのバックアップ
- 一時的なバケットの作成(S3/GCS)(terraformer用)
- 一時的な作業用ディレクトリの作成
- provider設定を引き継ぐ
- tfstate管理先を、上記作成のバケットへ
手順3 terraformer実行
以下より、コード化したいリソースのterraformer上表記を調べます
https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/gcp.md
そして、既存環境の.tf
コードを生成します。
(tfstate管理先が一時的なバケットであるディテクトリで)
terraformer import google --resources=gcs,iam --projects=<プロジェクト名>
また、--resources
は*で全リソース取得できます
手順4 リファクタ
terraformerにより作成された.tf
コードのうち、必要なものを持ってきます。
(tfstate管理先が本番を向いている、元々のディレクトリへの移動/コピー)
また、以下をリファクタします
- terraformリソース名(長い)
- 変数(いらないものがある)
- リソース自体(terraform管理したくないリソースが含まれていたりする)
手順5 terraform import
リソースブロック単位でterraform import
を実行します
コマンド例は公式ドキュメントにあります
ここでは、service_accountを例にします。
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_service_account#import
terraform import google_service_account.<terraformリソース名> projects/<プロジェクト名>/serviceAccounts/<service_accountのメール>
手順6 terraform plan
terraform planを行い、問題ないことを確認します
(差分が無い or 意図する差分しか出ていない)
手順7 githubへのmerge、terraform applyなど
これらの内容を反映させます
おわりに
マサカリお待ちしております