【備忘録】Terraform - 🔰初学者向け基礎知識
Terraformとは
HashiCorp社が提供するIaCツールで、クラウド、オンプレミス問わずCPU、メモリ、ディスクなどのインフラの構成やポリシーをコード化し、インフラ管理を自動化することができる。
プロバイダ
TerraformはAWS, GPC, Azureなどのクラウドサービスと連携する。
クラウドサービスの各プロバイダは、そのサービスのAPIを利用してインフラを構築・管理する。
HCL(HashiCorp Configuration Language)
Terraformの設定ファイルは、HCLというTerraform専用の構成言語(JSONに似た記法)でリソースの定義を行う。
状態管理
Terraformはインフラの状態をファイルとして保存する。
どのリソースがどのように管理されているかを追跡し、インフラの状態とコードの差分を比較することで適切な変更を自動的に適用することができる。
再利用性とモジュール
インフラの構成をモジュール化することでコードの再利用や保守が容易になる。
モジュールを使うことで、開発、テスト、本番などの複数の環境で同じコードを使い、インフラを構築することができる。
プロビジョニング(構築)の自動化
インフラを手動で管理せず、コードで管理することでインフラの構築が自動化され、ヒューマンエラーを防ぐことができる。
Terraformのインストール手順
※以下はMacでbrewが使える前提の手順となる。その他の環境での手順は公式ドキュメントを参照。
1. HomebrewパッケージからHashiCorp社のリポジトリをインストール
brew tap hashicorp/tap
2. Terraformをインストール
brew install hashicorp/tap/terrafor
tfファイルとは
Terraformの設定ファイルで、クラウドリソースやインフラ構成を定義する。(拡張子は.tf
)
プロバイダ設定
使用するクラウドサービスやツールの設定を行う。
プロバイダは、Terraformがそのサービスと通信するための設定情報。
リソース定義
インフラの具体的なリソース(仮想マシン、ストレージ、ネットワーク、セキュリティグループなど)を定義。
変数定義
インフラ設定の動的な部分(環境に応じて変わる部分)を変数として定義。
アウトプット
Terraformの実行後に表示される出力結果や他のリソースへの参照を定義。
HCLとは
- 前述の通り、HCL(HashiCorp Configuration Language)はtfファイルのリソースの定義などを行うためのTerraform専用の構成言語。(JSONに似た記法)
-
HCL
には特定の機能の枠組みを表すブロック
という概念があり、tfファイルにはリソースやプロバイダ、変数、出力などの設定をそれぞれ別々のブロック
に分けて記述する。
ブロックの基本形
ブロック名 "値" {
キー = "値"
キー = "値"
}
provider
ブロック
provider "プロバイダ名" {
# プロバイダ設定
}
- Terraformが利用するクラウドサービス(AWS、Azure、GCPなど)の設定を行う。
- providerはどのクラウドやサービスを利用するかを指定し、その後のリソース作成に影響する。
resource
ブロック
resource "プロバイダ名_リソースの種類" "Terraformで管理する名前" {
# リソース設定
}
- 実際に作成・管理するインフラリソースを定義する。
例えば、
aws_instanceでEC2インスタンスを作成する
google_compute_instanceでGCPのVMインスタンスを作成する
など。
locals
ブロック
locals {
変数名 = 値
}
- 計算された値や定数を一時的に保存して、他の設定で再利用するために使用する。
- 型指定はできない。
- local変数は設定ファイル内でのみ有効。
variable
ブロック
variable "変数名" {
type = 型
default = "デフォルトの値"
}
- 外部から入力可能な変数を定義する。
- ユーザーが実行時に指定する値を受け取るために使い、デフォルト値やデータ型を設定可能。
-
terraform apply
コマンド実行時の変数呼び出し方法について、- default値が設定されていない場合、対話形式で変数の値の入力が求められる。
bashterraform apply # 出力結果 var.env Enter a value:
- -varオプションによる変数設定
bashterraform apply -var="env=hoge"
-
ファイルで変数を管理
i. terraform.tfvarsファイルで設定
terraform.tfvarsenv="hoge"
bashterraform apply
ⅱ. -var-fileオプションによる設定ファイルの指定
hoge.tfvarsenv="dev"
bashterraform apply -var-file="hoge.tfvars"
locals
ブロックとvariable
ブロックの使い分け
locals
ブロック
- 変数の加工を行う場合、もしくはコード内で繰り返し使用する値を定義して再利用したい場合
locals {
app_name = "todo"
name_prefix = "${var.env}-${local.app_name}" // variable.tfのenvの値が入る
}
variable
ブロック
- コードの再利用時に外部から値を受け取りたい場合や環境名やIPアドレスなど、状況に応じて変更する必要がある値を設定するとき。
variable "env" {
type = string
default = "prod"
}
module
ブロック
module "モジュール名" {
source = "モジュールのソース"
# その他の引数
}
- 他のTerraform構成をモジュールとして再利用するために使用する。
- moduleは再利用可能な設定群を定義し、必要に応じて他の場所から呼び出すことができる。
output
ブロック
output "名前" {
value = 値
}
- Terraform実行後に出力として表示したい情報を定義する。
- インフラの作成後、重要な値(リソースIDやIPアドレスなど)を表示するために使用される。
import
ブロック
import "リソースタイプ" "リソース名" {
# インポート設定
}
- 既存のリソースをTerraformで管理するためにインポートするためのブロック。
ただし、これは通常コマンドラインから実行されることが多く、tfファイル内で定義することは少ない。
data
ブロック
data "リソースタイプ" "名前" {
# データソースの設定
}
- 外部リソースやデータを参照するためのブロック。
- インフラを作成する際に、既存のリソースの情報(他のリソースのIDや設定)を読み込むために使用する。
terraform
ブロック
terraform {
required_version = ">= 1.0"
backend "s3" {
bucket = "my-tf-state"
key = "path/to/my/key"
region = "ap-northeast-1"
}
}
- Terraformの設定全体に関連する設定を定義。
例えば、Terraformのバージョン要件や状態ファイルの保存先(backend)を指定する。
リソース作成の大まかな流れ
1. tfファイルを作成
必要なリソース(EC2インスタンス、S3バケット、VPCなど)を記述したtfファイルを作成する。
tfファイルにはproviderブロックやresourceブロックなどを記述。
2. 各種コマンドを実行
terraform init
- プロバイダを初期化するコマンド。
- 必要なプロバイダをダウンロードし、Terraformの作業環境をセットアップする。
- providerブロックで指定されたクラウドプロバイダの設定をもとにリソース作成を準備する。
terraform plan
- 設定ファイルに基づく差分を確認するコマンド。
- 設定ファイルと現在のインフラの状態を比較し、どのような変更が行われるかを表示する。
-
terraform apply
コマンドの実行前に変更内容を確認することができる。
terraform apply
- 差分を適用するコマンド。
-
terraform plan
で確認した変更内容を実際に適用する。 - コマンドを実行することでリソースが作成・変更され、インフラが構築される。
terraform destroy
- 作成したインフラを削除するコマンド。
3. 差分適用後の各種ファイルの自動作成
-
terraform apply
実行後、Terraformはインフラを構築した状態を保持するための状態ファイルterraform.tfstate
を作成・更新する。 - また、必要に応じて
.terraform/
ディレクトリ内にキャッシュやプロバイダ関連のファイルが保存される。
Discussion