terraform について
Terraform 開発向けのリファレンススキルで、CLI コマンド、リソース、モジュール、状態管理、変数、セキュリティを扱います。HCP Terraform の共同作業、ポリシー適用、リモート状態についても説明します。
主な機能
- 01Terraform の初期化、計画、適用コマンド
- 02リソースのライフサイクルとメタ引数
- 03モジュール設計とソース設定
- 04状態、リモートバックエンド、ロック
- 05変数、出力、機密データの扱い
- 06HCP Terraform のワークスペースと共同作業
活用シーン
- 01インフラ変更の適用前に計画を確認
- 02リモート状態を管理し同時変更を防止
- 03再利用可能な Terraform モジュールの構築
- 04変数、認証情報、状態ファイルの安全な管理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ i9wa4/ dotfiles --skill terraformインストール後、Claude Code で/terraformを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/module-skeleton/README.mdmain.tfversions.tf詳細
Terraform エキスパートエンジニアスキル
このスキルでは、Terraform 開発に関する包括的なガイドを提供します。
1. Terraform CLI の基本コマンド
1.1. 初期化とプランニング
# Initialize workspace (download providers)
terraform init
# Initialize with backend config
terraform init -backend-config="bucket=my-terraform-state"
# Check execution plan
terraform plan
# Save execution plan to file
terraform plan -out=tfplan
# Plan specific resource only
terraform plan -target=aws_instance.example
1.2. 適用と破棄
警告:これらのコマンドはインフラストラクチャを変更します。
必ず最初に terraform plan を実行し、ユーザーの許可を得てください。
# Apply changes
terraform apply
# Apply saved plan
terraform apply tfplan
# Auto-approve apply (for CI/CD)
terraform apply -auto-approve
# Destroy resources
terraform destroy
# Destroy specific resource only
terraform destroy -target=aws_instance.example
1.3. 状態管理
# Check state
terraform state list
# Show resource details
terraform state show aws_instance.example
# Move resource (for refactoring)
terraform state mv aws_instance.old aws_instance.new
# Import existing resource
terraform import aws_instance.example i-1234567890abcdef0
# Remove resource from state (keeps actual resource)
terraform state rm aws_instance.example
1.4. その他の便利なコマンド
# Validate configuration
terraform validate
# Format
terraform fmt
# Format recursively
terraform fmt -recursive
# Check outputs
terraform output
# Output in JSON format
terraform output -json
# Interactive console (for testing expressions)
terraform console
# Lock providers
terraform providers lock -platform=linux_amd64 -platform=darwin_amd64
2. リソース管理
2.1. 基本的なリソースブロックの構造
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
2.2. メタ引数
depends_on:明示的な依存関係count:リソースの複製(インデックスベース)for_each:リソースの複製(キーに基づく)provider:別のプロバイダーを指定lifecycle:ライフサイクルの制御
2.3. ライフサイクル設定
resource "aws_instance" "example" {
# ...
lifecycle {
create_before_destroy = true # Create new first on replacement
prevent_destroy = true # Prevent deletion
ignore_changes = [tags] # Attributes to ignore changes
replace_triggered_by = [null_resource.trigger.id]
}
}
3. モジュール設計
3.1. モジュールの呼び出し
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}
3.2. モジュールのソースタイプ
- ローカルパス:
./modules/vpc - Terraform Registry:
hashicorp/consul/aws - GitHub:
github.com/hashicorp/example - S3:
s3::https://s3-eu-west-1.amazonaws.com/bucket/module.zip
3.3. モジュールのベストプラクティス
- 標準的なファイル構成にする:
main.tf、variables.tf、outputs.tf - README.md でドキュメントを作成する
- 意味のあるデフォルト値を設定する
- 検証ブロックで入力を検証する
4. 状態管理
4.1. リモートバックエンドの設定
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "prod/terraform.tfstate"
region = "ap-northeast-1"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
4.2. 状態管理のベストプラクティス
- リモートバックエンドを使用する(チーム開発では必須)
- 状態ロックを有効にする(同時実行を防止)
- 暗号化を有効にする
- 状態ファイルを直接編集しない(
terraform stateコマンドを使用する) - 環境ごとに状態ファイルを分ける
5. 変数と出力
5.1. 入力変数
variable "instance_type" {
type = string
description = "EC2 instance type"
default = "t2.micro"
validation {
condition = contains(["t2.micro", "t2.small", "t2.medium"], var.instance_type)
error_message = "Please specify an allowed instance type"
}
}
5.2. 変数の設定方法(優先順位順)
- コマンドラインの
-var、-var-file *.auto.tfvarsファイルterraform.tfvars.jsonterraform.tfvars- 環境変数
TF_VAR_* - デフォルト値
5.3. 機密データの取り扱い
variable "db_password" {
type = string
sensitive = true # Mask in output
}
output "connection_string" {
value = "postgres://user:${var.db_password}@host/db"
sensitive = true # Output contains sensitive data
}
注:機密データは状態ファイルに平文で保存されます。 リモートバックエンドの暗号化または HCP Terraform の使用を推奨します。
6. プロバイダー
6.1. プロバイダーの宣言
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
6.2. 複数のプロバイダー
provider "aws" {
alias = "us_east"
region = "us-east-1"
}
provider "aws" {
alias = "ap_northeast"
region = "ap-northeast-1"
}
resource "aws_instance" "us" {
provider = aws.us_east
# ...
}
7. 組み込み関数
7.1. よく使う関数
# String operations
join("-", ["foo", "bar"]) # "foo-bar"
split(",", "a,b,c") # ["a", "b", "c"]
format("Hello, %s!", "World") # "Hello, World!"
# Collection operations
length(["a", "b", "c"]) # 3
lookup(map, key, default) # Get value from map
merge(map1, map2) # Merge maps
flatten([["a"], ["b", "c"]]) # ["a", "b", "c"]
# Type conversions
tostring(123) # "123"
tolist(set) # Set to list
tomap(object) # Object to map
# Conditional expressions
coalesce("", "default") # "default" (first non-empty value)
try(expression, fallback) # Fallback on error
8. HCP Terraform / Terraform Cloud
8.1. 主な機能
- リモート状態管理(暗号化、バージョン管理)
- チームでのコラボレーション
- ポリシーの適用(Sentinel)
- プライベートモジュールレジストリ
- VCS 連携(GitHub、GitLab など)
- コストの見積もり
8.2. ワークスペースの設定
terraform {
cloud {
organization = "my-org"
workspaces {
name = "my-workspace"
}
}
}
9. セキュリティのベストプラクティス
9.1. 認証情報の管理
- ハードコードしない
- 環境変数または認証ファイルを使用する
- IAM ロール / サービスアカウントを推奨
- HashiCorp Vault と連携する
9.2. 状態ファイルのセキュリティ
- 暗号化されたバックエンドを使用する
- 適切なアクセス制御を設定する
.terraform/を.gitignoreに追加する*.tfvarsに機密情報が含まれる場合は、.gitignoreに追加する
10. 参考リンク
- 公式ドキュメント:https://developer.hashicorp.com/terraform/docs
- 言語リファレンス:https://developer.hashicorp.com/terraform/language
- CLI リファレンス:https://developer.hashicorp.com/terraform/cli
- プロバイダーレジストリ:https://registry.terraform.io/
- モジュールレジストリ:https://registry.terraform.io/browse/modules
- HCP Terraform:https://developer.hashicorp.com/terraform/cloud-docs
コメント
Markdown 対応