
Terraform MCP Server (HashiCorp社) 使ってみた
はじめに
皆様こんにちは、あかいけです。
先日HashiCorp社から Terraform MCP Server が発表されました。
このMCPサーバーでは以下のツールセットが提供されており、生成されるコードの品質向上に役立てられそうです。
- providers resolveProviderDocID
- 指定されたserviceSlugを使って、Terraform Registry をクエリし、特定のプロバイダの利用可能なドキュメントを検索して一覧表示
- providers getProviderDocs
- ツールから取得したドキュメントIDを使用して、特定のプロバイダーリソース、データソース、または関数の完全なドキュメントコンテンツを取得
- modules searchModules
- 指定されたページ番号に基づいて、Terraform Registryからモジュールを検索
- modules moduleDetails
- ツールから取得したモジュールID を使用して、入力、出力、構成、サブモジュール、例など、モジュールの詳細なドキュメントを取得
またTerraform Registry上にドキュメントがあるリソースであれば検索可能なため、
様々なプロバイダーで利用できそうです。
というわけで今回はTerraform MCP Serverを使った場合と使わない場合で、
生成されるコードにどのように影響するか比較してみました。
セットアップ
詳細なセットアップ手順は以下を参照してください。
まずDockerを利用するため、必要に応じてインストールしてください。
% docker -v
Docker version 28.0.4, build b8034c0ed7
今回はMCPクライアントとしてCursorを利用するので、設定ファイルを以下のようにします。
{
"mcpServers": {
"terraform": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server"
]
}
}
}
設定画面にて、以下のようにEnableになっていれば準備完了です。
使ってみた
プロンプト
コードが正常に生成できるか、以下のプロンプトで確認します。
カレントディレクトリに以下のTerraformコードを生成してください。
最新のドキュメント(5.98.0)を参照してください。
* AWS S3 テーブルバケット aws_s3tables_table_bucket
* バケット名はtest-table-bucket-<ランダムな値>
* 暗号化用のKMSキーを作成する
* 作成したKMSキーでテーブルバケットを暗号化する
S3 テーブルバケットの暗号化設定(encryption_configuration)は、 aws provider v5.98.0 から設定できるようになった項目です。
比較的最近のアップデートでありあまり記事も出回っていないため、最新のドキュメントを参照しない限りは正しく設定するのは難しいでしょう。
MCP サーバーなしの場合
まずMCPサーバーなしの場合は、以下のコードが生成されました。
生成されたコード
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 テーブルバケットの暗号化設定ができていません。
なお追加のプロンプトでドキュメントの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
}
その後も何度か試してみましたが結果が変わらないため、
具体的な設定例を提示してあげない限りは、正しい設定はできなそうです。
MCP サーバーありの場合
次にMCPサーバーありの場合は以下の通りです。
暗号化設定(encryption_configuration)が正しく設定されています。
生成されたコード
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サーバーのツールを利用してドキュメントを検索していることがわかります。
そのままのコードでapplyも問題なく完了します。
% terraform apply;
---
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
実際にS3 テーブルバケットが指定したKMSキーで暗号化されているかの確認ですが、
現状では作成後に暗号化の状態を確認できないため、Athenaでクエリを実行して確認してみます。
まずS3 テーブルバケットの画面から、Athenaの名前空間を作成します。
その後テーブル作成用のデフォルトのクエリを実行しますが、
権限が不足しており失敗します。
これは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キーで暗号化されていることが確認できました。
さいごに
比較した通り、MCP有無の場合で生成されるコードの精度が変わることがわかりました。
なおより精度を上げるためにプロバイダーバージョンの指定など、若干細かめにプロンプトで指示する必要はありますが、
Terraform MCP Serverを活用することで最新のドキュメントに基づいたより正確なコードを生成することができます。
皆さんも今後のTerraform生活で利用してみてはいかがでしょうか。