서비스 주체(Service Principal)를 사용한 Azure MCP 설정 방법
요약
서비스 주체(Service Principal)를 활용하여 Azure MCP 서버를 설정하는 구체적인 가이드를 제공합니다. MacOS와 Windows 환경에서의 설정법을 다루며, Azure 인프라 분석 및 비용 절감을 위한 AI 활용 사례를 소개합니다.
핵심 포인트
- 서비스 주체를 이용한 Azure MCP 인증 및 설정 방법 안내
- MacOS(npm) 및 Windows(Docker) 환경별 설정 가이드 제공
- Azure 자산 분석 및 FinOps 관점의 비용 절감 활용 사례
- AI를 활용한 로그 분석 및 경고 분류(Triage) 가능성 제시
오늘은 Azure MCP 서버를 설정하는 방법, 더 구체적으로는 서비스 주체(Service Principal)를 사용하여 인증하는 방법에 집중해 보겠습니다. npm을 사용하는 MacOS와 Docker를 사용하는 Windows 환경 모두에서 설정을 진행하면서, 서비스 주체와 함께 Azure MCP를 사용하는 방법에 대한 간단한 가이드를 찾는 데 정말 큰 어려움을 겪었습니다. 그래서 커뮤니티에 도움이 되기를 바라는 마음으로 저만의 설정 과정을 기록해 보려 합니다.
또한 영감을 얻으실 수 있도록 AI를 활용하여 Azure 환경을 효율화하는 실제 사례를 상세히 다룬 후속 포스트도 작성해 두었습니다.
왜 Azure MCP를 사용해야 하는가?
여러분은 어떠신지 모르겠지만, 저희의 Azure 자산(estate)은 매우 방대합니다. 제 생각에는 Azure 자산이 분석하기 어려워지는 데는 그리 오랜 시간이 걸리지 않습니다. 물론 Azure Advisor가 있지만, 그것은 시간이 걸리고 때로는 약간의 업셀링(upsell)처럼 느껴지기도 합니다. 네, 제 VM들이 B-series SKU로 실행되고 있다는 점은 알고 있습니다. 다 이유가 있어서 그렇게 설정한 것이니까요! 우리는 MCP를 사용하여 앱 개발 속도를 높이는 것에 대한 수많은 기사와 화제들을 접하고 있으며, 이는 충분히 타당한 이유가 있습니다. 하지만 인프라(Infrastructure)는 어떨까요?
Azure MCP의 잠재적 용도
여기서 여러분이 할 수 있는 일은 정말 무궁무진합니다. 개인적으로 저는 Azure MCP를 사용하여 저희 환경 내의 비효율적인 부분을 찾아내는 데 사용했으며, 그 잠재력에 매우 고무되었습니다. 예를 들어, 저는 Azure 아키텍트이자 FinOps 전문가로서 비용 절감 방안을 제시하도록 MCP를 활용하고 싶었고, 실제로 그렇게 수행했습니다. 겉보기에는 괜찮아 보이지만 할당 해제(deallocate)에 실패하고 있는 VM, 수많은 잠재적인 고립된(orphaned) Veeam 백업 리소스, 그리고 Azure 방화벽 뒤에 있는 VM에서 공용 IP(public IP)를 비효율적으로 사용하는 사례 등을 찾아냈습니다. 모두 기본적인 내용들이지만, 다양한 Azure 경험과 기술 수준을 가진 팀원들이 있을 때는 정말 유용합니다.
하지만 완벽하지는 않았으며, AI에 관해서라면 늘 그렇듯 주의사항이 있습니다. AI는 결코 당신을 주도해서는 안 되는 도구라는 점입니다. AI가 출력하는 모든 권장 사항(심지어 아주 멋진 전용 마크다운 문서로 제공됩니다)은 제가 리소스를 삭제하기 전에 반드시 수동으로 확인하고 검증할 것입니다. 하지만 AI가 분석하는 속도와 생성해낸 철저한 보고서를 보며, 저는 다음 단계가 무엇일지 기대하게 되었습니다. Azure MCP Server 문서와 그것이 제공하는 도구들을 살짝 훑어보는 것만으로도, 이 글을 읽는 누구라도 창의적인 아이디어를 떠올리기에 충분할 것입니다!
개인적으로 제가 다음에 시도하고 싶은 방향은, AI가 로그 분석(Log Analytics)을 수행하고, 사람에게 에스컬레이션(Escalation)하기 전에 (Confluence 문서와 Azure 자산에서 제공된 컨텍스트를 바탕으로) 경고(Alert)를 분류(Triage)하도록 만드는 등의 작업입니다. 이번 PoC(Proof of Concept, 개념 증명)의 일환으로 단계별 계획을 세워볼 가치가 있다고 생각합니다. 해결하려는 비즈니스 과제가 무엇인지, 그리고 이를 통해 얼마나 많은 비용과 시간을 절약할 수 있는지 문서화하십시오. 팀의 페인 포인트(Pain points)는 무엇입니까?
하지만 그 이상도 가능합니다. 현재 코드로서의 인프라(Infrastructure-as-Code, IaC)로 관리되지 않는 두 개의 Azure 구독이 있는데, 기존에 존재하는 모든 리소스를 포함할 뿐만 아니라 다른 구독의 IaC 스타일까지 따르는 Terraform 코드를 만드는 것은 매우 벅찬 작업이 될 것이었습니다. 만약 제가 IaC 저장소에 대한 접근 권한을 Azure MCP와 결합한다면 어떻게 될까요? 갑자기 이 작업이 잠재적으로 몇 주나 더 빨라질 수도 있습니다. 아직 테스트해보지는 않았지만, 매우 기대됩니다.
서비스 주체(Service Principal)로 Azure MCP를 설정하기 전 요구 사항
먼저, 다양한 사항들에 대해 간략하게 살펴보겠습니다. 여기서 MCP가 무엇인지에 대해서는 다루지 않겠습니다. 온라인에 이미 학습 리소스가 풍부하다고 생각하기 때문입니다. 대신 왜(Why)와 어떻게(How)에 대해서는 다룰 것입니다.
왜 서비스 주체(Service Principal)인가?
이제 저는 이와 같은 Microsoft 문서에서 Azure CLI나 PowerShell을 통해 먼저 az login과 같은 대화형 로그인 (interactive sign-in)을 수행하도록 안내하고 있다는 점을 발견했습니다.
하지만 이는 몇 가지 이유로 저의 의도와 맞지 않았습니다.
- 저는 리소스를 생성, 편집 및 삭제할 수 있는 권한을 가진 별도의 관리자 계정을 사용하고 있지만, 이번 PoC (Proof of Concept)는 엄격하게 읽기 전용 (read-only)으로 유지하고 싶었습니다.
- 저는 AI를 하나의 고유한 ID (identity)처럼 취급하기 시작하고 싶습니다.
- 이번 PoC를 위해 인증 (authentication)을 조금 더 이식성 있게 (portable) 만들어 다른 팀원들도 시도해 볼 수 있게 하고 싶었습니다. 어쨌든 읽기 전용이며, 하나의 구독 (subscription)으로 제한되어 있으니까요.
그래서 저는 Entra에서 새로운 앱 등록 (app registration)을 생성하고, 클라이언트 토큰/비밀값 (client token/secret)을 생성한 뒤, 해당 앱 등록에 제가 원하는 권한을 부여했습니다. 저는 완전히 새로운 ID를 사용하는 것이 최선이라고 느꼈는데, 그 이유는 해당 ID가 다른 곳에서 기존 권한을 가지고 있지 않음을 보장할 수 있기 때문입니다. 저는 확실한 가드레일 (guardrail)을 마련하고 싶었습니다. 왜냐하면 이곳은 미지의 영역이기 때문입니다. 물론 AI 모델은 보통 행동하기 전에 권한을 요청하지만, 단 한 번의 잘못된 클릭이나 집중력 저하가 리소스를 수정할 수 있는 권한을 부여할 수도 있습니다. 제가 시도하려는 작업에서는 이는 절대 있어서는 안 될 일입니다. 서비스 주체 (Service Principal)는 더 높은 수준에서 또 다른 가드레일을 제공합니다.
MCP 서버 실행 방식 선택하기
문서에서는 주로 NuGet, NPM, PyPI와 같은 다양한 패키지 관리자 (package manager)를 사용하는 옵션들을 여기에 나열하고 있습니다. 하지만 저는 Docker Desktop의 MCP 서버 카탈로그를 활용하여 MCP를 배우며 이것저것 시도해 보고 있었고, Claude Desktop에서 MCP를 실행하는 방식에 있어 일관성을 유지하고 싶었습니다. Microsoft 또한 해당 시나리오에 대해 이곳에 아주 편리하게 문서화해 두었습니다.
참고로 저 또한 MacOS와 NPM을 사용했을 때 좋은 경험을 했으므로, 이를 어떻게 실행할지는 전적으로 여러분의 선택에 달려 있습니다. 다만 한 가지 말씀드리고 싶은 점은, 사용 가능한 환경 변수(environment variables)가 일반적인 Azure SDK 인증 방식에서 비롯되므로, 일반적인 Azure SDK 인증 방식에 익숙해져 있어야 한다는 것입니다. 이 변수들은 Azure MCP만을 위해 독자적으로 생성되거나 고유한 것이 아닙니다.
MCP 호스트(Host) 선택하기
이것은 궁극적으로 개인의 결정 사항입니다. 저는 개인적으로 Claude Desktop(제가 선호하는 MCP 호스트)과 GitHub Copilot 확장을 사용하는 VS Code 모두에서 이를 작동시켰습니다. 제가 관찰한 바로는 흐름이 상당히 유사해 보입니다. 즉, MCP 서버를 설정하고, Azure 인증 시 환경 변수를 어떻게 전달할지 계획하며, MCP 호스트가 해당 MCP 서버를 사용하도록 JSON 파일을 수정하는 과정을 거치게 됩니다.
서비스 주체(Service Principal)를 사용한 Azure MCP 서버 설정하기
서비스 주체(Service Principal) 생성하기
여기서 자세히 설명하지는 않겠습니다. 이것은 서비스 주체를 생성하는 튜토리얼이 아니기 때문입니다. 하지만 먼저 Entra를 사용하여 앱 등록(app registration)을 생성하고, 인증 방식(저는 만료 기간이 짧은 클라이언트 비밀(client secret)을 선택했지만, 인증서(certificates)도 좋은 옵션입니다)을 구성한 다음, 해당 앱 등록/서비스 주체에 몇 가지 Azure 권한을 할당해야 합니다. 나중에 테넌트 ID(tenant ID), 이 앱 등록의 클라이언트/앱 ID(client/app ID), 그리고 클라이언트 비밀 또는 인증서가 필요하므로 이 작업을 먼저 완료해 두는 것이 좋습니다.
Azure RBAC 권한 구성하기
앞서 언급했듯이, 저는 이번 PoC (Proof of Concept)가 엄격하게 읽기 전용(read-only)이기를 원했습니다. 그리고 제가 생각할 수 있는 가장 좋은 가드레일(guardrail)은 Azure RBAC였습니다. AI가 스스로 가치 있다고 판단하여 변경을 시도하더라도 이를 수행할 수 없도록, AI보다 상위 계층에서 제어할 수 있는 무언가를 원했습니다. 하지만 이는 단지 그뿐만 아니라 PoC의 범위에 관한 문제이기도 하며, 이는 개인적인 선택 사항입니다. 저는 개인적으로 하나의 구독(subscription)으로 제한하되, 해당 구독 전체를 대상으로 하고 싶었기에 Reader 역할을 선택했습니다. 추가적인 보안을 위해 이 할당에 시간 제한을 두는 방식을 선택할 수도 있으며, 이를 인증서나 유효 기간이 짧은 토큰(token)과 결합하면 효과적일 수 있습니다.
환경 구성하기
Docker Desktop
기본 Docker 설정
당연히 Docker Desktop이 설치되어 있어야 하며, Path 환경 변수에 등록되어 있어야 합니다. 터미널에서 docker 명령어를 실행할 수 있어야 합니다. 첫 실행 속도를 높이고 싶다면, 여기에서 찾을 수 있는 Azure MCP 최신 빌드를 미리 pull 하여 이미지가 로컬에 사용 가능한 상태인지 확인하는 것을 고려해 보세요.
인증 (Authentication)
다음은 인증입니다. Docker를 사용할 때 Microsoft는 AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET 변수를 포함하는 .env 파일을 권장하지만, AZURE_CLIENT_CERTIFICATE_PATH 및 AZURE_CLIENT_CERTIFICATE_PASSWORD와 같은 인증서 관련 다른 변수들도 여기서 작동할 것이라고 생각합니다. 다만 인증서 방식을 선택할 경우, 다음 단계에서 수행할 Docker run 설정의 일부로 인증서 파일을 컨테이너에 전달해야 한다는 점을 유의해야 합니다. 이를 위해 바인드 마운트(bind mount)를 사용할 수 있지만 저는 테스트해보지 않았습니다. 저는 클라이언트 비밀(client secret) 방식을 사용했습니다.
여기서 클라이언트 비밀(client secret)을 평문(plain text)으로 저장하고 있으며, 컨테이너를 조사하여 이를 확인할 수도 있다는 점도 주목할 만합니다. 이는 이상적인 방법은 아니며, 더 나은 보안 방법을 조사하는 데 시간을 투자할 가치가 충분합니다. Azure RBAC라는 안전장치가 있고 모든 것이 제 로컬 머신에서 이루어졌기 때문에 저에게는 허용 가능한 수준이었지만, 진행하기 전에 위험 요소를 평가해 볼 가치가 충분합니다.
Claude Desktop 설정하기
다행히 Microsoft 덕분에 이 과정은 매우 간단했습니다. 그들은 훌륭한 MCP 설정 파일 예시를 제공하고 있으며, 저는 Claude와 함께 제 설정을 작동시켰습니다. 내용은 다음과 같습니다:
"Azure MCP Server": {
"command": "docker",
"args": [
...
제 .env 파일 경로를 가렸으니, 단순히 다음과 같은 형식으로 교체하세요:
그리고 백슬래시(backslash)를 이스케이프(escape) 처리해야 한다는 점에 유의하세요! Claude Desktop은 기본적으로 env 파일을 다음 위치에 저장합니다:
%APPDATA%\Claude\claude_desktop_config.json
하지만 Claude Desktop의 Settings > Developer 메뉴로 이동하여 찾을 수도 있습니다.
...
모든 리소스 그룹(resource groups)을 불러와서 제 Azure MCP Server 연결을 테스트해 주세요. 구독 ID(subscription ID)는 1111111-fffffff-bbbbbb-ggggggg이며 당신은 접근 권한을 가지고 있어야 합니다.
- 리소스 그룹 이름들이 반환된다면 설정이 완료된 것입니다!
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기