AgentSkillsCN

terraform-aws-annotated-reference

为单一 Terraform AWS 资源生成附带完整属性说明的参考模板。当用户指定资源名称(例如:aws_s3_bucket、aws_lambda_function)时,系统将依据 Provider Schema 生成精确的属性清单,并结合 AWS 官方文档,为每个属性提供详细的注释与说明。“为 aws_xxx 创建模板”“告诉我 aws_xxx 的所有属性”等请求均可使用此技能。

SKILL.md
--- frontmatter
name: terraform-aws-annotated-reference
description: 単一のTerraform AWSリソースに対する全プロパティ解説付きリファレンステンプレートを生成する。ユーザーがリソース名(例:aws_s3_bucket, aws_lambda_function)を指定すると、Providerスキーマに基づいた正確な属性一覧とAWS公式ドキュメントに基づく解説を含むテンプレートを出力する。「aws_xxxのテンプレートを作成して」「aws_xxxの全プロパティを教えて」などのリクエストで使用。

Terraform AWS Annotated Reference

単一AWSリソースの全プロパティに詳細解説付きのリファレンステンプレートを生成する。

前提条件

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

必須MCP server:

  • awslabs.terraform-mcp-server - AWSプロバイダードキュメント・実装例の検索
  • aws-knowledge-mcp-server - AWS公式ドキュメント参照用

MCP server設定例:

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

重要な原則

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

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

Web検索の禁止

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

ワークフロー

1. 入力の確認

ユーザーから以下を取得:

  • リソース名 (必須): aws_cloudwatch_log_group など
  • AWS Providerバージョン (任意): 指定がなければ最新バージョンを使用
  • 出力先ディレクトリ (任意): 指定がなければ ${プロジェクトルート}/.local/terraform-aws-annotated-reference を使用

入力例:

自然言語での指定:

code
aws_s3_bucketのテンプレートを作成して
aws_lambda_functionのテンプレートを ./terraform/refs に出力して
aws_iam_role(v5.80.0)のリファレンスを ./docs/terraform に作成して

引数形式での指定:

code
/terraform-aws-annotated-reference aws_s3_bucket
/terraform-aws-annotated-reference aws_lambda_function --output ./terraform/refs
/terraform-aws-annotated-reference aws_iam_role --version 5.80.0 --output ./docs/terraform

バージョン未指定時はTerraform Registry APIから最新バージョンを取得:

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

2. スキーマの存在確認と取得

${出力先ディレクトリ}/${provider_version}/schema.json が既に存在するか確認:

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

2a. スキーマ取得用Terraform設定の作成(スキーマが存在しない場合のみ)

${出力先ディレクトリ}/${provider_version}/ ディレクトリにプロバイダー設定を作成:

hcl
# ${出力先ディレクトリ}/${provider_version}/providers.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "{provider_version}"
    }
  }
}

2b. プロバイダースキーマの取得(スキーマが存在しない場合のみ)

bash
cd ${OUTPUT_DIR}/${provider_version}
terraform init
terraform providers schema -json > schema.json

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

スキーマJSONから対象リソースの情報を抽出:

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

抽出対象:

  • .block.attributes - 通常の属性
  • .block.block_types - ネストブロック(vpc_config等)

4. 属性の分類

スキーマの各属性を以下のルールで分類:

テンプレートに含める属性(入力可能):

  • optional: true を持つ属性
  • required: true を持つ属性

テンプレートから除外する属性(computed only):

  • computed: true かつ optional がない属性
  • 例: arn, id, tags_all

分類確認コマンド:

bash
# 入力可能な属性一覧
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"

5. ドキュメント情報の取得

aws-knowledge-mcp-serverを使用して補足情報を取得:

  • aws___search_documentation でAWS公式ドキュメントを検索
  • aws___read_documentation で詳細情報を取得

6. テンプレート生成

references/template_example.md のフォーマットに従いテンプレートを生成。

必須要件:

  • スキーマから取得した入力可能な全属性を記載
  • ネストブロック(block_types)も漏れなく記載
  • 各プロパティにコメントで解説を記載
  • AWS公式ドキュメントのURLは実在するもののみ記載
  • 推測や誤った情報は絶対に記載しない
  • ファイルヘッダーやプロパティのコメントは必ずreferences/template_example.md のフォーマットと同一とする
  • 言語は日本語とする

ファイルヘッダー:

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

7. 抜け漏れ検証

スキーマの属性一覧と生成したテンプレートを照合:

bash
# スキーマの入力可能属性一覧
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

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

8. フォーマット検証

生成したテンプレートが 6. テンプレート生成 に記載された必須要件を満たしていることを確認する。 満たしていない場合は、再度6. テンプレート生成から処理を再実行する。

9. ファイル出力

出力先: ${出力先ディレクトリ}/${provider_version}/${リソース名}.tf

例(デフォルト): ./.local/terraform-aws-annotated-reference/6.28.0/aws_cloudwatch_log_group.tf 例(カスタム): ./terraform/references/6.28.0/aws_cloudwatch_log_group.tf

品質要件

  1. 正確性: スキーマを信頼の源泉とし、MCPサーバーは補足情報として使用
  2. 網羅性: スキーマの全入力可能属性(attributes + block_types)を記載
  3. 検証可能性: 記載するURLは全て実在するものであること
  4. 除外の明確性: computed only属性はAttributes Referenceセクションに記載