Terraform MCP Server (HashiCorp社) 使ってみた

Terraform MCP Server (HashiCorp社) 使ってみた

Clock Icon2025.05.20

はじめに

皆様こんにちは、あかいけです。

先日HashiCorp社から Terraform MCP Server が発表されました。

https://www.hashicorp.com/ja/blog/hashicorp-microsoft-build-2025-automate-secure-scale-on-azure

このMCPサーバーでは以下のツールセットが提供されており、生成されるコードの品質向上に役立てられそうです。

  • providers resolveProviderDocID
    • 指定されたserviceSlugを使って、Terraform Registry をクエリし、特定のプロバイダの利用可能なドキュメントを検索して一覧表示
  • providers getProviderDocs
    • ツールから取得したドキュメントIDを使用して、特定のプロバイダーリソース、データソース、または関数の完全なドキュメントコンテンツを取得
  • modules searchModules
    • 指定されたページ番号に基づいて、Terraform Registryからモジュールを検索
  • modules moduleDetails
    • ツールから取得したモジュールID を使用して、入力、出力、構成、サブモジュール、例など、モジュールの詳細なドキュメントを取得

またTerraform Registry上にドキュメントがあるリソースであれば検索可能なため、
様々なプロバイダーで利用できそうです。

というわけで今回はTerraform MCP Serverを使った場合と使わない場合で、
生成されるコードにどのように影響するか比較してみました。

セットアップ

詳細なセットアップ手順は以下を参照してください。

https://github.com/hashicorp/terraform-mcp-server

まずDockerを利用するため、必要に応じてインストールしてください。

筆者のバージョン
% docker -v
Docker version 28.0.4, build b8034c0ed7

今回はMCPクライアントとしてCursorを利用するので、設定ファイルを以下のようにします。

~/.cursor/mcp.json
{
  "mcpServers": {
    "terraform": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "hashicorp/terraform-mcp-server"
      ]
    }
  }
}

設定画面にて、以下のようにEnableになっていれば準備完了です。

スクリーンショット 2025-05-20 12.53.15

使ってみた

プロンプト

コードが正常に生成できるか、以下のプロンプトで確認します。

プロンプト
カレントディレクトリに以下のTerraformコードを生成してください。
最新のドキュメント(5.98.0)を参照してください。

* AWS S3 テーブルバケット aws_s3tables_table_bucket
* バケット名はtest-table-bucket-<ランダムな値>
* 暗号化用のKMSキーを作成する
* 作成したKMSキーでテーブルバケットを暗号化する

S3 テーブルバケットの暗号化設定(encryption_configuration)は、 aws provider v5.98.0 から設定できるようになった項目です。
比較的最近のアップデートでありあまり記事も出回っていないため、最新のドキュメントを参照しない限りは正しく設定するのは難しいでしょう。

https://registry.terraform.io/providers/hashicorp/aws/5.98.0/docs/resources/s3tables_table_bucket
https://github.com/hashicorp/terraform-provider-aws/releases

MCP サーバーなしの場合

まずMCPサーバーなしの場合は、以下のコードが生成されました。

生成されたコード
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.98.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# KMSキーの作成
resource "aws_kms_key" "table_bucket_key" {
  description             = "KMS key for S3 table bucket encryption"
  deletion_window_in_days = 7
  enable_key_rotation     = true

  tags = {
    Name = "table-bucket-kms-key"
  }
}

# KMSキーのエイリアス
resource "aws_kms_alias" "table_bucket_key_alias" {
  name          = "alias/table-bucket-kms-key"
  target_key_id = aws_kms_key.table_bucket_key.key_id
}

# S3テーブルバケットの作成
resource "aws_s3tables_table_bucket" "test_table_bucket" {
  name = "test-table-bucket-${random_string.suffix.result}"
}

# ランダムな文字列を生成
resource "random_string" "suffix" {
  length  = 8
  special = false
  upper   = false
}

以下は生成されたコードの説明ですが、最新のドキュメントを参照できていないため、
S3 テーブルバケットの暗号化設定ができていません。

スクリーンショット 2025-05-20 13.19.39

なお追加のプロンプトでドキュメントのURLを添付した場合でも、sse_algorithmの設定値が不足している状態でした。

生成されたコード
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.98.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# KMSキーの作成
resource "aws_kms_key" "table_bucket_key" {
  description             = "KMS key for S3 table bucket encryption"
  deletion_window_in_days = 7
  enable_key_rotation     = true

  tags = {
    Name = "table-bucket-kms-key"
  }
}

# KMSキーのエイリアス
resource "aws_kms_alias" "table_bucket_key_alias" {
  name          = "alias/table-bucket-kms-key"
  target_key_id = aws_kms_key.table_bucket_key.key_id
}

# S3テーブルバケットの作成
resource "aws_s3tables_table_bucket" "test_table_bucket" {
  name = "test-table-bucket-${random_string.suffix.result}"
  encryption_configuration {
    kms_key_id = aws_kms_key.table_bucket_key.arn
  }
}

# ランダムな文字列を生成
resource "random_string" "suffix" {
  length  = 8
  special = false
  upper   = false
}

スクリーンショット 2025-05-20 13.51.58

その後も何度か試してみましたが結果が変わらないため、
具体的な設定例を提示してあげない限りは、正しい設定はできなそうです。

MCP サーバーありの場合

次にMCPサーバーありの場合は以下の通りです。
暗号化設定(encryption_configuration)が正しく設定されています。

生成されたコード
main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.98.0"
    }
    random = {
      source  = "hashicorp/random"
      version = ">= 3.0.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

resource "random_id" "bucket_suffix" {
  byte_length = 4
}

resource "aws_kms_key" "table_bucket" {
  description             = "S3 Table Bucket Encryption Key"
  enable_key_rotation     = true
  deletion_window_in_days = 10
}

resource "aws_s3tables_table_bucket" "test" {
  name = "test-table-bucket-${random_id.bucket_suffix.hex}"
  encryption_configuration = {
    sse_algorithm = "aws:kms"
    kms_key_arn   = aws_kms_key.table_bucket.arn
  }
}

variable "aws_region" {
  description = "AWSリージョン"
  type        = string
  default     = "ap-northeast-1"
}

説明も以下の通りで、必要に応じてMCPサーバーのツールを利用してドキュメントを検索していることがわかります。

スクリーンショット 2025-05-20 13.21.59

そのままのコードでapplyも問題なく完了します。

% terraform apply;
---
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

実際にS3 テーブルバケットが指定したKMSキーで暗号化されているかの確認ですが、
現状では作成後に暗号化の状態を確認できないため、Athenaでクエリを実行して確認してみます。

まずS3 テーブルバケットの画面から、Athenaの名前空間を作成します。

スクリーンショット 2025-05-20 11.40.20

スクリーンショット 2025-05-20 11.40.37

その後テーブル作成用のデフォルトのクエリを実行しますが、
権限が不足しており失敗します。

スクリーンショット 2025-05-20 11.44.44

これはAthenaがクエリを実行する際に利用するIAMロール(S3TablesRoleForLakeFormation)に、
S3テーブルバケットの暗号化に利用したKMSキーへのアクセス権限がないためです。

そのためKMSキーのキーポリシーにて、IAMロールへアクセス権限を追加してあげます。

KMS キーポリシー
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントID>:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "EnableKeyUsage",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントID>:role/service-role/S3TablesRoleForLakeFormation",
        "Service": "maintenance.s3tables.amazonaws.com"
      },
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "<KMS ARN>",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:s3:arn": "<S3テーブルバケット ARN>/*"
        }
      }
    }
  ]
}

再度Athenaでクエリを実行すると、正常に完了しました。
以上の結果から、作成したS3テーブルバケットは、作成したKMSキーで暗号化されていることが確認できました。

スクリーンショット 2025-05-20 12.01.13

さいごに

比較した通り、MCP有無の場合で生成されるコードの精度が変わることがわかりました。

なおより精度を上げるためにプロバイダーバージョンの指定など、若干細かめにプロンプトで指示する必要はありますが、
Terraform MCP Serverを活用することで最新のドキュメントに基づいたより正確なコードを生成することができます。

皆さんも今後のTerraform生活で利用してみてはいかがでしょうか。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.