mcpField
I
infrastructure

infrastructure

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

infrastructure について

Terraform でクラウドリソースを管理するチーム向けの IaC スキルです。プロジェクト構成、計画と適用のワークフロー、状態管理、再利用可能なモジュール、AWS リソースの例を扱います。

主な機能

  1. 01Terraform プロジェクトの構成
  2. 02インフラ変更の計画と適用
  3. 03リモート状態とロックの管理
  4. 04インフラモジュールの再利用
  5. 05AWS リソースの設定

活用シーン

  1. 01Terraform インフラリポジトリの開始
  2. 02適用前の変更計画の確認
  3. 03環境ごとの状態の分離と保護
  4. 04AWS VPC、ECS、S3 リソースの構築

インストール

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

$npx skills add https://github.com/dralgorhythm/claude-agentic-framework --skill infrastructure

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

詳細

Infrastructure as Code

原則

  1. すべてをコードで管理:手動で変更しません
  2. バージョン管理:すべての変更を追跡します
  3. 冪等性:複数回実行しても安全です
  4. テスト:適用前に検証します

Terraform の基本

プロジェクト構成
infrastructure/
├── main.tf           # Main configuration
├── variables.tf      # Input variables
├── outputs.tf        # Output values
├── providers.tf      # Provider config
├── terraform.tfvars  # Variable values
└── modules/
    └── vpc/          # Reusable modules
例:AWS VPC
# providers.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

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

  tags = {
    Name        = "${var.project}-vpc"
    Environment = var.environment
  }
}

# variables.tf
variable "vpc_cidr" {
  description = "CIDR block for VPC"
  type        = string
  default     = "10.0.0.0/16"
}

ワークフロー

# Initialize
terraform init

# Plan changes
terraform plan -out=tfplan

# Apply changes
terraform apply tfplan

# Destroy resources
terraform destroy

ベストプラクティス

  1. リモートステートを使用する:状態を S3/GCS に保存します
  2. 状態をロックする:同時変更を防止します
  3. モジュールを使用する:再利用可能なインフラストラクチャコンポーネントを使用します
  4. 環境を分離する:環境ごとに状態を分離します
  5. シークレットを管理する:コードにシークレットを保存しないでください

状態管理

terraform {
  backend "s3" {
    bucket         = "terraform-state-bucket"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

ECS/Fargate

# Task Definition
resource "aws_ecs_task_definition" "app" {
  family                   = "${var.project}-task"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = 256
  memory                   = 512
  execution_role_arn       = aws_iam_role.ecs_execution.arn

  container_definitions = jsonencode([{
    name  = "app"
    image = "${aws_ecr_repository.app.repository_url}:latest"
    portMappings = [{
      containerPort = 8080
      protocol      = "tcp"
    }]
    logConfiguration = {
      logDriver = "awslogs"
      options = {
        awslogs-group         = aws_cloudwatch_log_group.app.name
        awslogs-region        = var.aws_region
        awslogs-stream-prefix = "app"
      }
    }
  }])
}

# ECS Service
resource "aws_ecs_service" "app" {
  name            = "${var.project}-service"
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn
  desired_count   = var.app_count
  launch_type     = "FARGATE"

  network_configuration {
    subnets         = aws_subnet.private[*].id
    security_groups = [aws_security_group.app.id]
  }
}

S3 バケット

resource "aws_s3_bucket" "assets" {
  bucket = "${var.project}-assets-${var.environment}"
}

resource "aws_s3_bucket_versioning" "assets" {
  bucket = aws_s3_bucket.assets.id
  versioning_configuration {
    status = "Enabled"
  }
}

resource "aws_s3_bucket_server_side_encryption_configuration" "assets" {
  bucket = aws_s3_bucket.assets.id
  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

コメント