infrastructure について
Terraform でクラウドリソースを管理するチーム向けの IaC スキルです。プロジェクト構成、計画と適用のワークフロー、状態管理、再利用可能なモジュール、AWS リソースの例を扱います。
主な機能
- 01Terraform プロジェクトの構成
- 02インフラ変更の計画と適用
- 03リモート状態とロックの管理
- 04インフラモジュールの再利用
- 05AWS リソースの設定
活用シーン
- 01Terraform インフラリポジトリの開始
- 02適用前の変更計画の確認
- 03環境ごとの状態の分離と保護
- 04AWS VPC、ECS、S3 リソースの構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dralgorhythm/ claude-agentic-framework --skill infrastructureインストール後、Claude Code で/infrastructureを入力して読み込まれたか確認します。
詳細
Infrastructure as Code
原則
- すべてをコードで管理:手動で変更しません
- バージョン管理:すべての変更を追跡します
- 冪等性:複数回実行しても安全です
- テスト:適用前に検証します
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
ベストプラクティス
- リモートステートを使用する:状態を S3/GCS に保存します
- 状態をロックする:同時変更を防止します
- モジュールを使用する:再利用可能なインフラストラクチャコンポーネントを使用します
- 環境を分離する:環境ごとに状態を分離します
- シークレットを管理する:コードにシークレットを保存しないでください
状態管理
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"
}
}
}
コメント
Markdown 対応