เชื่อมต่อ AI Agent บน Microsoft Foundry กับ MCP ภายในองค์กร แบบปลอดภัย 100% ไม่ต้องออก Internet!
Author
Admin
Date Published

หลายท่านที่ใช้งาน Foundry Agent Service อาจเคยติดปัญหาว่า ทำไม Agent ถึงเรียกใช้ MCP (Model Context Protocol) Server ที่ซ่อนอยู่ในระบบภายในหรือ On-Premises ของบริษัทเราไม่ได้?
แน่นอนผมติดปัญหานี้อยู่ 2-3 วันเลยทีเดียว...
ทีมพยายามหา Solution เช่น
Solution Allowlist IP -> ผลคือช่วยไม่ได้: เพราะ IP ขาออกของ Shared runtime ไม่ได้เป็นของเราคนเดียว การ Allowlist จะเสี่ยงต่อความปลอดภัย และตัว Endpoint ก็ยังเป็น Public อยู่ดี
คำตอบคือ "เพราะค่าเริ่มต้นของ Agent Runtime อยู่ในระบบของ Microsoft" ทำให้มองไม่เห็น Private IP ภายในองค์กรนั่นเองครับ

💡 ทางออกคือการใช้ "VNet Injection" บทความนี้เราสรุปแนวทางการแก้ปัญหาทางสถาปัตยกรรม (Architecture) ที่ช่วยให้:
-> Inject Agent Runtime เข้ามาอยู่ใน VNet ของเราเองผ่าน Subnet ที่กำหนด
-> เรียก MCP ผ่าน Internal Load Balancer, Private Endpoint หรือเชื่อมต่อไปยังระบบ On-Premises ผ่าน ExpressRoute / VPN ได้โดยตรง
-> ปิด Public Internet Access ของ Foundry ไปได้เลย ปลอดภัยขึ้นอีกระดับ

แต่ !!! เดี๋ยวก่อน เมื่อคุณพยายาม ยัด Vnet ใส่ไปเพื่อให้ได้ตามรูปด้านล่าง มันเหมือนจะถูกต้องแล้ว ... แต่ก็ยังไม่ได้เหมือนเดิมครับ ^^'

ขั้นตอนที่เราจะต้องทำต้องทำตามลำดับนี้ครับ เพราะ subnet ต้องมีก่อน account และ account ต้องมีก่อน project, capability host และ connection
Step 1 : สร้าง subnet สำหรับ Agent และ delegate ให้ Microsoft.App/environments (ซึ่งเราทำไปแล้วจากรูปข้างบน)
Delegation นี้คือสิ่งที่ทำให้ Foundry inject runtime เข้า subnet ได้ subnet ต้องใช้ address space แบบ RFC1918 Class B หรือ C
1resource "azurerm_subnet" "agent" {2 name = "snet-agent"3 address_prefixes = ["192.168.0.0/24"]4 delegation {5 name = "Microsoft.App/environments"6 service_delegation {7 name = "Microsoft.App/environments"8 actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"]9 }10 }11}
Step 2 : เปิด networkInjections บน Foundry account
ต้องใช้ provider azapi เพราะ azurerm ยังไม่รองรับ property นี้ ตั้ง useMicrosoftManagedNetwork = false เพื่อใช้ VNet ของเราเอง
1type = "Microsoft.CognitiveServices/accounts@2025-06-01"2properties = {3 publicNetworkAccess = "Disabled"4 networkAcls = { defaultAction = "Deny", bypass = "AzureServices" }56 networkInjections = [{7 scenario = "agent"8 subnetArmId = azurerm_subnet.agent.id9 useMicrosoftManagedNetwork = false10 }]11}
Step 3 : สร้าง Project และ Capability Host
Capability Host ชนิด Agents คือตัวเปิดใช้ Agent Service บน project นั้น ด้วยการใช้ basic setup ไม่มี BYO Search, Storage หรือ Cosmos DB
1type = "Microsoft.CognitiveServices/accounts/projects/capabilityHosts@2025-04-01-preview"2body = { properties = { capabilityHostKind = "Agents" } }
This content above is completely dynamic using custom layout building blocks configured in the CMS. This can be anything you'd like from rich text and images, to highly designed, complex components.