🚀

Terraform MCP Server を使ってみよう!

に公開

想定読者

  • Terraformを利用している方
  • もうちょっとTerraform Codeの生成精度あげられないかなあと思っている方。
  • terraform-mcp-server にちょっと興味がある方。

Terraform MCP Server とは?

Terraform MCP Serverは、Terraform Registryにある情報にある情報をLLMツールに渡して、より精度高くTerraformのコードを生成できるようにするためのツールです。

これ自体はDockerコンテナで動作し、各種MCP Clientに対して情報を渡します。

Terraform MCP Serverは、以下のツール群からなり、それぞれ異なる情報をTerraform Registryからとってくることができます。

  • resolveProviderDocID: プロバイダードキュメントリスト等の取得。
  • getProviderDocs: resource, data source などの具体的なドキュメントの内容を取得。
  • searchModules: 指定されたクエリに基づいてTerraform Moduleのリストを取得。
  • moduleDetails: inputs, outputs, などなど、Terraform Moduleの詳細情報を取得。

さっそく使ってみましょう!

Terraform MCP Server お試し

VS CodeのCopilotにterraform-mcp-serverからの情報を渡して、terraformのコードをよりいい感じに生成できるようになるかどうか見てみます。

0. 事前準備

0-1. Docker

前述の通り、Terraform MCP Serverを動かすためにはDockerが必要なので、まだであればインストールしておきます。

0-2. VS Code

また、ここではVS CodeのCopilotからTerraform MCP Serverに触るので、VS Codeもインストールしておきます。

1. Setup

VS CodeでMCP Supportを有効にします。
Terraform MCP Server - chat.mcp.enabled

VS Code側でMCPを使う準備ができたので、次に terraform-mcp-server の情報を VS Code に入れていきます。
MCP serverを追加する場所はいくつかありますが、ここでは VS Code の Workspace に追加します。

.vscode/mcp.json
{
"servers": {
   "terraform-mcp-server": {
      "command": "docker",
      "args": [
         "run",
         "-i",
         "--rm",
         "hashicorp/terraform-mcp-server:0.1.0"
      ]
   }
}
}

2. Run

まずは terraform-mcp-server を使わずに、適当に一個リソースを作ってみます。
GCP Provider
Google Cloud Providerが執筆時点で二日前にアップデートされているようです。👀
GCP Provider v6.38.0 release note
新しいData SourceやResourceが追加されていますね。

雑な振りを。

最新のGoogle Cloudプロバイダーを使って、google_bigquery_datasets, google_dataplex_entryを作ってください。
main.tf
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.0"
    }
  }
  required_version = ">= 1.3.0"
}

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_bigquery_dataset" "example" {
  dataset_id                  = "example_dataset"
  location                    = var.region
  description                 = "Example BigQuery dataset"
  delete_contents_on_destroy  = true
}

resource "google_dataplex_entry" "example" {
  entry_id      = "example-entry"
  lake          = var.dataplex_lake_id
  zone          = var.dataplex_zone_id
  project       = var.project_id
  location      = var.region
  type          = "TABLE"
  display_name  = "Example Entry"
  description   = "Dataplex entry for BigQuery dataset"
  asset         = "//bigquery.googleapis.com/projects/${var.project_id}/datasets/${google_bigquery_dataset.example.dataset_id}"
}

variable "project_id" {
  description = "GCPプロジェクトID"
  type        = string
}

variable "region" {
  description = "GCPリージョン"
  type        = string
  default     = "asia-northeast1"
}

variable "dataplex_lake_id" {
  description = "DataplexレイクID"
  type        = string
}

variable "dataplex_zone_id" {
  description = "DataplexゾーンID"
  type        = string
}

Chat Sample - 01

なるほど? 🧐

次に、MCP Serverを有効にして同じクエリを投げてみます。
[コンテキストの追加] > [ツール] から、先ほど追加したツール群を追加します。

main.tf
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 6.38.0"
    }
  }
  required_version = ">= 1.3.0"
}

provider "google" {
  project = var.project_id
  region  = var.region
}

resource "google_bigquery_dataset" "example" {
  dataset_id                 = "example_dataset"
  location                   = var.region
  description                = "Example BigQuery dataset"
  delete_contents_on_destroy = true
}

resource "google_dataplex_entry" "example" {
  entry_id     = "example_entry"
  lake         = var.dataplex_lake_id
  zone         = var.dataplex_zone_id
  project      = var.project_id
  location     = var.region
  type         = "TABLE"
  display_name = "Example Dataplex Entry"
  description  = "Dataplex entry for BigQuery dataset"
  asset        = "//bigquery.googleapis.com/projects/${var.project_id}/datasets/${google_bigquery_dataset.example.dataset_id}"
}

variable "project_id" {
  description = "GCPプロジェクトID"
  type        = string
}

variable "region" {
  description = "GCPリージョン"
  type        = string
  default     = "asia-northeast1"
}

variable "dataplex_lake_id" {
  description = "DataplexレイクID"
  type        = string
}

variable "dataplex_zone_id" {
  description = "DataplexゾーンID"
  type        = string
}

Chat Sample - 02

なるほど。🤔

まとめ。

どちらも完璧ではないものの、Terraform MCP Server を利用することで Copilot が Terraform Registry の内容を参照できるようになり、より精度の高いTerraformコードを生成できるようになっていますね。
そもそも Google Cloud Provider 5.台では google_dataplex_entry resource は利用できませんし。

この程度のコード量であればterraform-mcp-serverを使っても使わなくてもまあそれほど差分はないかもしれませんが、もっと大規模に利用する際には Terraform Registry の内容を参照できることの効果をより実感できることと思います。

参考

Discussion