|์ฃผ๋ ๋ด์ฉ์ Terraform MCP Server๊ฐ AI Model๊ณผ Terraform Registry ์ฐ๊ฒฐ๋์, Terraform ์ค์ ์ ํ์ํ ์ค์๊ฐ ๋ฌธ์ ยท Schema ยท Module ์ ๋ถ๋ฌ์ค๊ณ , ์ด๋ฅผ ํตํด์, IaC ์์ฑ, ์ต์ Provider ์ ๋ณด ์ ๊ณต ๋ฑ DevOps ์์ฐ์ฑ ๊ทน๋ํํ๋ค๊ณ ํฉ๋๋ค.
๋ชจ๋ 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 ๊ด๋ จ ์ง๋ฌธ์ ๋ํด ๋ ์ ํํ๊ณ ์ต์ ์ด๋ฉฐ ์คํ ๊ฐ๋ฅํ ๋ต๋ณ์ ์ป์ ์ ์์ต๋๋ค.
ํต์ฌ ํฌ์ธํธ: ์ด ์๋ฒ๋ Terraform Registry์ Provider ๊ตฌ์ฑ๊ณผ ๊ด๋ จ๋ ์ง๋ฌธ์์ ๊ฐ์ฅ ํจ๊ณผ์ ์
๋๋ค. ์ผ๋ฐ์ ์ธ Terraform ๊ฐ๋
์ด๋ ์ฝ๋ ์์ฑ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ์ธํฐ๋ท๊ณผ ๊ฐ์ ๋ค๋ฅธ ์์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๋์ ๋ฐฉ์
-
Terraform MCP ์๋ฒ ๋ฐฐํฌ
- Docker ์ปจํ ์ด๋์์ ์คํ
- ๋ก์ปฌ ํ๊ฒฝ โ stdio ๋ชจ๋๋ก ์์
- ์๊ฒฉ ํ๊ฒฝ โ Streamable HTTP ํต์ ์ ์ํ http ๋ชจ๋๋ก ์์
- ์ ์ฒด ์ง์นจ์ ๋ฌธ์์ Deploy server ํญ๋ชฉ์ ์ฐธ๊ณ
-
AI์๊ฒ MCP ๋๊ตฌ ์ฌ์ฉ ์์ฒญ
- ์ฐ๊ฒฐ์ด ์๋ฃ๋๋ฉด, AI๋ MCP ์๋ฒ์ ํน์ ๋๊ตฌ๋ฅผ ํธ์ถํด ๋ฌธ์ ์กฐํ, ๋ชจ๋ ๊ฒ์, ์ ์ฑ ์ธ๋ถ ์ ๋ณด ํ์ธ ๋ฑ์ Registry์์ ์ง์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ Terraform์์ MCP๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น์?
- ํญ์ ์ต์ ๋ฐ์ดํฐ โ Registry์ ์์ค ์ฝ๋์์ ์ง์ ๊ฐ์ ธ์ต๋๋ค.
- ๋ ๋์ ์ ํ์ฑ โ ์ค๋๋์๊ฑฐ๋ ์๋ชป๋ AI ๋ต๋ณ์ ํผํ ์ ์์ต๋๋ค.
- ๋งค๋๋ฌ์ด AI ํตํฉ โ ๋ฌธ์๋ฅผ ๋ณต์ฌํด ๋ถ์ฌ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค.
Terraform MCP ์๋ฒ ๋ฐฐํฌ
Terraform MCP(Model Context Protocol) ์๋ฒ๋ AI ๋๊ตฌ๊ฐ Terraform Registry์์ ์ต์ Terraform provider์ module ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํฉ๋๋ค. ์ด ์๋ฒ๋ Docker ์ปจํ ์ด๋์์ ์คํ๋๋ฉฐ, ๋ก์ปฌ๊ณผ ์๊ฒฉ ์ค์ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค.
- ์๊ตฌ์ฌํญ
- Docker
- Docker Engine v20.10.21 ์ด์
- Docker Desktop v4.14.0 ์ด์
- MCP ์ง์ ํด๋ผ์ด์ธํธ
- VS Code + Copilot
- Cursor
- Anthropic Claude Desktop
- ๋ก์ปฌ ์ค์ (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"
]
}
}
}
}
- ์์ค์์ ์ค์น (์ ํ ์ฌํญ)
์ต์ ๋ฆด๋ฆฌ์ค:
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"]
}
}
}
}
- ์๊ฒฉ ์ค์ (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
- ํด๋ผ์ด์ธํธ์์ 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 ์ค์ ์ ์์ฑํ๋ ๋ฐ ๋์์ ๋ฐ์ ์ ์์ต๋๋ค.
์ฐธ๊ณ : MCP๋ ์์ง ๋ฒ ํ ๋จ๊ณ์ด๋ฉฐ, ํ๋ก๋์
ํ๊ฒฝ์์๋ ์ฌ์ฉ๋์ง ์์ต๋๋ค.
์๋ ๋ฐฉ์
MCP ์๋ฒ๋ AI๋ฅผ Terraform Registry์ ์ต์ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
์ง๋ฌธ์ด Registry์ provider๋ module๊ณผ ๊ด๋ จ๋ ๊ฒฝ์ฐ, AI๋ MCP ์๋ฒ๋ฅผ ํตํด ์กฐํํฉ๋๋ค.
์ผ๋ฐ์ ์ธ Terraform ์ง๋ฌธ์ด๋ ์ฝ๋ ์์ฑ๊ณผ ๊ด๋ จ๋ ๊ฒฝ์ฐ์๋ ์ธํฐ๋ท์ด๋ ๋ค๋ฅธ ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ ์ ์ค๋น
- Terraform MCP ์๋ฒ๊ฐ ๋ฐฐํฌ๋์ด ์์ด์ผ ํฉ๋๋ค.
- AI ํด๋ผ์ด์ธํธ๊ฐ MCP๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค.
MCP ํ๋กฌํํธ ์์ฑ ํ
- ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑํ์ธ์: provider๋ module ์ด๋ฆ์ ์ ํํ ์ธ๊ธํฉ๋๋ค.
- ์: โcompute diskโ ๋์
google_compute_disk
์ฌ์ฉ
- ์: โ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 ๋ต๋ณ์ผ๋ก ์ด๋ ค์์ ๊ฒช์ ์ ์ด ์๋ค๋ฉด, ์ด๊ฒ์ด ๋ฐ๋ก ํ์ํ ์ ๊ทธ๋ ์ด๋์ ๋๋ค.
์ฐธ๊ณ ์๋ฃ
- HashiCorp ๋ฌธ์ โ Terraform MCP ์๋ฒ ๊ฐ์ ๋ฐ ๋ฐฐํฌ ๋ชจ๋ (HashiCorp Developer)
- Docker Hub โ ๊ณต์ ์ด๋ฏธ์ง ๋ฐ ํ๊ทธ (Docker Hub)
- ๋ฆด๋ฆฌ์ค ๋ ธํธ ๋ฐ ์ ๋ฐ์ดํธ (GitHub)
- InfoQ โ ์ถ์ ๋ณด๋ ๋ฐ ๋งฅ๋ฝ (InfoQ)
- MCP ๋ณด์/ํ๋๋ ํจํด (InfraCloud, Speakeasy)