Open5
詳解Terraform Chap.3メモ
3.1
- ステートファイルとは、AWS/GCP等にどういうリソースを作成したのか、設定値はどうなっているのかを記録するファイル。拡張子
.tfstate
- このステートファイルとTerraformコードの差分が、planコマンドで表示される差分。
- これによって扱う関心ごとは次の3つ
- ステートの共有: 共同開発者間でステートを共有する
- ステートのロック: 共同開発者間で同時に変更を実行しないように、変更中にはロックをかけて排他制御する
- 環境別のステートの分離: dev/stg/prdのような環境別にステートを分離する
3.2
- ステートをGitに管理するのは良くない
- 最新のpush忘れ、ロックされない、シークレットがローカル保存される等の問題から
- ローカル/リモートバックエンドを使う: GCPの場合、GCSを使うとよい。上記問題解決される。
- AWSの場合、ロックにDynamoDBを使用するが、これは近いうちに廃止になる。: https://zenn.dev/terraform_jp/articles/terraform-s3-state-lock
- Google Cloudの場合、ロック用のファイルがGCSに作成される(GCSバックエンドの場合)
- ロックが掛かりっぱなしになることも稀にある -> 強制アンロックが必要になることも。 https://developer.hashicorp.com/terraform/cli/commands/force-unlock
- GCSのバージョニングと合わせて、おかしくなった際にロールバック可能
3.3
- バックエンドもTerraformで作成する場合、
- バックエンドリソース作成 -> ローカルでapply実行 -> バックエンドを指定してterraform init
- -backend-config を使うことによって、部分設定を行うことができる
3.4
- ステートを分離する方法として、大方針2つがある。
- ワークスペースによる分離: 同じ設定値でテスト環境を作るのに便利
- ファイルレイアウトによる分離: 開発環境、本番環境といったものを分離するのに便利
- 参考: https://zenn.dev/t_shunsuke/articles/164f2c4ff06584
3.5
- terraform_remote_state: あるtfstateで管理されている情報を、別の環境(Terraform、ECSpresso等)から読み込むためのもの
- 他から参照する値は output として出力してやると、参照しやすい。
- アクセス制御には注意が必要。GCSの読み取り権限のコントロールとか。
- 秘匿データをセキュアに扱う方法はchap.6で扱う。
- TF_VAR_[変数名] の形式の環境変数で、変数を読み込むことができる
- GitHub Actionsのシークレット等から注入する場合などに使用
- ビルトイン関数が用意されている。: https://developer.hashicorp.com/terraform/language/functions