·

Terraform MCP với Cursor

Cài đặt Terraform MCP trong Cursor để AI agent có thể lập kế hoạch, review và quản lý hạ tầng dạng code (IaC) ngay trong trình soạn thảo.

Cursor là IDE fork từ VS Code với agent mode (chế độ agent) tích hợp sâu vào editor — khác với việc gõ lệnh qua terminal như Claude Code CLI hay Gemini CLI, Cursor cho phép AI đọc và sửa trực tiếp file HCL trong tab đang mở, thấy được cả syntax highlight và diff view native của editor. Kết hợp với Terraform MCP, Cursor phù hợp nhất cho công việc viết và refactor module hạ tầng hàng ngày, nơi bạn muốn thấy thay đổi code song song với kết quả plan trong cùng một màn hình. Bài này hướng dẫn setup, cách khai thác provider schema để tránh AI "bịa" attribute, review plan cạnh code sinh ra nó, và các hạn chế cần lưu ý.

Kết Nối Terraform MCP Vào Cursor Agent Mode

Cursor đọc cấu hình MCP từ file .cursor/mcp.json trong project, hoặc qua Settings → MCP trong UI. Với repo infra, khuyến nghị dùng file project-level để version control cùng code, đảm bảo mọi người trong team dùng chung cấu hình.

{
  "mcpServers": {
    "terraform": {
      "command": "terraform-mcp-server",
      "args": ["--workdir", "${workspaceFolder}/infra/prod"],
      "env": {
        "AWS_PROFILE": "terraform-agent-readonly"
      }
    }
  }
}

Sau khi lưu file, mở Cursor Settings → Features → MCP Servers để xác nhận server hiện trạng thái xanh (connected). Chuyển sang Agent mode (phím tắt thường là Cmd/Ctrl + I cho Composer, hoặc chọn "Agent" trong dropdown chat mode), sau đó gõ thử: "Liệt kê provider AWS đang dùng trong module này và version constraint của từng provider." Nếu agent trả lời đúng dựa trên file versions.tf/main.tf thật, kết nối MCP đã hoạt động tốt.

Mẹo: Luôn dùng biến ${workspaceFolder} thay vì đường dẫn tuyệt đối cứng trong .cursor/mcp.json khi file này được commit vào repo — đường dẫn tuyệt đối chỉ đúng trên máy bạn, sẽ gây lỗi "workdir not found" ngay khi đồng nghiệp khác clone repo và mở bằng Cursor.

Viết Và Validate HCL Với Nhận Thức Schema Provider Theo Thời Gian Thực

Lợi ích lớn nhất của Terraform MCP so với việc chỉ dùng AI autocomplete thông thường: agent có thể tra cứu registry lookup để biết chính xác attribute nào tồn tại trên resource type của provider hiện tại, thay vì "đoán" dựa trên pattern đã học từ training data (vốn có thể lỗi thời so với version provider bạn đang dùng).

Ví dụ prompt khi viết resource mới:

Tôi cần tạo aws_cloudfront_distribution cho static site, dùng
S3 origin, có custom domain qua ACM certificate. Trước khi viết,
tra cứu provider docs cho aws_cloudfront_distribution để lấy đúng
schema attribute hiện tại (đặc biệt phần origin và
viewer_certificate), tránh dùng attribute đã deprecated.

Agent gọi tool registry lookup (get_provider_docs với resource aws_cloudfront_distribution), nhận về schema mới nhất, rồi sinh code dựa trên đó — thay vì dựa vào ký ức training có thể đã cũ vài version provider. Đây là khác biệt quan trọng khi AWS provider thường xuyên thêm/đổi tên attribute giữa các minor version.

resource "aws_cloudfront_distribution" "static_site" {
  enabled = true

  origin {
    domain_name = aws_s3_bucket.site.bucket_regional_domain_name
    origin_id   = "s3-site-origin"

    s3_origin_config {
      origin_access_identity = aws_cloudfront_origin_access_identity.site.cloudfront_access_identity_path
    }
  }

  viewer_certificate {
    acm_certificate_arn      = aws_acm_certificate.site.arn
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1.2_2021"
  }

  default_cache_behavior {
    allowed_methods        = ["GET", "HEAD"]
    cached_methods          = ["GET", "HEAD"]
    target_origin_id        = "s3-site-origin"
    viewer_protocol_policy   = "redirect-to-https"
  }
}

Ngay sau khi agent sinh xong, để nó tự gọi terraform_validate và báo lỗi cú pháp trước khi bạn xem code — vòng lặp "sinh code → validate → sửa" này diễn ra nhanh hơn nhiều so với việc bạn tự chạy CLI qua terminal riêng.

Mẹo: Với resource ít dùng hoặc mới thêm gần đây trong provider (ví dụ tính năng CloudFront mới ra vài tháng), luôn yêu cầu tường minh "tra cứu provider docs trước khi viết" trong prompt — nếu không, model có xu hướng dùng pattern cũ quen thuộc từ training data, dễ sinh ra attribute đã đổi tên hoặc bị deprecated.

Review Plan Output Song Song Với Code Đã Sinh Ra Nó

Điểm khác biệt lớn nhất của Cursor so với công cụ CLI thuần: bạn có thể mở split view, một bên là file .tf vừa sửa, một bên là chat panel hiển thị plan output — giúp đối chiếu trực tiếp attribute nào trong code dẫn đến thay đổi nào trong plan, không cần switch qua switch lại giữa terminal và editor.

Quy trình thực tế:

  1. Sửa file main.tf (ví dụ thêm ingress rule mới vào security group).
  2. Trong Agent chat, prompt: "Chạy plan cho thay đổi vừa rồi, và với mỗi thay đổi trong plan, chỉ ra chính xác dòng code nào trong main.tf gây ra thay đổi đó."
  3. Agent trả về plan kèm tham chiếu dòng code, ví dụ: "aws_security_group_rule.app_ingress sẽ được tạo mới — tương ứng với block ingress bạn vừa thêm ở main.tf dòng 42-48."
  4. Bạn click vào file để nhảy tới đúng dòng, xác nhận logic đúng như ý định, rồi mới quyết định có commit không.

Cách làm này đặc biệt hữu ích khi debug plan có thay đổi không mong đợi — ví dụ bạn chỉ sửa 1 dòng nhưng plan báo 5 resource thay đổi, việc có agent chỉ đích danh dòng code nào gây ra resource nào giúp bạn tìm ra ngay resource nào bị ảnh hưởng gián tiếp qua dependency, thay vì đọc lại toàn bộ diff bằng mắt.

Mẹo: Khi plan báo nhiều thay đổi hơn bạn tưởng, đừng chỉ hỏi "tại sao có thay đổi này" — hỏi cụ thể "resource X có phụ thuộc (depends_on hoặc implicit reference) vào resource Y mà tôi vừa sửa không, và qua attribute nào" để agent truy ngược đúng chuỗi dependency thay vì suy đoán chung.

Hạn Chế Và Cách Khắc Phục Khi Dùng Terraform MCP Trong Cursor

Một vài hạn chế thực tế cần biết trước khi đưa Cursor + Terraform MCP vào quy trình chính thức của team:

  • Agent mode có thể tự động sửa nhiều file cùng lúc nếu không giới hạn phạm vi. Cursor Agent mode có khả năng chỉnh sửa (edit) hàng loạt file trong một lần chạy — với repo infra, nên luôn review diff trước khi accept, không dùng chế độ "auto-accept" cho thay đổi liên quan Terraform.
  • Tool nguy hiểm cần chặn tường minh qua permission. Cursor cho phép cấu hình danh sách tool cần "always ask" trong Settings → MCP Tools; đảm bảo terraform_apply (nếu server có expose tool này) luôn nằm trong danh sách yêu cầu xác nhận, không nằm trong danh sách auto-approve.
  • Provider docs lookup vẫn có thể trả về thông tin chưa đúng version provider bạn pin. Nếu bạn pin AWS provider version 4.x nhưng registry lookup trả doc mới nhất của 5.x, có thể có attribute không tồn tại ở version bạn dùng — luôn kiểm tra lại required_providers trong versions.tf và nói rõ version đó cho agent khi cần.
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

Mẹo: Luôn khai báo required_providers với version constraint rõ ràng (~> 5.0 chứ không để trống) ngay từ đầu module, và nhắc agent kiểm tra file này trước khi tra cứu docs — tránh tình trạng agent gợi ý attribute của version provider khác với version bạn thực sự đang pin trong lock file.

Mẹo Tối Ưu Trải Nghiệm Agent Mode Cho Công Việc Terraform Hàng Ngày

Sau khi đã quen với setup cơ bản, đây là những tinh chỉnh giúp Cursor Agent mode trở thành công cụ đáng tin cậy cho công việc Terraform lặp lại mỗi ngày, không chỉ dùng thử một lần rồi bỏ:

  • Tạo rule riêng cho thư mục infra qua .cursor/rules. Cursor hỗ trợ rule theo path pattern — viết một rule áp dụng riêng cho infra/**/*.tf nhắc agent luôn chạy validate trước khi báo hoàn thành, và luôn hỏi xác nhận trước khi động vào resource có tag Role = production.
  • Dùng Composer (chế độ multi-file) cho refactor lớn, dùng Chat thường cho câu hỏi nhanh. Composer phù hợp khi bạn cần sửa nhiều file .tf đồng bộ (ví dụ đổi tên biến dùng chung qua nhiều module); Chat thường đủ và nhanh hơn cho câu hỏi kiểu "resource này có attribute gì".
  • Review lại lịch sử tool call (nếu Cursor version bạn dùng có log riêng cho MCP calls) sau mỗi phiên làm việc phức tạp — việc này giúp bạn phát hiện agent có gọi tool nào ngoài dự kiến (ví dụ gọi terraform_apply dù bạn không yêu cầu) trước khi nó gây hậu quả thật.
---
globs: infra/**/*.tf
---
Luôn chạy terraform_validate sau khi sửa bất kỳ file .tf nào
trong thư mục này trước khi báo hoàn thành.
Luôn hỏi xác nhận người dùng trước khi đề xuất thay đổi động
vào resource có tag Role = "production".

Mẹo: Viết rule .cursor/rules như trên và commit vào repo — khác với việc chỉ nhắc trong từng prompt riêng lẻ (dễ quên nhắc), rule này áp dụng tự động cho mọi phiên làm việc trong thư mục infra/, kể cả khi đồng nghiệp khác mở project mà chưa từng đọc hướng dẫn này.