terraform-style-guide
HashiCorpの公式スタイル規約とベストプラクティスに従ってTerraform HCLコードを生成します。Terraformの構成ファイルの作成・レビュー・生成を行う際に使用してください。
description の原文を見る
Generate Terraform HCL code following HashiCorp's official style conventions and best practices. Use when writing, reviewing, or generating Terraform configurations.
SKILL.md 本文
Terraform Style Guide
HashiCorp の公式スタイル規約とベストプラクティスに従って Terraform コードを生成・保守します。
参考: HashiCorp Terraform Style Guide
コード生成戦略
Terraform コードを生成する際:
- プロバイダー設定とバージョン制約から開始
- 依存リソースの前にデータソースを作成
- 依存順にリソースを構築
- 主要なリソース属性に対して出力を追加
- すべての設定可能な値に変数を使用
ファイル構成
| ファイル | 目的 |
|---|---|
terraform.tf | Terraform およびプロバイダーのバージョン要件 |
providers.tf | プロバイダー設定 |
main.tf | 主要なリソースとデータソース |
variables.tf | 入力変数宣言(アルファベット順) |
outputs.tf | 出力値宣言(アルファベット順) |
locals.tf | ローカル値宣言 |
構成例
# terraform.tf
terraform {
required_version = ">= 1.14"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.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" {
# メタ引数
count = 3
# 引数
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
# ブロック
root_block_device {
volume_size = 20
}
# ライフサイクルは最後に
lifecycle {
create_before_destroy = true
}
}
命名規約
- すべての名前に 小文字とアンダースコア を使用
- 説明的な名詞 を使用(リソースタイプは除外)
- 具体的で意味のある名前にする
- リソース名は単数形にする
- 説明的な名前が冗長または不可能な場合、インスタンスが 1 つだけ存在する場合に限定して
mainを使用
# Bad
resource "aws_instance" "webAPI-aws-instance" {}
resource "aws_instance" "web_apis" {}
variable "name" {}
# Good
resource "aws_instance" "web_api" {}
resource "aws_vpc" "main" {}
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 を使用
resource "aws_instance" "web" {
count = var.instance_count
tags = { Name = "web-${count.index}" }
}
# Good - 名前付きインスタンスに for_each を使用
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
}
セキュリティベストプラクティス
SECURITY.md を参照してください。リソースの暗号化、ステート内の機密データ防止、 セキュアな設定に関するガイダンスが含まれています。
バージョンピンニング
terraform {
required_version = ">= 1.14"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
各プロバイダーの最新メジャーバージョンと Terraform の最新マイナーバージョンを使用してください。 ただし、依存関係ロックファイルまたは設定で使用される他のモジュールによる制約がある場合を除きます。
バージョン制約演算子:
= 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
}
}
}
# マルチリージョン用のエイリアス付きプロバイダー
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で設定が検証されている - ファイルが標準構成に従って整理されている
- すべての変数に type と description がある
- すべての出力に description がある
- リソース名がアンダースコア付きの説明的な名詞を使用している
- バージョン制約が明示的にピンニングされている
- 機密値が
sensitive = trueでマーク されている - ハードコードされた認証情報またはシークレットがない
- セキュリティベストプラクティスが適用されている
Based on: HashiCorp Terraform Style Guide
ライセンス: MPL-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- hashicorp
- ライセンス
- MPL-2.0
- 最終更新
- 不明
Source: https://github.com/hashicorp/agent-skills / ライセンス: MPL-2.0
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。