terraform-module-library について
AWS、Azure、GCP 向けの再利用可能な Terraform モジュールパターンを案内するスキルです。インフラのコード化の標準化に役立つ構成、組み合わせ、テスト方法を扱いますが、一部の例には同梱されていない資料が必要です。
主な機能
- 01マルチクラウドモジュールの設計パターン
- 02標準的なモジュールのディレクトリ構成
- 03モジュール合成と入力検証
- 04Terratest によるテスト案内
- 05プロバイダー固定とリソースタグ付け
活用シーン
- 01再利用可能なインフラコンポーネントの構築
- 02クラウドリソースのプロビジョニング標準化
- 03組織全体の Terraform 標準策定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill terraform-module-libraryインストール後、Claude Code で/terraform-module-libraryを入力して読み込まれたか確認します。
同梱ファイルreferences/aws-modules.md
詳細
補足資料の利用可否
このカタログのコピーには、以下のインラインガイダンスが含まれていますが、次の補足パスは含まれていません。これらは外部の前提条件であり、同梱ファイルではありません。
<support-root>/assets/vpc-module/<support-root>/assets/rds-module/<support-root>/references/azure-modules.md<support-root>/references/gcp-modules.md
これらのパスに依存する手順を使用する前に、元の補足資料または既存のインストール環境を入手してください。このカタログには、確認済みのダウンロード元が示されていません。各パスをそのインストール環境からの相対パスとして解決し、内容を調査したうえで、該当するライセンスと実行上の前提条件を確認してください。必要なファイルが存在することを確認するまでは、コマンドを実行したり、参照先の手順に従ったと主張したりしないでください。不足しているスクリプトを捏造したり、同じ名前の無関係なファイルを同等のものとして扱ったりしないでください。ここに完全に記載されている独立した手順は、ユーザーが承認した範囲内で進められます。依存する手順は利用できないことを報告してください。
Terraform モジュールライブラリ
AWS、Azure、GCP のインフラストラクチャ向けの、本番環境ですぐに使える Terraform モジュールパターンです。
このスキルを使用しない場合
- タスクが Terraform モジュールライブラリに関係しない場合
- この範囲外の別のドメインやツールが必要な場合
手順
- 目標、制約、必要な入力を明確にします。
- 関連するベストプラクティスを適用し、結果を検証します。
- 実行可能な手順と検証方法を提示します。
目的
複数のクラウドプロバイダーにわたる一般的なクラウドインフラストラクチャパターンに対応する、再利用可能で十分にテストされた Terraform モジュールを作成します。
このスキルを使用する場合
- 再利用可能なインフラストラクチャコンポーネントを構築する
- クラウドリソースのプロビジョニングを標準化する
- Infrastructure as Code のベストプラクティスを実装する
- マルチクラウドに対応したモジュールを作成する
- 組織全体の Terraform 標準を確立する
モジュール構成
terraform-modules/
├── aws/
│ ├── vpc/
│ ├── eks/
│ ├── rds/
│ └── s3/
├── azure/
│ ├── vnet/
│ ├── aks/
│ └── storage/
└── gcp/
├── vpc/
├── gke/
└── cloud-sql/
標準的なモジュールパターン
module-name/
├── main.tf # Main resources
├── variables.tf # Input variables
├── outputs.tf # Output values
├── versions.tf # Provider versions
├── README.md # Documentation
├── examples/ # Usage examples
│ └── complete/
│ ├── main.tf
│ └── variables.tf
└── tests/ # Terratest files
└── module_test.go
AWS VPC モジュールの例
main.tf:
resource "aws_vpc" "main" {
cidr_block = var.cidr_block
enable_dns_hostnames = var.enable_dns_hostnames
enable_dns_support = var.enable_dns_support
tags = merge(
{
Name = var.name
},
var.tags
)
}
resource "aws_subnet" "private" {
count = length(var.private_subnet_cidrs)
vpc_id = aws_vpc.main.id
cidr_block = var.private_subnet_cidrs[count.index]
availability_zone = var.availability_zones[count.index]
tags = merge(
{
Name = "${var.name}-private-${count.index + 1}"
Tier = "private"
},
var.tags
)
}
resource "aws_internet_gateway" "main" {
count = var.create_internet_gateway ? 1 : 0
vpc_id = aws_vpc.main.id
tags = merge(
{
Name = "${var.name}-igw"
},
var.tags
)
}
variables.tf:
variable "name" {
description = "Name of the VPC"
type = string
}
variable "cidr_block" {
description = "CIDR block for VPC"
type = string
validation {
condition = can(cidrnetmask(var.cidr_block))
error_message = "CIDR block must be valid IPv4 CIDR notation."
}
}
variable "availability_zones" {
description = "List of availability zones"
type = list(string)
}
variable "private_subnet_cidrs" {
description = "CIDR blocks for private subnets"
type = list(string)
default = []
}
variable "enable_dns_hostnames" {
description = "Enable DNS hostnames in VPC"
type = bool
default = true
}
variable "enable_dns_support" {
type = bool
default = true
}
variable "create_internet_gateway" {
type = bool
default = false
}
variable "tags" {
description = "Additional tags"
type = map(string)
default = {}
}
outputs.tf:
output "vpc_id" {
description = "ID of the VPC"
value = aws_vpc.main.id
}
output "private_subnet_ids" {
description = "IDs of private subnets"
value = aws_subnet.private[*].id
}
output "vpc_cidr_block" {
description = "CIDR block of VPC"
value = aws_vpc.main.cidr_block
}
ベストプラクティス
- モジュールにはセマンティックバージョニングを使用する
- すべての変数に説明を記載する
examples/ディレクトリに例を用意する- 入力値の検証には検証ブロックを使用する
- モジュールを組み合わせるために重要な属性を出力する
versions.tfでプロバイダーのバージョンを固定する- 計算値にはlocals を使用する
count/for_eachで条件付きリソースを実装する- Terratest でモジュールをテストする
- すべてのリソースに一貫性のあるタグを付ける
モジュールの組み合わせ
module "vpc" {
source = "../../modules/aws/vpc"
name = "production"
cidr_block = "10.0.0.0/16"
availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
private_subnet_cidrs = [
"10.0.1.0/24",
"10.0.2.0/24",
"10.0.3.0/24"
]
tags = {
Environment = "production"
ManagedBy = "terraform"
}
}
module "rds" {
source = "../../modules/aws/rds"
identifier = "production-db"
engine = "postgres"
engine_version = "15.3"
instance_class = "db.t3.large"
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.private_subnet_ids
tags = {
Environment = "production"
}
}
参照ファイル
assets/vpc-module/- 完全な VPC モジュールの例assets/rds-module/- RDS モジュールの例references/aws-modules.md- AWS モジュールのパターンreferences/azure-modules.md- Azure モジュールのパターンreferences/gcp-modules.md- GCP モジュールのパターン
テスト
// tests/vpc_test.go
package test
import (
"testing"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestVPCModule(t *testing.T) {
terraformOptions := &terraform.Options{
TerraformDir: "../examples/complete",
}
defer terraform.Destroy(t, terraformOptions)
terraform.InitAndApply(t, terraformOptions)
vpcID := terraform.Output(t, terraformOptions, "vpc_id")
assert.NotEmpty(t, vpcID)
}
関連スキル
multi-cloud-architecture- アーキテクチャ上の判断に使用cost-optimization- 費用対効果の高い設計に使用
制限事項
- タスクが上記の説明にある範囲に明確に該当する場合にのみ、このスキルを使用してください。
- 出力を、環境固有の検証、テスト、専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、成功基準が不足している場合は、作業を中断して確認を求めてください。
VPC の断片は、ルーティング/NAT や完全なプライベートネットワークを作成しません。プランを実行する前に、すべてのサブネット CIDR、重複がないこと、VPC の範囲内にあること、十分な数のアベイラビリティーゾーンが指定されていることを検証してください。ルートテーブル/NAT に関する判断には、別途設計が必要です。RDS モジュールやその他の不足しているアセットは、このカタログから実行できません。Terratest の InitAndApply/Destroy は、課金対象のインフラストラクチャを作成/削除します。承認済みの使い捨てアカウント/ワークスペース、不変のプロバイダー/モジュールのバージョン固定、コスト上限、タスクが所有するクリーンアップを使用してください。過去のバージョンを現行の推奨事項として扱わず、現在のエンジン/プロバイダーとの互換性を確認してください。