mcpField
T
terraform-module-library

terraform-module-library

github.com/midudevクラウド・DevOps7.0k57 回インストール1 週間前に更新
リポジトリ

terraform-module-library について

AWS、Azure、GCP、OCI 向けに、一般的なインフラの再利用可能な Terraform モジュールを作成するスキルです。モジュール構成、合成、検証、バージョン管理、Terratest によるテストを扱います。

主な機能

  1. 01マルチクラウドのモジュールパターン
  2. 02標準的なモジュール構成
  3. 03入力検証と出力
  4. 04モジュール合成の例
  5. 05Terratest のテスト指針

活用シーン

  1. 01再利用可能なインフラコンポーネントの構築
  2. 02クラウドリソースのプロビジョニング標準化
  3. 03マルチクラウド Terraform モジュールの作成
  4. 04組織の Terraform 標準の策定

インストール

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

$npx skills add https://github.com/midudev/autoskills --skill terraform-module-library

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

同梱ファイルreferences/aws-modules.mdreferences/oci-modules.md

詳細

Terraform モジュールライブラリ

AWS、Azure、GCP、OCI インフラストラクチャ向けの本番運用可能な Terraform モジュールパターンです。

目的

複数のクラウドプロバイダーにまたがる一般的なクラウドインフラストラクチャパターン向けに、再利用可能で十分にテストされた Terraform モジュールを作成します。

使用する場面

  • 再利用可能なインフラストラクチャコンポーネントを構築する
  • クラウドリソースのプロビジョニングを標準化する
  • Infrastructure as Code のベストプラクティスを実装する
  • マルチクラウド互換のモジュールを作成する
  • 組織の Terraform 標準を確立する

モジュール構造

terraform-modules/
├── aws/
│   ├── vpc/
│   ├── eks/
│   ├── rds/
│   └── s3/
├── azure/
│   ├── vnet/
│   ├── aks/
│   └── storage/
├── gcp/
│   ├── vpc/
│   ├── gke/
│   └── cloud-sql/
└── oci/
    ├── vcn/
    ├── oke/
    └── object-storage/

標準的なモジュールパターン

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(regex("^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$", 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 "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
}

ベストプラクティス

  1. モジュールにはセマンティックバージョニングを使用する
  2. すべての変数を説明付きで文書化する
  3. examples/ ディレクトリにサンプルを提供する
  4. 入力検証にはvalidation ブロックを使用する
  5. モジュールの組み合わせのために重要な属性を出力する
  6. versions.tf でプロバイダーのバージョンを固定する
  7. 計算値にはlocals を使用する
  8. count/for_each で条件付きリソースを実装する
  9. Terratest でモジュールをテストする
  10. すべてのリソースに一貫したタグを付ける

参照: references/aws-modules.md と references/oci-modules.md を参照してください

モジュールの組み合わせ

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"
  }
}

テスト

// 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 - コスト効率の高い設計に

コメント