mcpField
T
terraform

terraform

github.com/i9wa4クラウド・DevOps1246 回インストール今日更新
リポジトリ

terraform について

Terraform 開発向けのリファレンススキルで、CLI コマンド、リソース、モジュール、状態管理、変数、セキュリティを扱います。HCP Terraform の共同作業、ポリシー適用、リモート状態についても説明します。

主な機能

  1. 01Terraform の初期化、計画、適用コマンド
  2. 02リソースのライフサイクルとメタ引数
  3. 03モジュール設計とソース設定
  4. 04状態、リモートバックエンド、ロック
  5. 05変数、出力、機密データの扱い
  6. 06HCP Terraform のワークスペースと共同作業

活用シーン

  1. 01インフラ変更の適用前に計画を確認
  2. 02リモート状態を管理し同時変更を防止
  3. 03再利用可能な Terraform モジュールの構築
  4. 04変数、認証情報、状態ファイルの安全な管理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/i9wa4/dotfiles --skill terraform

インストール後、Claude Code で/terraformを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

examples/module-skeleton/
README.md
main.tf
versions.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. 変数の設定方法(優先順位順)
  1. コマンドラインの -var、-var-file
  2. *.auto.tfvars ファイル
  3. terraform.tfvars.json
  4. terraform.tfvars
  5. 環境変数 TF_VAR_*
  6. デフォルト値
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. 参考リンク

コメント