mcpField
T
terraform-style-check

terraform-style-check

github.com/warpdotdevクラウド・DevOps822139 回インストール28 週間前に更新
リポジトリ

terraform-style-check について

terraform-style-checkは、Terraform設定を作成・レビューする開発者向けのスキルです。ファイル構成、書式、命名、バージョン制約、安全対策の指針をまとめています。

主な機能

  1. 01標準的なTerraformファイル構成
  2. 02書式と命名規則の適用
  3. 03変数と出力の説明記述
  4. 04依存関係に沿ったリソース作成
  5. 05安全対策とバージョン制約の指針
  6. 06コミット前チェックリスト

活用シーン

  1. 01一貫した構成のTerraform設定を生成
  2. 02変数・出力・リソース名をレビュー
  3. 03認証情報と安全設定を確認
  4. 04コミット前に書式と検証を実行

インストール

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

$npx skills add https://github.com/warpdotdev/oz-skills --skill terraform-style-check

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

詳細

Terraform スタイルガイド

HashiCorp の公式スタイル規約とベストプラクティスに従って、Terraform コードを生成および保守します。

参照: HashiCorp Terraform スタイルガイド

コード生成戦略

Terraform コードを生成する際は、次の手順に従います。

  1. プロバイダーの設定とバージョン制約から始めます
  2. 依存するリソースより先にデータソースを作成します
  3. 依存関係の順にリソースを構築します
  4. 主要なリソース属性の出力を追加します
  5. 設定可能な値にはすべて変数を使用します

ファイル構成

ファイル用途
terraform.tfTerraform とプロバイダーのバージョン要件
providers.tfプロバイダー設定
main.tf主なリソースとデータソース
variables.tf入力変数の宣言(アルファベット順)
outputs.tf出力値の宣言(アルファベット順)
locals.tfローカル値の宣言
構成例
# terraform.tf
terraform {
  required_version = ">= 1.7"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

# variables.tf
variable "environment" {
  description = "Target deployment environment"
  type        = string

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "Environment must be dev, staging, or prod."
  }
}

# locals.tf
locals {
  common_tags = {
    Environment = var.environment
    ManagedBy   = "Terraform"
  }
}

# main.tf
resource "aws_vpc" "main" {
  cidr_block           = var.vpc_cidr
  enable_dns_hostnames = true

  tags = merge(local.common_tags, {
    Name = "${var.project_name}-${var.environment}-vpc"
  })
}

# outputs.tf
output "vpc_id" {
  description = "ID of the created VPC"
  value       = aws_vpc.main.id
}

コードの書式設定

インデントと位置合わせ
  • ネストの各レベルで半角スペース 2 つを使用します(タブは使いません)
  • 連続する引数では等号の位置を揃えます
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  subnet_id     = "subnet-12345678"

  tags = {
    Name        = "web-server"
    Environment = "production"
  }
}
ブロックの構成

引数はブロックより前に記述し、メタ引数を最初に記述します。

resource "aws_instance" "example" {
  # Meta-arguments
  count = 3

  # Arguments
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  # Blocks
  root_block_device {
    volume_size = 20
  }

  # Lifecycle last
  lifecycle {
    create_before_destroy = true
  }
}

命名規則

  • すべての名前に小文字とアンダースコアを使用します
  • リソースタイプを含めず、内容を表す名詞を使用します
  • 具体的で意味のある名前にします
# Bad
resource "aws_instance" "webAPI-aws-instance" {}
variable "name" {}

# Good
resource "aws_instance" "web_api" {}
variable "application_name" {}

変数

すべての変数に type と description を含める必要があります。

variable "instance_type" {
  description = "EC2 instance type for the web server"
  type        = string
  default     = "t2.micro"

  validation {
    condition     = contains(["t2.micro", "t2.small", "t2.medium"], var.instance_type)
    error_message = "Instance type must be t2.micro, t2.small, or t2.medium."
  }
}

variable "database_password" {
  description = "Password for the database admin user"
  type        = string
  sensitive   = true
}

出力

すべての出力に description を含める必要があります。

output "instance_id" {
  description = "ID of the EC2 instance"
  value       = aws_instance.web.id
}

output "database_password" {
  description = "Database administrator password"
  value       = aws_db_instance.main.password
  sensitive   = true
}

リソースの動的な作成

count より for_each を優先する
# Bad - count for multiple resources
resource "aws_instance" "web" {
  count = var.instance_count
  tags  = { Name = "web-${count.index}" }
}

# Good - for_each with named instances
variable "instance_names" {
  type    = set(string)
  default = ["web-1", "web-2", "web-3"]
}

resource "aws_instance" "web" {
  for_each = var.instance_names
  tags     = { Name = each.key }
}
条件付き作成に count を使用する
resource "aws_cloudwatch_metric_alarm" "cpu" {
  count = var.enable_monitoring ? 1 : 0

  alarm_name = "high-cpu-usage"
  threshold  = 80
}

セキュリティのベストプラクティス

コードを生成する際は、セキュリティ強化策を適用します。

  • デフォルトで保存時の暗号化を有効にします
  • 該当する場合はプライベートネットワークを設定します
  • セキュリティグループには最小権限の原則を適用します
  • ロギングとモニタリングを有効にします
  • 認証情報やシークレットをハードコードしません
  • 機密性の高い出力には sensitive = true を設定します
例:セキュアな S3 バケット
resource "aws_s3_bucket" "data" {
  bucket = "${var.project}-${var.environment}-data"
  tags   = local.common_tags
}

resource "aws_s3_bucket_versioning" "data" {
  bucket = aws_s3_bucket.data.id

  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
  bucket = aws_s3_bucket.data.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm     = "aws:kms"
      kms_master_key_id = aws_kms_key.s3.arn
    }
  }
}

resource "aws_s3_bucket_public_access_block" "data" {
  bucket = aws_s3_bucket.data.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

バージョンの固定

terraform {
  required_version = ">= 1.7"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"  # Allow minor updates
    }
  }
}

バージョン制約の演算子:

  • = 1.0.0 - 完全一致するバージョン
  • >= 1.0.0 - 以上のバージョン
  • ~> 1.0 - 右端のコンポーネントのインクリメントを許可
  • >= 1.0, < 2.0 - バージョン範囲

プロバイダーの設定

provider "aws" {
  region = "us-west-2"

  default_tags {
    tags = {
      ManagedBy = "Terraform"
      Project   = var.project_name
    }
  }
}

# Aliased provider for multi-region
provider "aws" {
  alias  = "east"
  region = "us-east-1"
}

バージョン管理

コミットしないもの:

  • terraform.tfstate、terraform.tfstate.backup
  • .terraform/ ディレクトリ
  • *.tfplan
  • 機密データを含む .tfvars ファイル

必ずコミットするもの:

  • すべての .tf 設定ファイル
  • .terraform.lock.hcl(依存関係のロックファイル)

検証ツール

コミット前に実行します。

terraform fmt -recursive
terraform validate

追加ツール:

  • tflint - リントとベストプラクティスの確認
  • checkov / tfsec - セキュリティスキャン

コードレビューのチェックリスト

  • terraform fmt でコードを書式設定済み
  • terraform validate で設定を検証済み
  • 標準的な構成に従ってファイルを整理済み
  • すべての変数に型と説明を設定済み
  • すべての出力に説明を設定済み
  • リソース名にアンダースコアを含む、内容を表す名詞を使用
  • バージョン制約を明示的に固定
  • 機密値に sensitive = true を設定済み
  • 認証情報やシークレットをハードコードしていない
  • セキュリティのベストプラクティスを適用済み

参考: HashiCorp Terraform スタイルガイド

コメント