Donngi

terraform-aws-annotated-blueprint

0
0
# Install this skill:
npx skills add Donngi/agent-skills --skill "terraform-aws-annotated-blueprint"

Install specific skill from multi-skill repository

# Description

全プロパティに詳細な解説が付いたTerraform AWSテンプレートを作成する。ユーザーが「/terraform-annotated-aws-blueprint」コマンドで構築したいインフラの概要を入力すると、Terraform Providerスキーマに基づいた正確な属性一覧と、AWS公式ドキュメントに基づく解説を含むテンプレートを生成する。

# SKILL.md


name: terraform-aws-annotated-blueprint
description: 全プロパティに詳細な解説が付いたTerraform AWSテンプレートを作成する。ユーザーが「/terraform-annotated-aws-blueprint」コマンドで構築したいインフラの概要を入力すると、Terraform Providerスキーマに基づいた正確な属性一覧と、AWS公式ドキュメントに基づく解説を含むテンプレートを生成する。


Terraform AWS Annotated Blueprint

要求された構成のTerraformテンプレートを全プロパティに詳細な解説付きで生成するスキル。

前提条件

以下のMCP serverが必須。利用不可の場合は警告・利用しているAI Agentごとの設定方法を表示し作業を終了する。

必須MCP server:
- awslabs.terraform-mcp-server - AWSプロバイダードキュメント検索・AWS Well-Architectedガイダンス・セキュリティスキャン
- aws-knowledge-mcp-server - AWS公式ドキュメント参照用

MCP server設定例:

{
  "aws-knowledge-mcp-server": {
    "command": "uvx",
    "args": ["fastmcp", "run", "https://knowledge-mcp.global.api.aws"]
  },
  "awslabs.terraform-mcp-server": {
    "command": "uvx",
    "args": ["awslabs.terraform-mcp-server@latest"],
    "env": {
      "FASTMCP_LOG_LEVEL": "ERROR"
    }
  }
}

MCP serverの役割・使い所
- awslabs.terraform-mcp-server:
- AWSプロバイダードキュメント・実装例の検索
- AWS Well-Architectedガイダンスの参照(設計判断に活用)
- Checkovによるセキュリティスキャン(生成後の検証)
- aws-knowledge-mcp-server - AWS公式ドキュメント参照

重要な原則

スキーマが信頼の源泉(Source of Truth)

terraform providers schema -json から取得したスキーマを正とする。MCPサーバーのドキュメントはスキーマに含まれない補足情報(説明文、設定可能な値の詳細等)の取得に使用する。

Web検索の禁止

インターネット検索は使用しない。情報取得はMCPサーバーのみを使用する。

ワークフロー

1. 入力の理解

ユーザーから /terraform-aws-annotated-blueprint {概要} 形式で入力を受け取り、作成したいTerraformテンプレートの要件を把握する。

2. 作業計画の作成

チェックボックス付きの計画書を {プロジェクトルート}/.local/terraform-aws-annotated-blueprint/${provider_version}/ に出力する。

計画書の必須内容:
- スキーマ取得(キャッシュがなければ実行)
- 構築が必要なリソース一覧の生成
- 各リソースの全プロパティをカテゴリ別にannotation付きで記載
- 抜け漏れ検証
- awslabs.terraform-mcp-serverを用いたCheckovによるセキュリティスキャン および 指摘事項の修正

質問タグのルール:
独自の判断はせず、意思決定が必要な際は必ずユーザーに質問をする。

判断が必要な箇所は、作業計画書内に [🤔Question] タグで質問を追加し、[✅Answer] タグで回答フィールドを作成する。
1つのタグにつき質問は1つ。複数の質問はタグを分割する。

[🤔Question] ここに質問を記載

[✅Answer]

3. 計画書の更新

ユーザーからの回答を踏まえて計画書を更新する。質問と回答のペアは削除しない。

4. 作業実行

ユーザーから承認を得てから作業を開始する。計画書のチェックボックスを更新しながら進める。

スキーマ取得方法

${プロジェクトルート}/.local/terraform-aws-annotated-blueprint/${provider_version}/schema.json が既に存在するか確認:

SCHEMA_FILE="${PROJECT_ROOT}/.local/terraform-aws-annotated-blueprint/${provider_version}/schema.json"
if [[ -f "$SCHEMA_FILE" ]]; then
  echo "スキーマファイルが存在します。スキップします。"
else
  echo "スキーマを取得します..."
  # 以下の手順を実行
fi

スキーマが存在しない場合:

  1. プロバイダー設定を作成:
# ${プロジェクトルート}/.local/terraform-aws-annotated-blueprint/${provider_version}/providers.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "{provider_version}"
    }
  }
}
  1. スキーマを取得:
cd ${プロジェクトルート}/.local/terraform-aws-annotated-blueprint/${provider_version}
terraform init
terraform providers schema -json > schema.json

スキーマからリソース情報を抽出:

jq '.provider_schemas["registry.terraform.io/hashicorp/aws"].resource_schemas["{リソース名}"]' schema.json

テンプレート生成ルール

必須要件

  • スキーマから取得した入力可能な全属性を記載
  • ネストブロック(block_types)も漏れなく記載
  • 各プロパティにコメントで解説を記載
  • AWS公式ドキュメントのURLは実在するもののみ記載
  • 推測や誤った情報は絶対に記載しない
  • 利用しないプロパティも削除せずにコメントとして残す

ファイルヘッダー

#---------------------------------------------------------------
# {リソース表示名}
#---------------------------------------------------------------
#
# {どのようなAWSリソースをプロビジョニングするかの説明}
#
# AWS公式ドキュメント:
#   - {ドキュメント名}: {URL}
#
# Terraform Registry:
#   - {URL}
#
# Provider Version: {version}
# Generated: {YYYY-MM-DD}
# NOTE: 本テンプレートは生成時点の情報に基づきAIが生成しています。
#       情報が古くなっている可能性、誤りを含む可能性があるため、
#       正確な最新仕様は公式ドキュメントを参照してください。
#
#---------------------------------------------------------------

属性の分類

テンプレートに含める属性(入力可能):
- optional: true を持つ属性
- required: true を持つ属性

テンプレートから除外する属性(computed only):
- computed: true かつ optional がない属性
- 例: arn, id, tags_all

分類確認コマンド:

# 入力可能な属性一覧
jq -r '.block.attributes | to_entries[] | select(.value.optional == true) | .key' <<< "$SCHEMA"

# computed only属性一覧
jq -r '.block.attributes | to_entries[] | select(.value.computed == true and .value.optional != true) | .key' <<< "$SCHEMA"

フォーマット

テンプレートの詳細なフォーマットは references/template_example.md を参照。

抜け漏れ検証

各リソースのテンプレート生成後、スキーマの属性一覧と照合:

# スキーマの入力可能属性一覧
jq -r '.provider_schemas["registry.terraform.io/hashicorp/aws"].resource_schemas["{リソース名}"].block.attributes | to_entries[] | select(.value.optional == true) | .key' schema.json | sort

# テンプレートに含まれる属性一覧
grep -E "^\s{2}[a-z_]+ =" {リソース名}.tf | sed 's/=.*//' | tr -d ' ' | sort

両者を比較し、差分がないことを確認。

ファイル分割ルール

以下の内容は別ファイルに分割する:

  • variables.tf: 入力変数(variable)
  • locals.tf: ローカル変数(locals)
  • data.tf: データソース(data)
  • versions.tf: Terraformバージョン制約とrequired_providers(terraformブロック)
  • providers.tf: プロバイダー設定(providerブロック)

ファイル生成単位

基本は1リソースにつき1ファイル。ただし以下は1ファイルにまとめる:

  • IAM role定義(aws_iam_role, aws_iam_policy, aws_iam_role_policy_attachment)
  • Security groupとそのegress/ingress rule
  • Route tableとそのルール
  • Target groupとそのattachment(aws_lb_target_group, aws_lb_target_group_attachment)

ファイル命名規則:
- ファイル名に aws は含めない
- 単一リソース: lambda.tf
- 複数の同一リソース: lambda_parser.tf, lambda_archiver.tf

依存関係の扱い

  • リソース参照による暗黙的な依存関係を活用する
  • 明示的なdepends_onは、暗黙的な依存関係では表現できない場合にのみ使用
  • 不要なdepends_onはコードの可読性を下げるため避ける

その他ルール

  • IAM policyの定義はdata resourceを使わず、リソースに直接jsonencodeしたポリシーを記載する

Provider最新バージョン取得

version指定がない場合は以下でTerraform Registry APIから最新バージョンを取得:

curl -s "https://registry.terraform.io/v1/providers/hashicorp/aws" | jq -r '.version'

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.