Microsoft Foundry(구 Azure AI Foundry)는 모델, Agent, 도구를 Foundry 리소스 하나와 그 아래 프로젝트로 묶어 관리하는 Azure의 AI 플랫폼입니다. 모델 배포와 보안, 네트워크는 리소스에서 한 번 정하고, 팀별 작업은 프로젝트로 나눕니다. Private Endpoint를 붙이고 Public Network Access를 끄면 VNet과 VPN, ExpressRoute로 연결된 곳에서만 모델을 호출할 수 있습니다.
1. Microsoft Foundry란
Microsoft Foundry는 Azure AI Studio에서 Azure AI Foundry를 거쳐 지금의 이름이 된 AI 개발 플랫폼입니다. 이름은 바뀌었지만 Azure 리소스 유형은 계속 Microsoft.CognitiveServices/accounts라서, 기존 Azure OpenAI에 걸어 둔 Azure Policy와 RBAC(역할 기반 액세스 제어) 규칙을 그대로 이어서 쓸 수 있습니다.
| 기능 | 내용 |
| Models | Microsoft, OpenAI, Anthropic, Meta 등의 모델 10,000개 이상을 Catalog에서 골라 배포 |
| Agents | 포털이나 SDK로 Prompt Agent를 만들거나, 직접 작성한 코드를 Hosted Agent로 배포 |
| Tools and Knowledge | 기본 제공 도구, 메모리, Retrieval로 Agent 기능 확장 |
예전 구성(Classic)을 써 본 분이라면 가장 크게 달라진 점은 리소스 구조입니다. 예전에는 Azure OpenAI 리소스와 Hub를 따로 만들고 둘을 연결했는데, 지금은 Foundry 리소스 하나 아래에 프로젝트를 만듭니다. Hub 기반 프로젝트는 Foundry(classic) 포털에서만 열리고 새 기능은 Foundry 프로젝트에만 추가되므로, 저는 새로 시작한다면 Hub 없이 Foundry 리소스로 시작하는 것이 맞다고 봅니다.
| 구분 | Classic | 현재 |
| 포털 | Foundry(classic) 포털 | Foundry 포털(ai.azure.com) |
| 리소스 | Azure OpenAI + Hub | Foundry 리소스(AIServices) + 하위 프로젝트 |
| AI 서비스 | Azure AI Services | Foundry Tools |
| RBAC 역할 | Cognitive Services OpenAI User | Foundry User, Foundry Project Manager, Foundry Owner |
| API | Assistants API | Responses API (Assistants API는 2026년 8월 26일 종료) |
| API 버전 | 매월 바뀌는 api-version 파라미터 | v1 경로(버전 파라미터 없음) |
2. 리소스 구조

Foundry 리소스가 모델 배포와 연결을 갖고, 프로젝트는 이를 함께 쓰면서 자기 자산만 따로 보관하는 구조
Foundry는 세 층으로 나뉩니다. 맨 위 Foundry 리소스는 보안 설정, 모델 배포, Connections, 네트워크를 관리하는 거버넌스 단위입니다. 그 아래 프로젝트(Microsoft.CognitiveServices/accounts/projects)는 개발 단위로, 리소스에 이미 있는 모델 배포와 연결을 다시 설정하지 않고 가져다 씁니다. 파일, Agent, 평가 결과 같은 프로젝트 자산은 프로젝트마다 따로 보관됩니다.
| 구분 | Foundry 리소스 | 프로젝트 |
| 역할 | 거버넌스 단위 | 개발 단위 |
| 여기서 하는 일 | 모델 배포, 프로젝트 생성, 연결, 보안·네트워크 설정 |
Agent 빌드, 평가 실행, 파일 업로드 |
| RBAC 구분 | Control Plane 작업 | Data Plane 작업 |
| 공유 여부 | 모든 프로젝트가 함께 사용 | 프로젝트별로 분리 |
Storage, Key Vault, AI Search 같은 연결된 리소스는 Foundry가 연결로 참조할 뿐 관리 경계가 따로 있습니다. 그래서 이 리소스들의 네트워크와 접근 정책은 Foundry와 별도로 설정해야 하고, 뒤에서 다룰 Private Endpoint도 각각 만들어야 합니다.
역할 이름도 최근 바뀌었습니다. Azure AI User, Azure AI Owner, Azure AI Account Owner, Azure AI Project Manager가 각각 Foundry User, Foundry Owner, Foundry Account Owner, Foundry Project Manager가 됐고 역할 ID와 권한은 그대로입니다. 개발자에게는 Foundry 리소스 범위의 Foundry User부터 주는 것이 문서의 권장 시작점입니다.
3. Deployment Type
모델을 배포할 때 고르는 Deployment Type은 추론 데이터가 처리되는 위치와 과금 방식을 정합니다. Data at rest는 어떤 유형이든 지정한 Azure Geography에 남고, 달라지는 것은 프롬프트와 응답이 처리되는 위치입니다.
| 타입 | 처리 위치·과금 | 용도 |
| Global Standard | 모든 Azure Region 토큰당 과금 |
기본 선택, Quota가 가장 큼 |
| Data Zone Standard | Data Zone 안(US, EU, APAC) 토큰당 과금 |
Data Zone 규정 준수 |
| Standard | 지정한 Azure Geography 안 토큰당 과금 |
Geography 규정 준수, 사용량이 적거나 중간 |
| Provisioned | Global, Data Zone, Regional 중 선택 PTU |
처리량이 꾸준히 많고 지연 편차를 줄여야 할 때 |
| Batch | Global, Data Zone 중 선택 Global Standard보다 50% 저렴 |
대량 비동기 작업 (24시간 목표) |
| Developer | 모든 Azure Region 토큰당 과금 |
Fine-tuned 모델 평가 전용 (24시간 유지, SLA 없음) |
새 모델은 Global, Data Zone, Geography 기반 순서로 열리고 Geography 기반 유형은 날짜가 보장되지 않습니다. 그래서 저는 규정상 제약이 없으면 Global Standard로 시작하고, 데이터 처리 위치를 지켜야 하는 서비스만 Data Zone이나 Standard를 쓰는 편이 현실적이라고 봅니다.
4. Private Link 구성

VNet 안의 VM이 Private Endpoint를 거쳐 Foundry와 연결된 리소스에 사설 IP로 접근하는 구성
Foundry의 네트워크 격리는 세 방향으로 나눠서 봅니다. 사용자와 앱이 Foundry로 들어오는 인바운드, Foundry가 다른 Azure 서비스로 나가는 아웃바운드, Agent가 사설 Data Source로 나가는 아웃바운드(VNet Injection)입니다. 이 글에서는 가장 먼저 필요한 인바운드, 즉 Private Endpoint로 들어오는 경로를 다룹니다.
인바운드는 PNA(Public Network Access) 설정으로 정합니다. Enabled, Disabled, 그리고 지정한 IP에서만 허용하는 Enabled from selected IP addresses 중 하나를 고르며, Disabled로 두면 Private Endpoint로만 접근할 수 있습니다.
| 항목 | 값 |
| Group ID | account |
| Private DNS Zone | privatelink.cognitiveservices.azure.com privatelink.openai.azure.com privatelink.services.ai.azure.com |
| 호출 주소 | Custom Subdomain 주소 그대로 사용 (예: my-foundry-01.openai.azure.com) |
| 연결된 리소스 | AI Search, Storage, Cosmos DB의 Private Endpoint는 자동으로 만들어지지 않으므로 각각 생성 |

같은 주소가 VNet 안에서는 Private Endpoint의 사설 IP로, 밖에서는 Public Endpoint로 해석되는 과정
Private Endpoint를 만들면 my-foundry-01.openai.azure.com 같은 공용 이름이 my-foundry-01.privatelink.openai.azure.com으로 CNAME됩니다. privatelink Zone을 Private DNS Zone으로 만들어 VNet에 연결해 두면 VNet 안에서는 사설 IP가 돌아오고, 밖에서는 Public Endpoint로 해석되지만 PNA가 Disabled라서 접근이 막힙니다. 앱은 접속 주소를 바꿀 필요가 없고, 내부 CNAME인 *.privatelink.* 주소를 직접 호출해서는 안 됩니다. Private DNS Zone의 동작은 Private DNS Zone과 DNS Private Resolver 정리에서 더 자세히 다뤘습니다.
PNA를 끄면 Foundry 포털도 사설망에서 열어야 합니다. 문서에서 안내하는 접속 방법은 세 가지입니다.
| 방식 | 연결 | 용도 |
| VPN Gateway | P2S(Point-to-site): PC마다 VPN 클라이언트로 연결 S2S(Site-to-site): 사내 VPN 장비와 VNet 연결 |
개인 PC 또는 사무실 단위 접속 |
| ExpressRoute | 회선 사업자를 통한 전용 연결 | 온프레미스와 상시 대량 통신 |
| Azure Bastion + Jump Box VM |
브라우저에서 Bastion으로 VNet 안 VM에 RDP·SSH 접속 | 별도 회선 없이 빠르게 확인 |
5. Azure CLI로 만들어 보기
Azure CLI 2.80.0 이상이 필요합니다. 이름(NAME)은 Custom Subdomain으로도 쓰이므로 전역에서 겹치지 않게 정합니다. Korea Central(koreacentral)은 Foundry 프로젝트를 만들 수 있는 Region이지만, 모델과 Deployment Type은 Region마다 다르므로 5.2의 조회 결과를 먼저 확인합니다.
5.1 Foundry 리소스와 프로젝트
RG=rg-foundry
LOC=koreacentral
NAME=my-foundry-01
az group create --name $RG --location $LOC
az cognitiveservices account create \
--name $NAME --resource-group $RG \
--kind AIServices --sku S0 --location $LOC \
--custom-domain $NAME --assign-identity \
--allow-project-management true
az cognitiveservices account project create \
--name $NAME --resource-group $RG \
--project-name proj-dev --location $LOC
5.2 모델 배포와 호출
# 이 리전에서 배포할 수 있는 버전과 배포 유형(SKU) 확인
az cognitiveservices model list --location $LOC \
--query "[?model.name=='gpt-5-mini'].[model.version, model.skus[].name]" -o json
az cognitiveservices account deployment create \
--name $NAME --resource-group $RG \
--deployment-name gpt-5-mini --model-name gpt-5-mini \
--model-version "2025-08-07" --model-format OpenAI \
--sku-name GlobalStandard --sku-capacity 10
# 호출할 사용자에게 Foundry 리소스 범위의 Foundry User 역할 부여
FOUNDRY_ID=$(az cognitiveservices account show \
--name $NAME --resource-group $RG --query id -o tsv)
az role assignment create \
--role "53ca6127-db72-4b80-b1b0-d745d6d5456d" \
--assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
--assignee-principal-type User --scope $FOUNDRY_ID
# Microsoft Entra ID 토큰으로 v1 Responses API 호출(model에는 배포 이름)
TOKEN=$(az account get-access-token \
--resource https://cognitiveservices.azure.com --query accessToken -o tsv)
curl -X POST https://$NAME.openai.azure.com/openai/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"model": "gpt-5-mini", "input": "Private Link test"}'
Role Assignment는 반영까지 몇 분 걸릴 수 있습니다. API 키 대신 Microsoft Entra ID 토큰을 쓴 이유는 키가 리소스 전체 권한을 갖기 때문이며, 문서도 운영 환경에는 Keyless 인증을 권장합니다.
5.3 Private Endpoint와 DNS
VNET=vnet-ai
az network vnet create --resource-group $RG --name $VNET \
--address-prefixes 10.0.0.0/16 \
--subnet-name snet-app --subnet-prefixes 10.0.1.0/24
az network vnet subnet create --resource-group $RG --vnet-name $VNET \
--name snet-pe --address-prefixes 10.0.2.0/24
az network private-endpoint create --resource-group $RG \
--name pe-foundry --vnet-name $VNET --subnet snet-pe \
--private-connection-resource-id $FOUNDRY_ID \
--group-id account --connection-name conn-foundry
# privatelink Zone 3개를 만들고 VNet에 연결
for ZONE in privatelink.cognitiveservices.azure.com \
privatelink.openai.azure.com \
privatelink.services.ai.azure.com; do
az network private-dns zone create --resource-group $RG --name $ZONE
az network private-dns link vnet create --resource-group $RG \
--zone-name $ZONE --name link-$VNET \
--virtual-network $VNET --registration-enabled false
done
# Private Endpoint의 A 레코드를 Zone에 자동 등록
az network private-endpoint dns-zone-group create --resource-group $RG \
--endpoint-name pe-foundry --name default \
--private-dns-zone privatelink.cognitiveservices.azure.com \
--zone-name cognitiveservices
az network private-endpoint dns-zone-group add --resource-group $RG \
--endpoint-name pe-foundry --name default \
--private-dns-zone privatelink.openai.azure.com --zone-name openai
az network private-endpoint dns-zone-group add --resource-group $RG \
--endpoint-name pe-foundry --name default \
--private-dns-zone privatelink.services.ai.azure.com --zone-name services
5.4 Public Access 차단과 확인
# Public Network Access 끄기
az resource update --ids $FOUNDRY_ID \
--set properties.publicNetworkAccess=Disabled
# snet-app에 둔 VM에서 확인: privatelink CNAME과 10.0.2.x가 나와야 함
nslookup my-foundry-01.openai.azure.com
VNet 안의 VM에서는 5.2의 curl 호출이 그대로 성공하고, 사설망 밖의 PC에서는 같은 호출이 거부되면 구성이 끝난 것입니다. Azure 포털의 Foundry 리소스 > Networking > Private Endpoint Connections에서 상태가 Approved인지도 함께 확인합니다.
6. 운영 시 주의점
| 항목 | 조치 |
| 연결된 리소스의 Private Endpoint |
AI Search, Storage, Cosmos DB는 Foundry를 만들 때 Private Endpoint가 생기지 않습니다. 각 리소스에서 따로 만들고 DNS도 함께 구성합니다. |
| 아웃바운드 VNet Injection | 기존 Foundry 리소스에 나중에 추가할 수 없고 다시 배포해야 합니다. Agent가 사설 데이터에 접근할 계획이면 처음부터 설계에 넣습니다. |
| 호출 주소 | Private Endpoint를 거칠 때도 Custom Subdomain 주소를 씁니다. *.privatelink.* 주소를 직접 호출하지 않습니다. |
| AI Gateway (APIM) |
Foundry 포털에서 만든 AI Gateway는 공용으로 만들어집니다. 사설 Foundry와 함께 쓰려면 Azure 포털에서 네트워크 격리를 따로 설정합니다. |
| Deployment Type과 데이터 위치 | Global 유형은 어느 Region에서든 추론이 처리될 수 있습니다. 처리 위치 규정이 있으면 Data Zone이나 Standard를 고릅니다. |
| 역할과 API 변경 | 예전 역할 이름(Azure AI User 등)이 일부 화면에 남아 있을 수 있습니다. Assistants API를 쓰던 코드는 Responses API로 옮깁니다. |
7. 정리
- Microsoft Foundry는 Foundry 리소스(거버넌스)와 프로젝트(개발) 두 층으로 나뉘고, 모델 배포와 연결은 리소스에서 공유합니다.
- Deployment Type은 추론 처리 위치와 과금을 정하며, 제약이 없으면 Global Standard로 시작합니다.
- Private Endpoint(group ID account)와 privatelink Zone 3개를 만들고 PNA를 끄면 사설망에서만 호출됩니다. 연결된 리소스는 따로 막아야 합니다.
참고
'Cloud > Azure' 카테고리의 다른 글
| [Azure] Private Link Service 정리 (0) | 2026.09.25 |
|---|---|
| [Azure] Azure Firewall 구성 정리 (0) | 2026.09.25 |
| [Azure] AKS Ingress Gateway API 이전 정리 (0) | 2026.09.25 |
| [Azure] Azure NAT Gateway 정리 (0) | 2026.09.25 |
| [Azure] Azure Kubernetes Service 구성 정리 (0) | 2026.09.25 |