๐Ÿš€ Terraform + MCP: ๋” ๋˜‘๋˜‘ํ•˜๊ณ  ๋” ํ˜์‹  ์ธํ”„๋ผ๋กœ?!?!

:books:|์ฃผ๋œ ๋‚ด์šฉ์€ Terraform MCP Server๊ฐ€ AI Model๊ณผ Terraform Registry ์—ฐ๊ฒฐ๋˜์„œ, Terraform ์„ค์ •์— ํ•„์š”ํ•œ ์‹ค์‹œ๊ฐ„ ๋ฌธ์„œ ยท Schema ยท Module ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์ด๋ฅผ ํ†ตํ•ด์„œ, IaC ์ž‘์„ฑ, ์ตœ์‹  Provider ์ •๋ณด ์ œ๊ณต ๋“ฑ DevOps ์ƒ์‚ฐ์„ฑ ๊ทน๋Œ€ํ™”ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

:heart: ๋ชจ๋“  Case์— 100% ํ™•์‹ ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉํ•ด์•ผํ•  ์ˆ˜ ์žˆ์„์ง€ ์•„๋ž˜ ๋ชจ๋ฒ” ์ƒ์„ธ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.

[์ถœ์ฒ˜] Terraform + MCP: Your Fast Track to Smarter, Faster Infrastructure | by rajni singh | GenusofTechnology | Aug, 2025 | Medium ์˜ ๋‚ด์šฉ์„ ๋ฒˆ์—ญํ•  ๊ธ€์ž…๋‹ˆ๋‹ค.

HashiCorp์˜ Terraform MCP Server๋Š” AI ๋„๊ตฌ๋ฅผ Terraform Registry์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ(Providers, Resources, Modules, Policies)์— ์ง์ ‘ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋Š” ๊ทผ๊ฑฐ ์žˆ๋Š” ๋‹ต๋ณ€๊ณผ ๋” ๋‚˜์€ IaC ์ž‘์„ฑ ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ๋Š” MCP๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋กœ์ปฌ ๋˜๋Š” ์›๊ฒฉ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์„ฑํ™”ํ•˜๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋ฉฐ, ์ฒซ๋‚ ๋ถ€ํ„ฐ ์‹ค์งˆ์ ์ธ ๊ฐ€์น˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

  • Terraform์„ ์œ„ํ•œ MCP๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • ์™œ ์ค‘์š”ํ•œ๊ฐ€
  • ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๋Š”๊ฐ€
  • ์‹ค์ œ ์˜ˆ์ œ๋“ค
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ MCP + Terraform ํ™œ์šฉํ•˜๊ธฐ
  • DevOps ํŒ€์— ์ฃผ๋Š” ์ง„์งœ ์ด์ 

MCP(Model Context Protocol)๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์™œ Terraform์— ํ•„์š”ํ•œ๊ฐ€?

MCP๋Š” AI ํด๋ผ์ด์–ธํŠธ(Copilot, Claude, Cursor ๋“ฑ)๊ฐ€ ์™ธ๋ถ€ ๋„๊ตฌ์™€ ์•ˆ์ „ํ•˜๊ณ  ๊ตฌ์กฐํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. Terraform MCP Server๋Š” HashiCorp์˜ ๊ณต์‹ MCP ๊ตฌํ˜„์ฒด๋กœ, Terraform Registry API๋ฅผ AI ํด๋ผ์ด์–ธํŠธ์— ๋…ธ์ถœํ•ด ํ•„์š”ํ•œ ๋ฌธ์„œ, ์Šคํ‚ค๋งˆ, ๋ชจ๋“ˆ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋˜๋ฉฐ stdio(๋กœ์ปฌ) ๋˜๋Š” streamable-http(์›๊ฒฉ) ์ „์†ก์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Terraform์„ ์œ„ํ•œ MCP๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

MCP๋Š” Model Context Protocol์˜ ์•ฝ์ž๋กœ, AI ๊ธฐ๋ฐ˜ ๋„๊ตฌ๋“ค์ด ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋ฐ API์™€ ์ƒŒ๋“œ๋ฐ•์Šค๋œ ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค.

Terraform MCP Server๋Š” HashiCorp์˜ ๊ณต์‹ MCP ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค.
์ด ์„œ๋ฒ„๋Š” AI ๋„๊ตฌ๋ฅผ Terraform Registry์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์—ฌ ๋‹ค์Œ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

  • Providers, Resources, Data Sources ๊ฒ€์ƒ‰
  • ์ตœ์‹  Markdown ๋ฌธ์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๋ชจ๋“ˆ ํƒ์ƒ‰ ๋ฐ ๋ถ„์„
  • Sentinel/Terraform ์ •์ฑ… ํ™•์ธ

์ฆ‰, ์ด์ œ AI Assistant๋Š” ์ถ”์ธก ๋Œ€์‹  ์‹ค์ œ ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ง์ ‘ ํ™•์ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์™œ MCP + Terraform์ด ๊ฒŒ์ž„ ์ฒด์ธ์ €์ธ๊ฐ€?

  • Zero Hallucination Docs: LLM์ด ์ž˜๋ชป๋œ argument๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋Œ€์‹  provider ๋ฌธ์„œ์— ์žˆ๋Š” ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • Always Fresh: Terraform Registry์—์„œ ์ตœ์‹  ์Šคํ‚ค๋งˆ์™€ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • Multi-Client Support: GitHub Copilot(VS Code Agent), Cursor, Claude Desktop, Amazon Q Developer ๋“ฑ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • Security Friendly: ๋กœ์ปฌ(stdio) ๋˜๋Š” ์›๊ฒฉ(HTTP)์—์„œ origin ์ œํ•œ์„ ์ ์šฉํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Fast Dev Onboarding: ์‹ ๊ทœ ํŒ€์›์ด ๋ฌธ์„œ๋ฅผ ๋’ค์งˆ ํ•„์š” ์—†์ด ์ž์—ฐ์–ด๋กœ ์ž์›๊ณผ ๋ชจ๋“ˆ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์ƒ์ ์ธ ์‚ฌ์šฉ ์˜ˆ์ œ

MCP๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด AI ๋„๊ตฌ์— ์ด๋ ‡๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

โ€œGoogle Cloud provider์—์„œ AI ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•ด ์ค˜.โ€
โ†’ google_vertex_ai_endpoint, google_document_ai_processor ๋“ฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

โ€œazurerm_storage_account์— ๋Œ€ํ•œ ๋ฌธ์„œ์™€ ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ์ค˜.โ€
โ†’ ๊ณต์‹ resource ๋ฌธ์„œ์™€ ์‚ฌ์šฉ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

โ€œIBM Cloud VM์„ ์ƒ์„ฑํ•˜๋Š” ๋ชจ๋“ˆ์„ ์ฐพ์•„์„œ input/output์„ ์š”์•ฝํ•ด์ค˜.โ€
โ†’ Terraform Registry๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

  • AI Client(Copilot/Claude/Cursor)๊ฐ€ MCP ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœ
  • Terraform MCP Server๊ฐ€ Terraform Registry์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  • Client๊ฐ€ ๋ฌธ์„œ, ๋ฒ„์ „, input/output, ์˜ˆ์ œ๋ฅผ ๋ Œ๋”๋ง โ€” ์ถ”์ธก์€ ์—†์Šต๋‹ˆ๋‹ค.

Terraform MCP ์„œ๋ฒ„ ๊ฐœ์š”

์ด ๋ฌธ์„œ๋Š” Terraform Model Context Protocol(MCP) ์„œ๋ฒ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋Š” Terraform Registry์—์„œ ์ •๋ณด๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์™€ AI ๋˜๋Š” LLM์ด Terraform ๊ตฌ์„ฑ์„ ์ž‘์„ฑํ•  ๋•Œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด AI๋Š” ๊ณต์‹ Provider ์ฝ”๋“œ์™€ ๋ฌธ์„œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค๋กœ ํ™œ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Model Context Protocol(MCP)์€ AI ๋ชจ๋ธ์ด ์™ธ๋ถ€ ๋„๊ตฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, AI(์˜ˆ: LLM ๊ธฐ๋ฐ˜ ๋Œ€ํ™”)์™€ ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฒ”์šฉ ๋ฒˆ์—ญ๊ธฐ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

AI ๋ชจ๋ธ์„ Terraform MCP ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ฉด, ์˜ค๋ž˜๋œ ํ•™์Šต ๋ฐ์ดํ„ฐ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ณต์‹ Terraform Registry์—์„œ ์ตœ์‹  Provider, Module, Policy ์ •๋ณด๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Terraform ๊ด€๋ จ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋” ์ •ํ™•ํ•˜๊ณ  ์ตœ์‹ ์ด๋ฉฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹ต๋ณ€์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:small_blue_diamond: ํ•ต์‹ฌ ํฌ์ธํŠธ: ์ด ์„œ๋ฒ„๋Š” Terraform Registry์˜ Provider ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ Terraform ๊ฐœ๋…์ด๋‚˜ ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ ์ธํ„ฐ๋„ท๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

  1. Terraform MCP ์„œ๋ฒ„ ๋ฐฐํฌ

    • Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰
    • ๋กœ์ปฌ ํ™˜๊ฒฝ โ†’ stdio ๋ชจ๋“œ๋กœ ์‹œ์ž‘
    • ์›๊ฒฉ ํ™˜๊ฒฝ โ†’ Streamable HTTP ํ†ต์‹ ์„ ์œ„ํ•œ http ๋ชจ๋“œ๋กœ ์‹œ์ž‘
    • ์ „์ฒด ์ง€์นจ์€ ๋ฌธ์„œ์˜ Deploy server ํ•ญ๋ชฉ์„ ์ฐธ๊ณ 
  2. AI์—๊ฒŒ MCP ๋„๊ตฌ ์‚ฌ์šฉ ์š”์ฒญ

    • ์—ฐ๊ฒฐ์ด ์™„๋ฃŒ๋˜๋ฉด, AI๋Š” MCP ์„œ๋ฒ„์˜ ํŠน์ • ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ด ๋ฌธ์„œ ์กฐํšŒ, ๋ชจ๋“ˆ ๊ฒ€์ƒ‰, ์ •์ฑ… ์„ธ๋ถ€ ์ •๋ณด ํ™•์ธ ๋“ฑ์„ Registry์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ Terraform์—์„œ MCP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

  • ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ โ€” Registry์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋” ๋†’์€ ์ •ํ™•์„ฑ โ€” ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ AI ๋‹ต๋ณ€์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งค๋„๋Ÿฌ์šด AI ํ†ตํ•ฉ โ€” ๋ฌธ์„œ๋ฅผ ๋ณต์‚ฌํ•ด ๋ถ™์—ฌ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Terraform MCP ์„œ๋ฒ„ ๋ฐฐํฌ

Terraform MCP(Model Context Protocol) ์„œ๋ฒ„๋Š” AI ๋„๊ตฌ๊ฐ€ Terraform Registry์—์„œ ์ตœ์‹  Terraform provider์™€ module ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋Š” Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋กœ์ปฌ๊ณผ ์›๊ฒฉ ์„ค์ • ๋ชจ๋‘๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  1. ์š”๊ตฌ์‚ฌํ•ญ
  • Docker
  • Docker Engine v20.10.21 ์ด์ƒ
  • Docker Desktop v4.14.0 ์ด์ƒ
  • MCP ์ง€์› ํด๋ผ์ด์–ธํŠธ
  • VS Code + Copilot
  • Cursor
  • Anthropic Claude Desktop
  1. ๋กœ์ปฌ ์„ค์ • (stdio ๋ชจ๋“œ)
    Docker ์‹คํ–‰:
docker run -i --rm hashicorp/terraform-mcp-server

VS Code ์‚ฌ์šฉ์ž ์„ค์ •(settings.json):

{
  "mcp": {
    "servers": {
      "terraform": {
        "command": "docker",
        "args": [
          "run",
          "-i",
          "--rm",
          "hashicorp/terraform-mcp-server"
        ]
      }
    }
  }
}
  1. ์†Œ์Šค์—์„œ ์„ค์น˜ (์„ ํƒ ์‚ฌํ•ญ)
    ์ตœ์‹  ๋ฆด๋ฆฌ์Šค:
go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@latest

๋ฉ”์ธ ๋ธŒ๋žœ์น˜:

go install github.com/hashicorp/terraform-mcp-server/cmd/terraform-mcp-server@main

ํด๋ผ์ด์–ธํŠธ ์„ค์ •:

{
  "mcp": {
    "servers": {
      "terraform": {
        "command": "/path/to/terraform-mcp-server",
        "args": ["stdio"]
      }
    }
  }
}
  1. ์›๊ฒฉ ์„ค์ • (HTTP ๋ชจ๋“œ)
    ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
export TRANSPORT_MODE=streamable-http
export TRANSPORT_HOST=0.0.0.0
export TRANSPORT_PORT=8080

๋นŒ๋“œ ๋ฐ ์‹คํ–‰:

git clone https://github.com/hashicorp/terraform-mcp-server.git
cd terraform-mcp-server
make docker-build
docker run -p 8080:8080 --rm -e MODE=streamable-http terraform-mcp-server:dev
  1. ํด๋ผ์ด์–ธํŠธ์—์„œ MCP ํ™œ์„ฑํ™”
  • VS Code: Settings โ†’ Enable MCP โ†’ Terraform MCP tools ์„ ํƒ
  • Cursor: Chat Settings โ†’ Enable MCP โ†’ ๋„๊ตฌ ํ™œ์„ฑํ™” ํ™•์ธ
  • Claude Desktop: Tools Menu โ†’ Enable Terraform MCP

์ด์ œ AI๋Š” Terraform Registry์—์„œ ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋ชจ๋“ˆ์„ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ, ์ •์ฑ…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์ตœ์‹  ์ •๋ณด๋ฅผ ๋ฐ”๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Terraform MCP ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋ธ ํ”„๋กฌํ”„ํŠธ ์‚ฌ์šฉํ•˜๊ธฐ

Terraform MCP ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•œ ํ›„(Deploy the Terraform MCP server ์ฐธ๊ณ ), AI ๋ชจ๋ธ์—๊ฒŒ ์งˆ๋ฌธ์„ ๋˜์ ธ Terraform ์„ค์ •์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:warning: ์ฐธ๊ณ : MCP๋Š” ์•„์ง ๋ฒ ํƒ€ ๋‹จ๊ณ„์ด๋ฉฐ, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

MCP ์„œ๋ฒ„๋Š” AI๋ฅผ Terraform Registry์˜ ์ตœ์‹  ๋ฐ์ดํ„ฐ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
์งˆ๋ฌธ์ด Registry์˜ provider๋‚˜ module๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ, AI๋Š” MCP ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ Terraform ์งˆ๋ฌธ์ด๋‚˜ ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ์—๋Š” ์ธํ„ฐ๋„ท์ด๋‚˜ ๋‹ค๋ฅธ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ ์ „ ์ค€๋น„

  • Terraform MCP ์„œ๋ฒ„๊ฐ€ ๋ฐฐํฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • AI ํด๋ผ์ด์–ธํŠธ๊ฐ€ MCP๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MCP ํ”„๋กฌํ”„ํŠธ ์ž‘์„ฑ ํŒ

  • ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•˜์„ธ์š”: provider๋‚˜ module ์ด๋ฆ„์„ ์ •ํ™•ํžˆ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: โ€œcompute diskโ€ ๋Œ€์‹  google_compute_disk ์‚ฌ์šฉ
  • ์ „์ฒด resource ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š” (Terraform CLI ๋ฌธ์„œ ์ฐธ๊ณ ).
  • ์ตœ์‹  ๋ฒ„์ „์ด๋‚˜ ํŠน์ • provider/module ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์„ธ์š”.

ํ”„๋กฌํ”„ํŠธ ์˜ˆ์‹œ

1. Google Provider์—์„œ AI ๊ด€๋ จ ๋ฆฌ์†Œ์Šค ๊ฐ€์ ธ์˜ค๊ธฐ
ํ”„๋กฌํ”„ํŠธ:

I need help understanding what resources are available in the Google provider that are for A

๊ฒฐ๊ณผ: Google AI ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก ์ œ๊ณต

  • vertex_ai_dataset
  • vertex_ai_endpoint
  • vertex_ai_feature_group
  • document_ai_processor

์ด ๋ฆฌ์†Œ์Šค๋“ค์€ Google Cloud์—์„œ AI/ML ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. Azure์—์„œ Storage Bucket ์„ค์ •ํ•˜๊ธฐ

ํ”„๋กฌํ”„ํŠธ:

I need help setting up storage buckets in the Azure provide

๊ฒฐ๊ณผ: ๊ด€๋ จ ๋ฆฌ์†Œ์Šค ์ œ๊ณต

  • azurerm_storage_account
  • azurerm_storage_container

์˜ˆ์‹œ ์ฝ”๋“œ:

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_storage_account" "example" {
  name                     = "storageaccountname"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "GRS"
  tags = {
    environment = "staging"
  }
}

3. IBM VM ๋ชจ๋“ˆ ์ฐพ๊ธฐ
ํ”„๋กฌํ”„ํŠธ:

Is there a module to help with setting up an IBM VM?

๊ฒฐ๊ณผ:

  • ๋ชจ๋“ˆ: intel/ibm-vm/intel/1.2.2
  • ์„ค๋ช…: Intel Cloud Optimization Module โ€” IBM VM
  • ์†Œ์Šค: GitHub โ€” intel/terraform-intel-ibm-vm

๋‹ค์Œ ๋‹จ๊ณ„: MCP๊ฐ€ ์„ค์ •๋œ ํ›„, provider๋‚˜ module์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ์„ ํ•˜๋ฉด Terraform Registry์—์„œ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด์  (ํŒ€์—์„œ ์ฑ„ํƒํ•˜๋Š” ์ด์œ )

  • ๊ทผ๊ฑฐ ์žˆ๋Š” ๋‹ต๋ณ€: ์‹ค์‹œ๊ฐ„ Registry ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ provider/resource/module ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ์ตœ์‹  ๋ฌธ๋ฒ•๊ณผ ์ผ์น˜ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ์ž‘์„ฑ๊ณผ ๋ฆฌ๋ทฐ: ์ •ํ™•ํ•œ ์ธ์ž, ๋ฒ„์ „๋ณ„ ์˜ˆ์ œ, module I/O๋ฅผ ์š”์ฒญํ•ด ๊นจ๋—ํ•œ Terraform ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ฐ”๋กœ ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์—ฐํ•œ ๋ฐฐํฌ: ๋กœ์ปฌ(stdio) ์‹คํ–‰ ๋˜๋Š” ์ค‘์•™(streamable-http) ํ˜ธ์ŠคํŒ… ๊ฐ€๋Šฅ.
  • ์˜จ๋ณด๋”ฉ ์šฉ์ด: ์ฃผ๋‹ˆ์–ด ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋Œ€ํ™”ํ˜•์œผ๋กœ provider/module์„ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ณต์‹ ๋ฌธ์„œ์™€ ์ผ๊ด€์„ฑ ์œ ์ง€.

์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Docker (Desktop/Engine)
  • MCP๋ฅผ ์ง€์›ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ (์˜ˆ: VS Code GitHub Copilot Chat, Claude Desktop, Cursor)

์˜ต์…˜ A โ€” ๋กœ์ปฌ ์„ค์ • (stdio)

๋กœ์ปฌ์—์„œ MCP๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ stdio๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. ํด๋ผ์ด์–ธํŠธ MCP ์„ค์ •์— ์ถ”๊ฐ€
(ํŒŒ์ผ ์œ„์น˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ ํŒจํ„ด์€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.)

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

๊ณต์‹ Docker ์ด๋ฏธ์ง€๋Š” hashicorp/terraform-mcp-server์— ์žˆ์œผ๋ฉฐ, Docker Hub์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
HashiCorp๋Š” stdio๋ฅผ ๊ธฐ๋ณธ ๋กœ์ปฌ ์ „์†ก ๋ฐฉ์‹์œผ๋กœ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ B โ€” ์›๊ฒฉ ์„ค์ • (streamable-http)

Terraform MCP๋ฅผ VM/์ปจํ…Œ์ด๋„ˆ์— ํ˜ธ์ŠคํŒ…ํ•ด ์—ฌ๋Ÿฌ ํŒ€์›์ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

1. ์„œ๋ฒ„ ์‹คํ–‰

docker run --rm -p 8080:8080 \
  -e TRANSPORT_MODE=streamable-http \
  hashicorp/terraform-mcp-server

์›๊ฒฉ ๋ฐฐํฌ์—์„œ๋Š” streamable-http ์ „์†ก์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ณด์•ˆ ๊ฐ•ํ™”
ํ—ˆ์šฉ origin๊ณผ ํ”„๋ก ํŠธ์— ๋‘˜ ์ธ์ฆ(์˜ˆ: gateway/OIDC)์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

docker run --rm -p 8080:8080 \
  -e TRANSPORT_MODE=streamable-http \
  -e MCP_ALLOWED_ORIGINS="https://your-ai-client.app,https://your-copilot" \
  hashicorp/terraform-mcp-server

ํŒ: ๋งŽ์€ ํŒ€์ด MCP ์„œ๋ฒ„๋ฅผ API Gateway/Zero-Trust ํ”„๋ก์‹œ ๋’ค์— ๋‘ก๋‹ˆ๋‹ค. (์ผ๋ฐ˜์ ์ธ MCP ํ•˜๋“œ๋‹ ํŒจํ„ด์€ ์ตœ๊ทผ ๋ณด์•ˆ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.)

3. ํด๋ผ์ด์–ธํŠธ๋ฅผ ์›๊ฒฉ ์„œ๋ฒ„๋กœ ์ง€์ •
Streamable HTTP๋ฅผ ์ง€์›ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” URL์ด ํฌํ•จ๋œ ์„œ๋ฒ„ ์—”ํŠธ๋ฆฌ๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค(ํด๋ผ์ด์–ธํŠธ์˜ MCP ๋ฌธ์„œ ์ฐธ๊ณ ).

Terraform MCP ์„œ๋ฒ„ ๋ฐฐํฌ

MCP๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด Copilot/Claude/Cursor์—์„œ ๋‹ค์Œ์„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”:

  • โ€œhashicorp/google provider์—์„œ AI/ML ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๋ฌธ์„œ ๋งํฌ๋ฅผ ๋ณด์—ฌ์ค˜.โ€
  • โ€œazurerm_storage_account์˜ ์ตœ์‹  ๋ฒ„์ „ ๋ฌธ์„œ์™€ ์ตœ์†Œ ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ์ค˜.โ€
  • โ€œflow logs๊ฐ€ ์žˆ๋Š” ๋ณด์•ˆ VPC๋ฅผ ๋งŒ๋“œ๋Š” ๋ชจ๋“ˆ์„ ์ฐพ์•„์ค˜; inputs/outputs์™€ ์˜ˆ์ œ๋ฅผ ์š”์•ฝํ•ด์ค˜.โ€
  • โ€œํƒœ๊ทธ ๊ฐ•์ œ์™€ ๋น„์šฉ ๊ฐ€๋“œ๋ ˆ์ผ์„ ๋‹ค๋ฃจ๋Š” Sentinel/Terraform ์ •์ฑ…์€ ๋ฌด์—‡์ด ์žˆ์ง€? ์ƒ์„ธ๋ฅผ ๋ณด์—ฌ์ค˜.โ€

์ด ํ”„๋กฌํ”„ํŠธ๋“ค์ด ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š”, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•™์Šต๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  Registry๋ฅผ ์กฐํšŒํ•˜๋Š” MCP ๋„๊ตฌ๋กœ ๋ผ์šฐํŒ…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โ€œ๊ฐ€์žฅ ์ ํ•ฉํ•œโ€ ์‚ฌ์šฉ ์‚ฌ๋ก€

  • IaC ์ž‘์„ฑ ๊ฐ€์†: ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ์ธ์ž, ์ตœ์‹  ์˜ˆ์ œ, ๋ฒ„์ „๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ PR ๋ฐ˜๋ณต์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ: โ€œprovider vX.Y์—์„œ ์ด ์ธ์ž๊ฐ€ ์œ ํšจํ•œ๊ฐ€?โ€๋ฅผ ์ฆ‰์‹œ Registry ๋ฐ์ดํ„ฐ๋กœ ๊ต์ฐจ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ํƒ์ƒ‰: ๊ฒ€์ฆ๋œ ๋ชจ๋“ˆ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ณ€์ˆ˜/์ถœ๋ ฅ์„ ๋น„๊ตํ•ด ์˜ˆ์ œ๋ฅผ ๋ฐ”๋กœ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ •์ฑ… ์ธ์ง€: ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ์ •์ฑ… ์„ธํŠธ์™€ ๊ตฌํ˜„ ๋…ธํŠธ๋ฅผ ๋…ธ์ถœํ•ด ๋“œ๋ฆฌํ”„ํŠธ ์ดํ›„๊ฐ€ ์•„๋‹Œ ์‚ฌ์ „์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€๊ธฐ(์œ ์šฉํ•œ ์ถ”๊ฐ€ ์š”์†Œ)

  • ์ด๋ฏธ์ง€ ๋ฒ„์ „ ๊ณ ์ •(์˜ˆ: hashicorp/terraform-mcp-server:0.2)์œผ๋กœ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ , ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ™•์ธํ•˜์„ธ์š”.
  • โ€œexecution serversโ€์™€ ๊ฒฐํ•ฉ: ์ผ๋ถ€ ์ปค๋ฎค๋‹ˆํ‹ฐ MCP ์„œ๋ฒ„๋Š” ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ terraform plan/apply(๋˜๋Š” Terragrunt)๋ฅผ ์‹คํ–‰ํ•˜๊ณ , AI ๋ถ„์„์šฉ ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ๊ฐ€๋“œ๋ ˆ์ผ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์‚ฌ์šฉ๋Ÿ‰ ์ถ”์ : ์›๊ฒฉ MCP๋ฅผ API Gateway ๋’ค์— ๋‘์–ด ์š”์ฒญ์„ ๊ณ„๋Ÿ‰ยท๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ„๋‹จ ์ฒดํฌ

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋„๊ตฌ๋ฅผ ๋ชป ๋ณด๋‚˜? MCP ์„ค์ • ๋ธ”๋ก์„ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.
  • ์›๊ฒฉ 403/์ฐจ๋‹จ? MCP_ALLOWED_ORIGINS ๋˜๋Š” gateway/CORS ๊ตฌ์„ฑ์„ ๊ฒ€์ฆํ•˜์„ธ์š”.
  • ์‘๋‹ต์ด ์˜ค๋ž˜๋˜์—ˆ๋‚˜? โ€œlatestโ€ provider ๋ฌธ์„œ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜(๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ) ํด๋ผ์ด์–ธํŠธ ์บ์‹œ๋ฅผ ๋น„์›Œ ๋ณด์„ธ์š”.
  • ๋ณด์•ˆ ๊ฒ€ํ† : localhost๋ฅผ ๋„˜์–ด ๋…ธ์ถœํ•  ๋•Œ๋Š” OAuth/OIDC ๋˜๋Š” ๋‹จ๊ธฐ ํ† ํฐ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ํ”„๋ŸฐํŠธํ•˜์„ธ์š”.

Terraform์šฉ MCP๋Š” ๋‹จ์ˆœํ•œ ๊ฐœ๋ฐœ์ž ํŽธ์˜ ๊ธฐ๋Šฅ์„ ๋„˜์–ด, ์ธํ”„๋ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ AI๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ๋ฐฉ์‹ ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
LLM์— ๊ณต์‹ Terraform ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๋Š” ์ง์ ‘ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ œ๊ณตํ•˜๋ฉด, ์˜ค๋ฅ˜์™€ ์žฌ์ž‘์—…, ๋ถˆํ•„์š”ํ•œ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ Terraform๊ณผ AI ์ฝ”๋”ฉ ๋ณด์กฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, MCP ํ™œ์„ฑํ™”๋Š” ์˜ค๋Š˜ ๋‹น์žฅ ์›Œํฌํ”Œ๋กœ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ MCP + Terraform ๊ฒฐํ•ฉ

PR์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ

  • ๋ณ€๊ฒฝ๋œ .tf ํŒŒ์ผ์˜ ๊ฐ resource/data source๊ฐ€ ์ง€์ •ํ•œ provider/๋ฒ„์ „์— ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ฆ
  • ๋ผ์ด๋ธŒ ๋ฌธ์„œ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ ์ค‘๋‹จ/์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ž ํ”Œ๋ž˜๊ทธ
  • ์ˆ˜์ •๋œ ๋ฆฌ์†Œ์Šค/๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ตœ์‹  ๋ฒ„์ „ ๋…ธํŠธ/์˜ˆ์ œ๋ฅผ ์ œ์•ˆ
  • PR์— Markdown ๋ฆฌํฌํŠธ๋ฅผ ๊ฒŒ์‹œ

์ƒ์œ„ ํ”Œ๋กœ์šฐ(CI Job)

  • ์ €์žฅ์†Œ ์ฒดํฌ์•„์›ƒ
  • terraform init -backend=false ์‹คํ–‰(+ terraform validate, tflint)
  • ์žก ๋‚ด์—์„œ Terraform MCP Server(HTTP ๋ชจ๋“œ) ๊ธฐ๋™
  • ๊ฒฝ๋Ÿ‰ ์ฒดํฌ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰:
    • ๋ณ€๊ฒฝ๋œ .tf ํŒŒ์‹ฑ โ†’ (provider, version, resource_type, used_args)
    • ๊ฐ resource์— ๋Œ€ํ•ด MCP ๋„๊ตฌ๋ฅผ ์ฟผ๋ฆฌํ•ด ๋ผ์ด๋ธŒ ๋ฌธ์„œ/์Šคํ‚ค๋งˆ ์ˆ˜์ง‘
    • ๋น„๊ต โ†’ Doc Drift Report ์ƒ์„ฑ(์•Œ ์ˆ˜ ์—†์Œ/์ด๋ฆ„ ๋ณ€๊ฒฝ/์‚ฌ์šฉ ์ค‘๋‹จ ์ธ์ž, ๋ˆ„๋ฝ๋œ ๋ฆฌ์†Œ์Šค, ๋ชจ๋“ˆ I/O ๋ถˆ์ผ์น˜)
    • ๋ฆฌํฌํŠธ๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ  PR์— ์ฝ”๋ฉ˜ํŠธ
    • (์„ ํƒ) ์ฐจ๋‹จ ์ด์Šˆ๊ฐ€ ์žˆ์œผ๋ฉด ์žก ์‹คํŒจ ์ฒ˜๋ฆฌ

GitHub Actions: ๋“œ๋กญ์ธ ์›Œํฌํ”Œ๋กœ

.github/workflows/terraform-mcp-doccheck.yml ์ƒ์„ฑ:

name: Terraform MCP Doc Check
on:
  pull_request:
    paths:
      - "**/*.tf"
      - "**/*.tf.json"
jobs:
  doccheck:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.8.5
      - name: Terraform init/validate
        run: |
          terraform -chdir=. init -backend=false -input=false
          terraform -chdir=. validate
      - name: Run tflint (optional but recommended)
        uses: terraform-linters/setup-tflint@v4
      - run: |
          tflint --init
          tflint -f compact || true
      - name: Start Terraform MCP Server (HTTP)
        run: |
          docker run -d --name tf-mcp -p 8080:8080 \
            -e TRANSPORT_MODE=streamable-http \
            hashicorp/terraform-mcp-server
          # simple wait
          sleep 5
      - name: Install checker deps
        run: |
          python -m pip install --upgrade pip
          pip install python-hcl2 requests
      - name: Run MCP doc checker
        id: check
        env:
          MCP_URL: "http://localhost:8080"
        run: |
          python .ci/mcp_doccheck.py > mcp_report.md || true
      - name: Upload report artifact
        uses: actions/upload-artifact@v4
        with:
          name: mcp-doc-report
          path: mcp_report.md
      - name: Comment on PR
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          path: mcp_report.md
      - name: Stop MCP
        if: always()
        run: docker rm -f tf-mcp || true

GitLab CI๋‚˜ Azure Pipelines์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ์ฒดํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, Markdown์„ ๊ฒŒ์‹œํ•˜๊ณ , ์ฐจ๋‹จ ์ด์Šˆ๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฒด์ปค ์Šคํฌ๋ฆฝํŠธ(Python)

.ci/mcp_doccheck.py์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  • ๋กœ์ปฌ ์‹คํ–‰ ์‹œ ๋ณ€๊ฒฝ๋œ .tf ํŒŒ์ผ์„ ์ฐพ๊ณ (๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์ค‘์ด๋ฉด ๋ชจ๋“  Terraform ํŒŒ์ผ๋กœ ํด๋ฐฑ)
    python-hcl2๋กœ ํŒŒ์‹ฑ
  • required_providers/lockfile์—์„œ ๋ฒ„์ „ ์ฝ๊ธฐ
  • ๊ฐ (provider, resource)์— ๋Œ€ํ•ด MCP ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•ด ๋ฌธ์„œ/์Šคํ‚ค๋งˆ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ์‚ฌ์šฉํ•œ ์ธ์ž์™€ ๋ฌธ์„œ์ƒ์˜ ์ธ์ž๋ฅผ ๋น„๊ต
  • PR์— ์นœํ™”์ ์ธ Markdown ํ…Œ์ด๋ธ”๋กœ ์ถœ๋ ฅ
#!/usr/bin/env python3
import os, re, json, glob, subprocess, sys
import requests, hcl2
from pathlib import Path
MCP_URL = os.getenv("MCP_URL", "http://localhost:8080")
def git_changed_tf():
    try:
        base = os.getenv("GITHUB_BASE_REF")
        head = os.getenv("GITHUB_SHA") or "HEAD"
        if base:
            diff = subprocess.check_output(["git","diff","--name-only",f"origin/{base}...{head}"]).decode()
        else:
            diff = subprocess.check_output(["git","diff","--name-only","HEAD~1"]).decode()
        return [f for f in diff.splitlines() if f.endswith((".tf",".tf.json"))]
    except Exception:
        return []
def parse_tf_files(paths):
    resources = []  # (provider, type, used_args, file, line)
    req_providers = {}  # "hashicorp/aws": "~> 5.55"
    for p in paths:
        with open(p,"r") as fh:
            try:
                data = hcl2.load(fh)
            except Exception:
                continue
        # required_providers
        for b in (data.get("terraform") or []):
            rp = b.get("required_providers") or {}
            for name, spec in rp.items():
                src = spec.get("source", f"hashicorp/{name}")
                ver = spec.get("version", "")
                req_providers[src] = ver
        # resources
        for block in (data.get("resource") or []):
            for rtype, instances in block.items():
                # provider guessed as prefix if "<prov>_<rest>"
                provider = rtype.split("_",1)[0]
                for name, body in instances.items():
                    args = list(body.keys()) if isinstance(body, dict) else []
                    resources.append({
                        "provider_guess": provider,
                        "resource_type": rtype,
                        "args": args,
                        "file": p
                    })
    return resources, req_providers
# --- MCP helper (HTTP streamable) ---
def mcp_call(tool, params):
    # Minimal client: call tool via MCP server's HTTP tool endpoint.
    # NOTE: Exact path may vary by server build; adjust if needed.
    r = requests.post(f"{MCP_URL}/tools/{tool}", json=params, timeout=30)
    r.raise_for_status()
    return r.json()
def fetch_resource_doc(provider_src, resource_type, version_hint=""):
    # Example tool names; adjust to serverโ€™s published tool list
    payload = {
        "provider": provider_src,
        "resource": resource_type,
        "version": version_hint
    }
    # Try docs first; fall back to schema
    try:
        return mcp_call("registry.get_resource_docs", payload)
    except Exception:
        return mcp_call("registry.get_resource_schema", payload)
def main():
    files = git_changed_tf()
    if not files:
        files = [*glob.glob("**/*.tf", recursive=True)]
    resources, reqp = parse_tf_files(files)
    if not resources:
        print("### Terraform MCP Doc Check\nNo Terraform resources detected.")
        return
    print("### Terraform MCP Doc Check\n")
    print("| Resource | Provider | Version | Unknown Args | Deprecated | Notes |")
    print("|---|---|---|---|---|---|")
    for r in resources:
        prov_short = r["provider_guess"]
        # best-effort mapping to full source (e.g., hashicorp/aws)
        candidates = [k for k in reqp.keys() if k.endswith(f"/{prov_short}")]
        provider_src = candidates[0] if candidates else f"hashicorp/{prov_short}"
        ver = reqp.get(provider_src,"")
        try:
            doc = fetch_resource_doc(provider_src, r["resource_type"], ver)
            valid_args = set(doc.get("args", [])) | set(doc.get("attributes", []))
            deprecated = set(doc.get("deprecated", []))
            used = set(r["args"])
            unknown = sorted(list(used - valid_args))
            dep_used = sorted(list(used & deprecated))
            note = doc.get("summary","")
        except Exception as e:
            unknown = ["<tool error>"]
            dep_used = []
            note = f"{type(e).__name__}"
        print(f"| `{r['resource_type']}` | `{provider_src}` | `{ver}` | "
              f"{', '.join(unknown) if unknown else 'โ€”'} | "
              f"{', '.join(dep_used) if dep_used else 'โ€”'} | "
              f"{note[:80]} |")
if __name__ == "__main__":
    main()

์ฐธ๊ณ : mcp_call("registry.get_resource_docs", โ€ฆ) ์•„๋ž˜ ๋„๊ตฌ ์ด๋ฆ„/๊ฒฝ๋กœ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋…ธ์ถœํ•˜๋Š” ๋„๊ตฌ ๋ชฉ๋ก์ด ๋‹ค๋ฅด๋ฉด, fetch_resource_doc์˜ ๋‘ ํ˜ธ์ถœ์„ ์„œ๋ฒ„์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•˜์„ธ์š”. ํด๋ฐฑ์œผ๋กœ ๋™์ผ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ง์ ‘ Terraform Registry API๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(MCP๊ฐ€ ๋‹ค์šด์ด์–ด๋„ ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ ์šฉํ•˜๊ฒŒ ์œ ์ง€).

์ •์ฑ…: PR ์‹คํŒจ ์‹œ์ 

  • ๊ณ ์ •๋œ(provider ๋ฒ„์ „์ด ํ•€๋œ) provider ๋ฒ„์ „์—์„œ ๋ˆ„๋ฝ/์•Œ ์ˆ˜ ์—†๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํŒจ
  • ์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ž(์˜คํƒ€/์ด๋ฆ„ ๋ณ€๊ฒฝ)๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉด ์‹คํŒจ
  • ์‚ฌ์šฉ ์ค‘๋‹จ ์ธ์ž์ด๊ฑฐ๋‚˜ provider ๋ฒ„์ „์ด ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ๋Š” ๊ฒฝ๊ณ (์‹คํŒจํ•˜์ง€ ์•Š์Œ, ์—…๊ทธ๋ ˆ์ด๋“œ ์ œ์•ˆ)

์ด ์ž„๊ณ„๊ฐ’์€ mcp_report.md๋ฅผ ์Šค์บ”ํ•ด ๋น„์˜(0์ด ์•„๋‹Œ) ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ž‘์€ ํ›„์ฒ˜๋ฆฌ๊ธฐ๋กœ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitLab CI & Azure Pipelines ๊ฐ„๋‹จ ๋ณ€ํ˜•

GitLab (.gitlab-ci.yml)

stages: [test]
mcp-doccheck:
  stage: test
  image: docker:24
  services: [docker:24-dind]
  variables: { DOCKER_TLS_CERTDIR: "" }
  script:
    - apk add --no-cache python3 py3-pip git
    - pip install python-hcl2 requests
    - docker run -d --name tf-mcp -p 8080:8080 -e TRANSPORT_MODE=streamable-http hashicorp/terraform-mcp-server
    - sleep 5
    - python .ci/mcp_doccheck.py > mcp_report.md || true
  artifacts:
    paths: [mcp_report.md]
    when: always

Azure Pipelines (azure-pipelines.yml)

trigger: none
pr: [ main ]
pool: { vmImage: "ubuntu-latest" }
steps:
  - checkout: self
  - task: Bash@3
    displayName: Start MCP
    inputs:
      targetType: inline
      script: |
        docker run -d --name tf-mcp -p 8080:8080 \
          -e TRANSPORT_MODE=streamable-http \
          hashicorp/terraform-mcp-server
        sleep 5
  - task: Bash@3
    displayName: Run checker
    inputs:
      targetType: inline
      script: |
        pip install python-hcl2 requests
        python .ci/mcp_doccheck.py > mcp_report.md || true
  - task: PublishBuildArtifacts@1
    inputs:
      PathtoPublish: mcp_report.md
      ArtifactName: mcp-doc-report

ํ•˜๋“œ๋‹ & ์œ„์ƒ

  • MCP ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ๊ณ ์ •ํ•˜์„ธ์š”(์˜ˆ: hashicorp/terraform-mcp-server:0.2.x) ๊ทธ๋ฆฌ๊ณ  ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ฃผ์‹œํ•˜์„ธ์š”.
  • ์„œ๋ฒ„๋Š” CI ๋‚ด์—์„œ๋งŒ(์—ํŽ˜๋ฉ”๋Ÿด) ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์žฅ๊ธฐ ์‹คํ–‰ ์ธ์Šคํ„ด์Šค๋Š” API Gateway + OIDC์™€ ์—„๊ฒฉํ•œ MCP_ALLOWED_ORIGINS๋กœ ํ”„๋ŸฐํŠธํ•˜์„ธ์š”.
  • Terraform provider๋Š” required_providers + lockfile๋กœ ํ•€ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด MCP ์ฒดํฌ๊ฐ€ ๋ฒ„์ „๋ณ„๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•˜์„ธ์š”.

DevOps ํŒ€์„ ์œ„ํ•œ ์‹ค์ œ ์ด์ 

โ€œ๋ฌธ์„œ๊ฐ€ ์ข€ ๋” ์‹ ์„ ํ•ด์ง„๋‹คโ€๋ฅผ ๋„˜์–ด, MCP + Terraform์€ ์ธํ”„๋ผ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์‹ค์‹œ๊ฐ„ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ๊ฒ€์ฆํ•ด ์˜ค๋ฅ˜ยท์žฌ์ž‘์—…ยท๋””๋ฒ„๊น… ๋‚ญ๋น„๋ฅผ ํฌ๊ฒŒ ์ค„์—ฌ ์ค๋‹ˆ๋‹ค.

1. PR ํ”ผ๋“œ๋ฐฑ ์ค„์ด๊ธฐ

์ž˜๋ชป๋œ ์ธ์ž, ์˜ค๋ž˜๋œ ์˜ˆ์ œ, ๋ˆ„๋ฝ๋œ ํ•„์ˆ˜ ํ•„๋“œ ๋•Œ๋ฌธ์— PR์—์„œ ๋ถˆํ•„์š”ํ•œ ์™•๋ณต์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ์‹œ MCP๊ฐ€ Terraform Registry๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ provider ๋ฌธ๋ฒ•๊ณผ์˜ ๋“œ๋ฆฌํ”„ํŠธ๋ฅผ ๋จธ์ง€ ์ „์— ๋ฐ”๋กœ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ˆ˜๋™ ๋ฌธ์„œ ํ™•์ธ ์—†์ด ์ตœ์‹  ์œ ์ง€

Provider ๋ฒ„์ „์€ ์ž์ฃผ ๋ฐ”๋€Œ๊ณ , ์ด๋ฅผ ์ง์ ‘ ์ถ”์ ํ•˜๋Š” ์ผ์€ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. MCP๋Š” required_providers์— ์ง€์ •๋œ ์ •ํ™•ํ•œ ๋ฒ„์ „์— ๋Œ€ํ•ด ์‹ค์‹œ๊ฐ„ ๋ฌธ์„œ์™€ ์Šคํ‚ค๋งˆ๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋” ์ด์ƒ ๊ฒ€์ƒ‰, ๋ถ๋งˆํฌ, ๊ธฐ์–ต์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

3. ๋ฉ€ํ‹ฐ ํ”„๋กœ๋ฐ”์ด๋” ํ™˜๊ฒฝ์—์„œ์˜ ์ž์‹ ๊ฐ

๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ๋‚˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ(AWS + Azure + GCP + SaaS) ํ™˜๊ฒฝ์—์„œ๋Š” ํŒ€์›์ด ํŠน์ • provider์—๋Š” ์ต์ˆ™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ provider์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MCP๋Š” ๋ชจ๋“  DevOps ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ชจ๋“  provider์— ๋Œ€ํ•ด โ€œ๋ฌธ์„œ ๋„ค์ดํ‹ฐ๋ธŒโ€๊ฐ€ ๋˜๋„๋ก ํ•ด ์ปจํ…์ŠคํŠธ ์ „ํ™˜์„ ์ค„์ด๊ณ  ์ ์‘ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.

4. ์‹ ๊ทœ ์—”์ง€๋‹ˆ์–ด ์˜จ๋ณด๋”ฉ ๊ฐ€์†ํ™”

์ƒˆ๋กœ์šด ํŒ€์›์€ Registry ํŽ˜์ด์ง€๋ฅผ ๋’ค์ง€์ง€ ์•Š๊ณ  ์ž์—ฐ์–ด ์ฟผ๋ฆฌ๋กœ ๋ฆฌ์†Œ์Šค์™€ ๋ชจ๋“ˆ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ PR๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ๋ณต์žกํ•œ ์ธํ”„๋ผ๋กœ์˜ ์˜จ๋ณด๋”ฉ์„ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

5. ํ”„๋กœ๋•์…˜ ๋“œ๋ฆฌํ”„ํŠธ ์œ„ํ—˜ ๊ฐ์†Œ

์‚ฌ์šฉ ์ค‘๋‹จ๋œ ์ธ์ž๋‚˜ provider ๋ฒ„์ „ ๋ถˆ์ผ์น˜๋ฅผ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋“œ๋Ÿฌ๋‚ด๋ฏ€๋กœ, ํ”„๋กœ๋•์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋“œ๋ฆฌํ”„ํŠธ๋‚˜ ๊นจ์ง„ ํ”Œ๋žœ์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ํ–ฅ์ƒ๋œ CI/CD ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ

MCP ๋„๊ตฌ๋ฅผ ํ”„๋ฆฌ๋จธ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  • Registry์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ฆฌ์†Œ์Šค ํ”Œ๋ž˜๊ทธ ์ฒ˜๋ฆฌ
  • ์•Œ ์ˆ˜ ์—†๋Š” ์ธ์ž ์‚ฌ์šฉ ์‹œ ๋นŒ๋“œ ์‹คํŒจ
  • ๋ชจ๋“ˆ ์—…๋ฐ์ดํŠธ๋‚˜ ์ •์ฑ… ์„ธํŠธ ์ œ์•ˆ

7. ์ •์ฑ… ์ง‘ํ–‰์„ ๋” ์‰ฝ๊ฒŒ

MCP๋ฅผ ํ†ตํ•ด ์ •์ฑ… ์„ธํŠธ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐœ๋ฐœ ์ค‘์— ํƒœ๊ทธ ๊ฐ•์ œ, ๋ฆฌ์ „ ์ œํ•œ, ๋น„์šฉ ์ œ์–ด๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋“œ๋ฆฌํ”„ํŠธ ๊ฐ์ง€ ์ดํ›„๊ฐ€ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์ ์—์„œ ์ด๋ค„์ง‘๋‹ˆ๋‹ค.

8. ์ž‘์„ฑ ์ค‘ ์ปจํ…์ŠคํŠธ ์ „ํ™˜ ์ตœ์†Œํ™”

๊ธฐ์กด ๋ฐฉ์‹:
์ฝ”๋“œ ์ž‘์„ฑ โ†’ ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ โ†’ Registry ๊ฒ€์ƒ‰ โ†’ ์Šค๋‹ˆํŽซ ๋ณต์‚ฌ โ†’ ์ฝ”๋“œ ์ˆ˜์ •

MCP ๋ฐฉ์‹:
AI์— ์งˆ๋ฌธ โ†’ ๊ฒ€์ฆ๋œ ์Šค๋‹ˆํŽซ์ด ์—๋””ํ„ฐ์—์„œ ๋ฐ˜ํ™˜ โ†’ ๋ถ™์—ฌ๋„ฃ๊ธฐ

ํ๋ฆ„์ด ๋Š๊ธฐ์ง€ ์•Š์•„ DevOps ์ž‘์—…์ด ๋” ๋งค๋„๋Ÿฝ์Šต๋‹ˆ๋‹ค.

Terraform + MCP๋Š” AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ Terraform ์ƒํƒœ๊ณ„์˜ ์‹ค์‹œ๊ฐ„ ์†Œ์Šค ์˜ค๋ธŒ ํŠธ๋ฃจ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(Docker + ํด๋ผ์ด์–ธํŠธ ์„ค์ •). ์šด์˜๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค(๋กœ์ปฌ stdio ๋˜๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ๋’ค HTTP). ์ผ์ƒ์ ์ธ IaC ์ž‘์„ฑ๊ณผ ๋ฆฌ๋ทฐ์—์„œ ์ฆ‰์‹œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œํ™˜๊ฐ๋œโ€ Terraform ๋‹ต๋ณ€์œผ๋กœ ์–ด๋ ค์›€์„ ๊ฒช์€ ์ ์ด ์žˆ๋‹ค๋ฉด, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ํ•„์š”ํ•œ ์—…๊ทธ๋ ˆ์ด๋“œ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

[์ถœ์ฒ˜] Terraform + MCP: Your Fast Track to Smarter, Faster Infrastructure | by rajni singh | GenusofTechnology | Aug, 2025 | Medium