はじめに
今回はインフラ構築のコード化(Infrastructure as Code)にかかせない、Terraformの基礎についてまとめてみました。
少しでもご参考になれば幸いです。
(AWSプロバイダーを例としています)
Terraformとは
Terraform(テラフォーム)とは、インフラ(サーバーやネットワークなど)をコードで管理・構築するためのツールの一つです。
HashiCorp社が開発しており、「Infrastructure as Code(IaC)」の代表的なツールの一つです。
知っておきたい用語
① HCL(HashiCorp Configuration Language)
・Terraform専用の設定言語です。
・JSONよりも人間が読み書きしやすいように設計されています。
・Terraformの全ての設定はこの言語で記述します。
② Provider(プロバイダー)
・Terraformが外部サービス(クラウドやSaaS)を操作するためのプラグインのことです。
・プロバイダーには、AWS、Azure、Google Cloudなどがあります。
・Terraformと各サービスとを接続する役割があります。
provider "aws" {
region = "ap-northeast-1"
}
③ Resource(リソース)
・実際に作成するインフラの最小単位のことです。
・AWSではEC2、S3、VPCなどが該当します。
resource "aws_instance" "example" {
instance_type = "t2.micro"
}
④ State(状態)
・Terraformが管理しているインフラの実際の現在の状態を指します。
・状態は.tfstateファイルに反映されます。
・Terraformはこれを元に「差分」を判断します。
⑤ Module(モジュール)
Terraformのコードを部品化・再利用化する仕組みのことです。
複雑なインフラ構成を記述する場合に使用されます。
・1回作れば何度でも使い回せる
・二重管理にならないため、修正は1箇所でOK
・チーム開発で統一できる
といったメリットがあります。
modules/
└── ec2/
├── main.tf ← リソース定義
├── variables.tf ← 入力
├── outputs.tf ← 出力
また、モジュールには以下3つの種類があります。
1. ローカルモジュール
ローカルで作るモジュールです。
source = "./modules/ec2"
2. Gitモジュール
GitHub上で共有するモジュールです。
source = "git::https://github.com/org/repo.git//ec2"
3. Terraform Registryモジュール
公式やコミュニティが作成したモジュールです。
source = "terraform-aws-modules/ec2-instance/aws"
⑥ Backend(バックエンド)
「状態ファイル(tfstate)の保存場所と管理方法」を定義する仕組みのことです。
チーム開発ではリモート保存(例:S3)が一般的です。
ロック機構や共有によって同時編集や破壊的変更を防ぐ役割があります。
S3 + DynamoDB(ロック)構成が推奨されていました(将来削除予定)が、現在ではS3単体でロック機能の有効化が可能になりました。
terraform {
backend "s3" {
bucket = "my-tf-state"
key = "prod/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
use_lockfile = true # 本設定にてS3のみでロックが可能
}
}
backendはstateの保存先を決めるため、terraform initコマンド実行時に、優先的に処理されます。
⑦ Workspace
同じTerraformコードを使いながら、複数の環境(state)を分離する仕組みです。
各Workspaceごとに別のstateファイルが保持されるため、[dev / stg / prod] などの環境切り替えに利用されますが、
・大規模になるとif分岐だらけになる
・誤ってprodにapplyする事故が起きやすい
・どのworkspace使ってるかチームで共有しにくい
などといった理由から、現在は 「ディレクトリ分割 + リモートstate」 が主流となっています。
⑧ Variables(変数)
値を外部から注入することで、設定を柔軟にするための仕組みです。
variable "instance_type" {
type = string
default = "t3.micro"
description = "EC2 instance type"
}
resource "aws_instance" "example" {
instance_type = var.instance_type
}
⑨ Output
Terraform実行後に値を出力する仕組みのことです。
output "ip" {
value = aws_instance.example.public_ip
}
# 出力例
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
ip = "12.345.678.90"
出力値の確認だけでなく、外部サービスとの連携のために使用します。
⑩ Data Source
既存のリソース情報を取得する仕組みです。
data "aws_ami" "example" {
most_recent = true
}
リソースを「作る」のではなく、「参照」します。
⑪ Dependency(依存関係)
リソース間の作成順序を制御する仕組みです。
Terraformは自動で依存関係を解決しますが、可読性のため明示も可能です。
depends_on = [aws_vpc.main]