Terraformについて、勉強していたのでメモとして残します。
versionは0.13.2となっています。
作業ディレクトリの初期化
# 初期化
terraform init
計画実行(dry-run)
追加・更新・削除内容を確認できます。
公式
ただし、terraformのdry-runであるだけで、例えばapply時に存在しないインスタンスタイプを指定して、エラーとなる場合もあります。
公式ではないが、チェックするためのツールもあるとのこと。
※tflint
# 計画実行
terraform plan
# 特定のリソースのみ
# リソースの指定
terraform plan -target=aws_security_group.ecs_cluster
# モジュールの指定
terraform plan -target=module.api_ecs_cluster
リソースの追加・更新・削除
planにて出力された結果を実行。
公式
# 実行
terraform apply
リソースの削除
planにて出力された結果を実行。
公式
# 削除
terraform destroy
# コマンド実行前に確認で安心
terraform plan -destroy
リソースの削除
planにて出力された結果を実行する。
公式
# 削除
terraform destroy
# コマンド実行前に確認で安心
terraform plan -destroy
モジュールの取得
実行に必要なモジュールの取得。
公式
# モジュールの取得
terraform get
フォーマット
.tfファイルのフォーマットをしてくれる。
公式
# フォーマット
terraform fmt
# 再帰的にフォーマット
terraform fmt -recursive
記述チェック
.tfファイルの記述をチェックしてくれる。
公式
# 記述チェック
terraform validate
# 例
Error: Missing newline after argument
on main.tf line 41, in module "api_ecs_cluster":
41: source = "../../modules/ecs-cluster"aaa
An argument definition must end with a newline.
state
Terraformのstateファイルは実際にAWS等にデプロイされているインフラと、マッピングに利用されており、メタデータを保持しているとのこと。
また、チーム開発等を行う際はAWSであればS3に配置し、直接編集を行わないようにします。
公式
# 作成リソースのリスト表示
terraform state list
# リソースの詳細情報の表示
terraform state show <詳細情報を見たいリソース>
terraform state show aws_security_group.ecs_cluster
# S3等からstateファイルを持ってくる
terraform state pull
# ローカルのstateとリモートのStateを置き換える(※ 基本は使うべきではない)
terraform state push
# リソースをTerraform管理から外す
terraform state rm <管理外にしたいリソース>
terraform state rm aws_security_group.ecs_cluster
import
Terraformで管理されていないリソースを管理下に置きます。
既存のリソースに対してTerrafomを導入したいときに使います。
Googleがterrafomerというツールを作成しているのでそちらを使うのもありかと。
※terrafomer
EC2を例にする
tfファイルの作成する
resource "aws_instance" "test_instance" {
}
インスタンスIDを確認しインスタンスIDを元にコマンド実行する
terraform import aws_instance.test_instance <インスタンスID>
stateコマンドの結果を元に.tfファイルを編集する
terraform state show aws_instance.test_instance
planで差分がないか確認 (差分があったとしても問題なければOK)
terraform plan