Claude CodeとMCPサーバーでTerraform開発を効率化
はじめに
Terraform開発において、ドキュメント検索、セキュリティスキャン、バリデーション実行など、繰り返し行う作業に時間を取られていませんか?
本記事では、Claude CodeとMCPサーバーを組み合わせることで、Terraform開発のワークフローを劇的に改善する方法を紹介します。
この記事で学べること
- MCPサーバーの基本概念
- Claude CodeでのTerraform開発環境の構築手順
- AWS環境での実践的な使い方
- カスタムコマンドによる自動化
対象読者
- Terraformで日常的にインフラ管理を行っている方
- CI/CDパイプラインの前段階でコードチェックを強化したい方
- AWS環境でのインフラ開発を効率化したい方
MCPサーバーとは何か
Model Context Protocol (MCP) の概要
MCP (Model Context Protocol) は、AIアプリケーションと外部データソースやツールを標準化された方法で接続するためのオープンプロトコルです。Claude CodeやClaude Desktopをはじめ、様々なAIツールでこのプロトコルを利用することで、外部システムとの連携機能を追加できます。
Claude Codeは標準でファイル操作、bash実行などの機能を持っていますが、MCPサーバーを追加することで:
- AWS/Terraform専用ツールの統合
- 外部APIへのリアルタイムアクセス
- セキュリティスキャン機能の自動実行
- 最新ドキュメントへの参照
などが可能になります。
採用した3つのMCPサーバー
Terraform開発に最適化された、以下の3つのMCPサーバーを採用しました:
| MCPサーバー | 提供機能 | メリット |
|---|---|---|
| aws-terraform | Terraform/Terragrunt実行、Checkovセキュリティスキャン、AWSプロバイダードキュメント検索 | Claude Codeの組み込みツールでは提供されないAWS/Terraform専用機能 |
| terraform-registry | Terraform Registry検索、モジュール詳細取得、プロバイダー情報取得 | 最新のTerraformモジュール/プロバイダー情報にリアルタイムアクセス |
| aws-knowledge | AWS公式ドキュメント検索・取得、サービス推奨情報 | AWSの最新ドキュメントと推奨事項を直接参照 |
作業効率への具体的な効果
実際の開発現場では、以下のような効率化が可能になります:
❌ MCPなし:
手動でドキュメント検索 → 設定をコピー → 構文チェック → 修正
✅ MCPあり:
「S3バケットを暗号化有効で作成」 → 自動生成 → セキュリティスキャン → 修正提案
セットアップ手順
STEP 1: 前提条件の確認
1-1. 必要なツールとバージョン
| ツール | 推奨バージョン | 確認コマンド |
|---|---|---|
| Node.js | 22 LTS または 24 LTS | node --version |
| Python | 3.13.x | python --version |
| uv | 0.9.7以降 | uv --version |
| AWS CLI | v2.27.41以降 | aws --version |
| Docker | 4.44以降 | docker --version |
| Terraform | 1.14以降 | terraform version |
1-2. 環境確認スクリプト
#!/bin/bash
# check-prerequisites.sh
echo "=== 環境確認 ==="
echo "Node.js: $(node --version)"
echo "Python: $(python --version)"
echo "uv: $(uv --version)"
echo "AWS CLI: $(aws --version)"
echo "Docker: $(docker --version)"
echo "Terraform: $(terraform version | head -1)"
1-3. 不足ツールのインストール (macOS)
# Node.js 24 LTS
brew install node@24
# Python 3.13
brew install python@3.13
# uv (Python package manager) - MCP必須
brew install uv
# AWS CLI v2
brew install awscli
# Terraform
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
# Claude Code CLI
brew install --cask claude-code
# Docker Desktop
# https://www.docker.com/products/docker-desktop からダウンロード
1-4. Docker Desktop の起動確認
# Dockerが起動しているか確認
docker ps
# エラーが出る場合 → Docker Desktopを起動
open -a Docker # macOS
1-5. uv/uvx の動作確認
# uvとuvxのバージョン確認
uv --version
uvx --version
# ✅ 両方とも表示されればOK:
# uv 0.9.7 (Homebrew 2025-10-30)
# uvx 0.9.7 (Homebrew 2025-10-30)
# ❌ "command not found" の場合:
brew install uv
# インストール後、シェルを再起動
exec $SHELL -l
STEP 2: AWS SSO認証設定
2-1. AWS設定ファイルの準備
# AWS設定ファイルの確認
cat ~/.aws/config
AWS SSOを使用した設定例:
# ~/.aws/config
[profile example-dev]
sso_start_url = https://your-org.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = 123456789012
sso_role_name = DeveloperAccess
region = ap-northeast-1
[profile example-stg]
sso_start_url = https://your-org.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = 234567890123
sso_role_name = DeveloperAccess
region = ap-northeast-1
[profile example-prd]
sso_start_url = https://your-org.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = 345678901234
sso_role_name = AdminAccess
region = ap-northeast-1
2-2. SSOログイン
# 各環境にログイン
aws sso login --profile example-dev
aws sso login --profile example-stg
aws sso login --profile example-prd
# ブラウザが開くので、SSOで許可
# 認証確認
aws sts get-caller-identity --profile example-dev
# ✅ 以下のように表示されればOK:
# {
# "UserId": "...",
# "Account": "123456789012",
# "Arn": "arn:aws:sts::123456789012:assumed-role/..."
# }
STEP 3: プロジェクト構造の作成
3-1. ディレクトリ構造
# Terraformプロジェクトのディレクトリに移動
cd /path/to/your/terraform-project
# 必要なディレクトリを作成
mkdir -p .claude/commands
# 作成されたディレクトリを確認
ls -la .claude/
# ✅ 期待される構造:
# .claude/
# └── commands/
STEP 4: MCP設定ファイルの作成
4-1. .mcp.json の作成
重要: Claude CodeはPATH環境変数を正しく読み込まないことがあるため、コマンドはフルパスで指定してください。
# コマンドのフルパスを確認
which uvx # 例: /opt/homebrew/bin/uvx
which docker # 例: /usr/local/bin/docker
4-2. .mcp.json 実装例
{
"mcpServers": {
"aws-terraform": {
"command": "/opt/homebrew/bin/uvx",
"args": ["awslabs.terraform-mcp-server@latest"],
"env": {
"AWS_PROFILE": "example-dev",
"AWS_REGION": "ap-northeast-1",
"FASTMCP_LOG_LEVEL": "ERROR"
},
"description": "AWS Terraform MCP Server v1.0.7 - Checkov統合"
},
"terraform-registry": {
"command": "/usr/local/bin/docker",
"args": [
"run", "-i", "--rm",
"hashicorp/terraform-mcp-server:0.3.0"
],
"description": "HashiCorp Terraform MCP Server v0.3.0"
},
"aws-knowledge": {
"command": "/opt/homebrew/bin/uvx",
"args": ["fastmcp", "run", "https://knowledge-mcp.global.api.aws"],
"description": "AWS Knowledge MCP Server - 公式ドキュメント"
}
}
}
4-3. JSON構文の確認
# JSON構文チェック
cat .mcp.json | jq .
# ✅ エラーが出なければOK
# サーバー一覧を確認
cat .mcp.json | jq -r '.mcpServers | keys[]'
# ✅ 以下のように表示される:
# aws-terraform
# terraform-registry
# aws-knowledge
STEP 5: 複数AWS環境の管理
開発、ステージング、本番の3つの環境を管理する方法を紹介します。
5-1. 環境別設定ファイルの作成
# 現在の .mcp.json をベースに環境別ファイルを作成
cp .mcp.json .mcp.dev.json
cp .mcp.json .mcp.stg.json
cp .mcp.json .mcp.prd.json
# 各ファイルでAWS_PROFILEを変更
sed -i '' 's/"AWS_PROFILE": "example-dev"/"AWS_PROFILE": "example-dev"/' .mcp.dev.json
sed -i '' 's/"AWS_PROFILE": "example-dev"/"AWS_PROFILE": "example-stg"/' .mcp.stg.json
sed -i '' 's/"AWS_PROFILE": "example-dev"/"AWS_PROFILE": "example-prd"/' .mcp.prd.json
# .mcp.json をシンボリックリンクに変更
rm .mcp.json
ln -s .mcp.dev.json .mcp.json
# 現在の環境を確認
ls -la .mcp.json
# → .mcp.json -> .mcp.dev.json と表示される
5-2. 環境切り替えスクリプト
#!/bin/bash
# switch-env.sh - AWS環境の切り替え
set -e
ENV="${1:-dev}"
case "$ENV" in
dev|stg|prd)
echo "🔄 環境を ${ENV} に切り替え中..."
ln -sf .mcp.${ENV}.json .mcp.json
echo "✅ 環境切り替え完了: $(readlink .mcp.json)"
echo ""
echo "次のステップ:"
echo "1. AWS SSOログイン: aws sso login --profile example-${ENV}"
echo "2. 認証確認: aws sts get-caller-identity --profile example-${ENV}"
echo "3. Claude Code再起動: exit してから claude code"
;;
*)
echo "使用方法: $0 {dev|stg|prd}"
exit 1
;;
esac
使用方法:
# スクリプトに実行権限を付与
chmod +x switch-env.sh
# 開発環境に切り替え
./switch-env.sh dev
# ステージング環境に切り替え
./switch-env.sh stg
# 本番環境に切り替え
./switch-env.sh prd
STEP 6: Claude Code設定ファイルの作成
6-1. プロジェクト共通設定 (settings.json)
{
"model": "claude-sonnet-4-5-20250929",
"includeCoAuthoredBy": true,
"cleanupPeriodDays": 90,
"enableAllProjectMcpServers": true,
"permissions": {
"allow": [
"Bash:terraform *",
"Bash:terragrunt *",
"Bash:aws sso login *",
"Bash:git *",
"Read:**/*.tf",
"Read:**/*.tfvars",
"Read:**/*.hcl",
"Edit:**/*.tf",
"Edit:**/*.hcl",
"Write:**/*.tf",
"Write:**/*.hcl"
],
"defaultMode": "acceptEdits"
}
}
6-2. 設定項目の説明
| プロパティ | 値 | 説明 |
|---|---|---|
| model | claude-sonnet-4-5-20250929 | Claude Sonnet 4.5(最新・最高性能モデル) |
| includeCoAuthoredBy | true | Gitコミットに「Co-authored-by: Claude」を追加 |
| cleanupPeriodDays | 90 | チャット履歴を90日間保持 |
| enableAllProjectMcpServers | true | .mcp.jsonで定義されたMCPサーバーを自動承認 |
| permissions.allow | 配列 | 自動許可するツール操作 |
| permissions.defaultMode | acceptEdits | ファイル編集を自動承認 |
STEP 7: カスタムコマンドの作成
7-1. terraform-plan コマンド
Terraform検証の定型作業を自動化するカスタムコマンドです。
---
name: terraform-plan
description: Terraformの安全な検証ワークフロー(Plan Reviewまで)
---
# Terraform Validation Workflow
以下の安全な検証手順に従ってください:
## 1. Pre-deployment Checks
- `terraform fmt -recursive` でコードをフォーマット
- `terraform validate` で構文チェック
- `aws sts get-caller-identity` でAWS認証確認
## 2. Security Scan
- Checkovセキュリティスキャンを実行 (aws-terraform MCP経由)
- HIGH/CRITICALの問題を確認
- 自動修正可能な項目があれば提案
## 3. Plan Review
- `terraform plan -out=tfplan` でプランを生成
- 変更内容を詳細にレビュー
- コスト見積もりを提示(可能な場合)
7-2. security-scan コマンド
セキュリティスキャンの包括的なチェックを自動化します。
---
name: security-scan
description: 包括的なセキュリティスキャン
---
# Comprehensive Security Scan
包括的なセキュリティスキャンを実行してください:
## 1. Terraform Code Scan
- aws-terraform MCPサーバーを使用してCheckovを実行
- 以下の項目に注目:
- CIS AWS Foundations Benchmark
- GDPR compliance
- セキュリティグループの設定
- 暗号化設定
## 2. IAM Policy Review
- 過度に寛容なポリシーを特定
- ワイルドカード (*) 権限をチェック
- 最小権限の原則に準拠しているか確認
## 3. Network Security
- セキュリティグループルールをレビュー
- オープンな ingress (0.0.0.0/0) をチェック
- VPC設定を確認
## 4. Encryption
- 保管時の暗号化を確認
- 転送時の暗号化をチェック
- KMSキーの使用状況をレビュー
## 5. Report
- 発見事項のサマリーを提供
- 深刻度で優先順位付け (CRITICAL, HIGH, MEDIUM, LOW)
- 修復手順を提案
STEP 8: 動作確認
8-1. AWS認証の確認
# AWS認証状態を確認
aws sts get-caller-identity --profile example-dev
# ✅ 正常に表示されればOK
# ❌ エラーの場合: aws sso login --profile example-dev
8-2. Claude Code の起動
# ターミナルでClaude Codeを起動
claude code
# ✅ 以下のような表示が出ればOK:
# Claude Code v2.0.x
# Loading project configuration...
# ✓ Found .mcp.json
# ✓ Found .claude/settings.json
8-3. MCPサーバーの選択
初回起動時、以下のような画面が表示されます:
3 new MCP servers found in .mcp.json
Select any you wish to enable.
❯ aws-terraform ✔
terraform-registry ✔
aws-knowledge ✔
操作方法:
-
スペースキー: 各項目のチェック切り替え -
↑↓ 矢印キー: 項目移動 -
Enter: 選択完了
✅ すべてに ✔ を付けてEnterを押してください
8-4. MCPサーバーの状態確認
# Claude Code内で実行
/mcp
# ✅ 以下のように表示されればOK:
# MCP Server Status
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━
# • aws-terraform: connected
# • terraform-registry: connected
# • aws-knowledge: connected
実践: 日常的な開発ワークフロー
ワークフロー全体像
Claude CodeとMCPサーバーを使った、典型的な1日の開発フローを紹介します。
🌅 朝: 環境準備
↓
💻 開発: コーディング & レビュー
↓
🔍 検証: セキュリティスキャン & Plan
↓
✅ 完了: コミット & PR作成
1. 朝の準備: 環境のセットアップ
1-1. AWS認証とClaude Code起動
# AWS SSOにログイン
aws sso login --profile example-dev
# Terraformプロジェクトに移動
cd /path/to/your/terraform-project
# Claude Codeを起動
claude code
1-2. MCPサーバーの接続確認
Claude Code起動後、最初にMCPサーバーの状態を確認します:
あなた: /mcp
Claude Code:
MCP Server Status
━━━━━━━━━━━━━━━━━━━━━━━━━━━
• aws-terraform: connected ✓
• terraform-registry: connected ✓
• aws-knowledge: connected ✓
2. MCPサーバーとの自然な対話
カスタムコマンドを使わず、自然言語でClaude Codeに依頼する方法を紹介します。
ケース1: AWS公式ドキュメントの参照
シナリオ: RDSのバックアップポリシーについて最新情報を確認したい
あなた:
RDSの自動バックアップのベストプラクティスを教えて。
特にバックアップ保持期間とバックアップウィンドウの推奨設定を知りたい。
Claude Code:
aws-knowledge MCPサーバーを使用してAWS公式ドキュメントを検索します...
📚 AWS公式ドキュメントより:
■ バックアップ保持期間
- 推奨: 7日間以上
- 最大: 35日間
- 本番環境: 30日間を推奨
■ バックアップウィンドウ
- トラフィックが少ない時間帯を選択
- 日本リージョンの場合: 深夜2:00-4:00 (JST) が一般的
- メンテナンスウィンドウと重複しないよう設定
Terraformでの実装例を提示しますか?
ケース2: Terraformモジュールの検索
シナリオ: VPC作成に適したモジュールを探したい
あなた:
AWS VPCを作成したい。Terraform Registryで評価の高いモジュールを教えて。
Claude Code:
terraform-registry MCPサーバーを使用してモジュールを検索します...
🔍 検索結果:
1. terraform-aws-modules/vpc/aws
- バージョン: 5.17.0
- ダウンロード数: 128M+
- 評価: ⭐⭐⭐⭐⭐
- 特徴: AWS公式推奨、本番環境実績多数
主な機能:
- パブリック/プライベートサブネット自動作成
- NAT Gateway自動構成
- VPC Flow Logs対応
- タグ管理
このモジュールを使用したコード例を作成しますか?
ケース3: セキュリティスキャンの実行
シナリオ: 新しく作成したS3バケットの設定をチェックしたい
あなた:
s3.tfファイルのセキュリティをCheckovでスキャンして。
Claude Code:
aws-terraform MCPサーバーを使用してCheckovスキャンを実行します...
🔍 セキュリティスキャン結果 (s3.tf)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ CRITICAL: 2件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. CKV_AWS_18: S3バケットの暗号化が未設定
行: 12
リソース: aws_s3_bucket.data
推奨修正:
resource "aws_s3_bucket_server_side_encryption_configuration" "data" {
bucket = aws_s3_bucket.data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
2. CKV_AWS_21: バージョニングが無効
行: 12
リソース: aws_s3_bucket.data
推奨修正:
resource "aws_s3_bucket_versioning" "data" {
bucket = aws_s3_bucket.data.id
versioning_configuration {
status = "Enabled"
}
}
修正コードを自動適用しますか?
3. 実践的なシナリオ例
シナリオA: S3バケットを暗号化有効で作成
あなた:
S3バケットを作成したい。要件は以下:
- バケット名: my-app-logs
- 暗号化: 有効 (AES256)
- バージョニング: 有効
- パブリックアクセス: 完全ブロック
Claude Code:
AWS公式ドキュメントとTerraform Registryを参照して、
CIS Benchmark準拠のコードを作成します...
📝 s3.tf に以下を追加:
[コード生成]
Checkovでセキュリティスキャンを実行しますか?
シナリオB: RDS構築前のベストプラクティス確認
あなた:
本番環境用のRDS PostgreSQL 16を構築したい。
AWSの推奨設定を教えて。
Claude Code:
aws-knowledge MCPサーバーでAWS公式ドキュメントを検索します...
📚 本番環境RDSの推奨構成:
✅ 必須設定
- マルチAZ配置: 有効
- 暗号化: 有効 (KMS推奨)
- 自動バックアップ: 30日間保持
- 拡張モニタリング: 有効
✅ セキュリティ
- パブリックアクセス: 無効
- IAMデータベース認証: 推奨
- セキュリティグループ: 最小権限
✅ パフォーマンス
- インスタンスタイプ: db.r6g.xlarge以上
- ストレージ: gp3 (最新世代)
- Performance Insights: 有効
これらを満たすTerraformコードを作成しますか?
4. カスタムコマンドの活用
より定型的な作業には、カスタムコマンドが便利です。
4-1. terraform-plan コマンド
# Claude Code内で実行
/terraform-plan
自動実行される処理:
-
コードフォーマット:
terraform fmt -recursive -
構文チェック:
terraform validate -
AWS認証確認:
aws sts get-caller-identity - セキュリティスキャン: Checkov経由でCIS Benchmark準拠チェック
-
プラン生成:
terraform plan -out=tfplan - レビュー: 変更内容の詳細分析
実行結果例:
✅ フォーマット完了
✅ 構文チェック: エラーなし
✅ AWS認証確認: example-dev (123456789012)
🔍 Checkovセキュリティスキャン:
- スキャン対象: 15ファイル
- 問題なし: 47チェック
- 警告: 2件 (自動修正可能)
📊 Terraform Plan:
+ 3 リソースを追加
~ 1 リソースを変更
- 0 リソースを削除
変更内容の詳細をレビューしますか?
4-2. security-scan コマンド
# Claude Code内で実行
/security-scan
実行結果例:
🔍 包括的セキュリティスキャン
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ CRITICAL: 0件 ✅
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ HIGH: 2件 ⚠️
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Security Group: 過度に寛容なingress
ファイル: sg.tf:23
問題: 0.0.0.0/0 から port 3306 (MySQL) への接続を許可
修正: 特定のIPアドレス範囲に制限
2. IAM Policy: ワイルドカード権限
ファイル: iam.tf:45
問題: "s3:*" が許可されている
修正: 必要な権限のみを明示的に指定
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ MEDIUM: 3件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
...
優先度順に修正コードを提案しますか?
5. 環境別の作業フロー
開発環境での作業
# 開発環境に切り替え
./switch-env.sh dev
# Claude Code再起動
claude code
# 通常の開発作業
# - MCPサーバーとの対話でコード作成
# - terraform-planで検証
# - 問題なければコミット
本番環境へのデプロイ前
# 本番環境に切り替え
./switch-env.sh prd
# Claude Code再起動
claude code
# 慎重な検証
あなた: /security-scan
あなた: /terraform-plan
# レビュー後、手動でapply
# (Claude Codeは検証のみ、デプロイは手動)
まとめ
推奨ディレクトリ構造
your-terraform-project/
├── .mcp.json # MCPサーバー定義
├── .mcp.dev.json # 開発環境設定
├── .mcp.stg.json # ステージング環境設定
├── .mcp.prd.json # 本番環境設定
├── .claude/
│ ├── settings.json # プロジェクト設定
│ └── commands/ # カスタムコマンド
│ ├── terraform-plan.md
│ └── security-scan.md
├── .gitignore # Git除外設定
└── terraform/ # Terraformコード
├── main.tf
├── variables.tf
└── ...
MCPサーバーの使い分け
| MCPサーバー | 主な用途 | 使用例 |
|---|---|---|
| aws-terraform | セキュリティスキャン、Terraform実行 | 「Checkovでスキャンして」 |
| terraform-registry | モジュール/プロバイダー検索 | 「VPCモジュールを探して」 |
| aws-knowledge | AWS公式ドキュメント参照 | 「RDSのベストプラクティスを教えて」 |
実践での活用ポイント
自然言語での対話を活用
✅ 良い例:
「本番環境用のS3バケットを作成したい。暗号化とバージョニングを有効にして。」
❌ 悪い例:
コマンドラインでマニュアル操作
カスタムコマンドとの使い分け
- 自然言語: 新規機能開発、調査、ベストプラクティス確認
- カスタムコマンド: 定型作業、CI/CD前の検証
重要なポイント
- 設定ファイルは
.mcp.jsonのみ - プロパティ名は
"mcpServers" - コマンドはフルパスで指定
-
モデルは Claude Sonnet 4.5 (
claude-sonnet-4-5-20250929) - 環境切り替え時は必ずClaude Codeを再起動
- AWS SSOを使用 (静的認証情報は非推奨)
- terraform-planは検証のみ (デプロイは手動実行)
環境別の使い分け
| 環境 | AWS_PROFILE | 用途 |
|---|---|---|
| 開発 | example-dev | 開発・検証 |
| ステージング | example-stg | 本番前テスト |
| 本番 | example-prd | 本番環境(慎重に) |
Discussion