Terraform 勉強
Introduction to Infrastructure as Code with Terraform
Infrastructure as Code(IaC)
Terraformはproviderと呼ばれるTerraformプラグインでAPIを呼び出し、インフラの操作をする
- AWS GCP Azureなど有名なもののproviderは作成されている
- 独自でproviderを作成することも可能
providerがインフラの要素をresourceとして定義
- インスタンスやネットワークなど
様々なproviderのリソースをmoduleに構成
moduleは再利用可能なTerraformの構成
Terraformは宣言型
- インフラの最終状態を記述し、Terraform providerが自動で計算
Terraformでインフラ展開の流れ
- Scope 適用範囲の把握
- Author 構成の記述
- Initialize 必要プラグインのインストール
- Plan 変更のプレビュー
- Apply 変更の実施
State file
- インフラの状態を追跡するためのソース
- これの状態を見て、宣言した構成と合うよう変更を加える
Terraform Cloud
- Gitと繋いで自動的に構成の提案したり、実行環境を用意して構成変更の競合を防いだりする
Install Terraform
- 内容をコピペして動く
Quick start tutorial
- nginxのdocker image作成
terraform init
terraform plan
terraform apply
terraform destroy
Build Infrastructure
GCPのアカウント作成
サービスアカウント作成
terraform ブロック
- インフラストラクチャのプロビジョニング(準備)に必要な設定を書く
- provider名
- providerのソース
- 大体公式のprovider名を指定
- バージョン指定がない場合は最新のを用いる
- インフラストラクチャのプロビジョニング(準備)に必要な設定を書く
terraform {
required_providers {
google = {
source = "hashicorp/google" // 指定しないときデフォルトでhashicorpのレジストリを見に行く
version = "3.5.0" // バージョン指定がない時は最新のものを利用する
}
}
}
- provider ブロック
- 指定したproviderの各環境に接続する設定などを記載
provider "google" {
credentials = file("credential.json")
project = "project-name"
region = "us-central1"
zone = "us-central1-c"
}
- ロックファイル(.lock.hcl)
- すべてのTerraform実行に一貫性を持たせるために使用される正確なprovider versionを指定
terraform fmt : フォーマットチェック
terraform validate : 構文チェック
メモ:GCPアカウントを作りたてだとComputeEngineAPIが有効化されていないので有効化する
サービスアカウントの権限が足りないときは IMAと管理/IAM でプリンシパルを編集する
terraform show // 現在の状態を表示
https://github.com/github/gitignore/blob/main/Terraform.gitignore
Change Infrastructure
- 実運用するときはバージョン管理を使うことを勧める
Create New resource
- VMインスタンス作成の定義
- (Resource Type).(Reference name).(field)
- Terraform はリソースの依存関係グラフを作成して適切な順序で作成されるよう制御
- access_configブロックが存在すると引数がなくてもVMに外部IPが与えられれインターネット経由でアクセスできる
- こういう仕様はちゃんとドキュメントを読む
resource "google_compute_instance" "vm_instance" {
name = "terraform-instance"
machine_type = "f1-micro"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
network_interface {
network = google_compute_network.vpc_network.name
access_config {
}
}
}
- tags - (Optional) インスタンスにつけるネットワークタグのリスト
- ネットワークタグ:VMインスタンスに適用されるファイアウォールのルールやトラフィックの経路を設定できる
~
は変更がある個所を示す
Introduce destructive changes
- 破壊的変更をともなうもの(ex インスタンスのimageを変更)
-/+
は破棄と作成を行うことを示す
Destroy Infrastructure
terraform destroy
- 管理しているインフラをすべて終了する
- リソースの破棄の順序も依存関係に基づいて破棄してくれる
Define Input Variables
- Terraformは.tfのファイルをすべて読み込むため、構成ファイルに任意の名前をつけることができる
- .tfvars または .auto.tfvars のファイルは自動的にロードされ変数を取り扱うことができる
Query Data with Output Variables
- 出力変数の定義
output "ip" {
value = google_compute_instance.vm_instance.network_interface.0.network_ip
}
- 変数の名前は他のモジュールの入力として利用される場合はTerraform変数の命名規則に準拠している必要がある
terraform output