@description('기존 APIM 서비스 이름') param apimServiceName string @description('ARM 호출에 사용할 User-assigned Managed Identity 이름 (이미 APIM에 연결되어 있고, 구독에 Microsoft.ApiManagement/service/subscriptions/read 등 권한이 할당되어 있어야 함)') param managedIdentityName string = 'iac-structure-dev-gisonm' // ---- 기존 리소스 참조 (이미 Portal/이전 IaC로 생성됨) ---- resource apim 'Microsoft.ApiManagement/service@2023-05-01-preview' existing = { name: apimServiceName } resource uami 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' existing = { name: managedIdentityName } // 구독ID/리소스그룹은 하드코딩하지 않고 배포 컨텍스트에서 자동으로 얻음 var armBasePath = '/subscriptions/${subscription().subscriptionId}/resourceGroups/${resourceGroup().name}/providers/Microsoft.ApiManagement/service/${apimServiceName}' // ---- Policy Fragments ---- resource fragmentNormalize 'Microsoft.ApiManagement/service/policyFragments@2023-05-01-preview' = { parent: apim name: 'normalize-subscription' properties: { format: 'rawxml' value: loadTextContent('fragments/normalize-subscription.xml') } } resource fragmentProjectView 'Microsoft.ApiManagement/service/policyFragments@2023-05-01-preview' = { parent: apim name: 'project-view' properties: { format: 'rawxml' value: loadTextContent('fragments/project-view.xml') } } // ---- Admin API ---- resource adminApi 'Microsoft.ApiManagement/service/apis@2023-05-01-preview' = { parent: apim name: 'admin-api' properties: { displayName: 'Admin API' path: 'admin' protocols: [ 'https' ] subscriptionRequired: true } } resource adminApiPolicy 'Microsoft.ApiManagement/service/apis/policies@2023-05-01-preview' = { parent: adminApi name: 'policy' properties: { format: 'rawxml' value: replace( loadTextContent('policies/all-operations.xml'), '{{MI_CLIENT_ID}}', uami.properties.clientId ) } } // ---- 오퍼레이션: List Subscriptions ---- resource opListSubscriptions 'Microsoft.ApiManagement/service/apis/operations@2023-05-01-preview' = { parent: adminApi name: 'list-subscriptions' properties: { displayName: 'List Subscriptions' method: 'GET' urlTemplate: '/subscriptions' } } resource opListSubscriptionsPolicy 'Microsoft.ApiManagement/service/apis/operations/policies@2023-05-01-preview' = { parent: opListSubscriptions name: 'policy' properties: { format: 'rawxml' value: replace( loadTextContent('policies/list-subscriptions.xml'), '{{ARM_BASE_PATH}}', armBasePath ) } dependsOn: [ fragmentNormalize fragmentProjectView ] }