@@ -1413,6 +1413,189 @@ module containerApp 'br/public:avm/res/app/container-app:0.18.1' = {
14131413 name : 'APP_ENV'
14141414 value : 'Prod'
14151415 }
1416+ {
1417+ name : 'AZURE_COGNITIVE_SERVICES'
1418+ value : 'https://cognitiveservices.azure.com/.default'
1419+ }
1420+ {
1421+ name : 'AZURE_BING_CONNECTION_NAME'
1422+ value : ''
1423+ }
1424+ {
1425+ name : 'REASONING_MODEL_NAME'
1426+ value : ''
1427+ }
1428+ {
1429+ name : 'MCP_SERVER_ENDPOINT'
1430+ value : ''
1431+ }
1432+ {
1433+ name : 'MCP_SERVER_NAME'
1434+ value : 'MACAE MCP Server'
1435+ }
1436+ {
1437+ name : 'MCP_SERVER_DESCRIPTION'
1438+ value : ''
1439+ }
1440+ {
1441+ name : 'AZURE_TENANT_ID'
1442+ value : tenant ().tenantId
1443+ }
1444+ {
1445+ name : 'AZURE_CLIENT_ID'
1446+ value : userAssignedIdentity !.outputs .clientId
1447+ }
1448+ {
1449+ name : 'SUPPORTED_MODELS'
1450+ value : ''
1451+ }
1452+ {
1453+ name : 'AZURE_AI_SEARCH_CONNECTION_NAME'
1454+ value : aiSearchConnectionName
1455+ }
1456+ {
1457+ name : 'AZURE_AI_SEARCH_INDEX_NAME'
1458+ value : ''
1459+ }
1460+ {
1461+ name : 'AZURE_AI_SEARCH_ENDPOINT'
1462+ value : searchService .outputs .endpoint
1463+ }
1464+ {
1465+ name : 'AZURE_AI_SEARCH_API_KEY'
1466+ value : ''
1467+ }
1468+ {
1469+ name : 'BING_CONNECTION_NAME'
1470+ value : ''
1471+ }
1472+ {
1473+ name : 'AZURE_STORAGE_BLOB_URL'
1474+ value : avmStorageAccount .outputs .serviceEndpoints .blob
1475+ }
1476+ {
1477+ name : 'AZURE_STORAGE_CONTAINER_NAME'
1478+ value : storageContainerName
1479+ }
1480+ {
1481+ name : 'AZURE_SEARCH_ENDPOINT'
1482+ value : searchService .outputs .endpoint
1483+ }
1484+ ]
1485+ }
1486+ ]
1487+ }
1488+ }
1489+
1490+ // ========== MCP Container App Service ========== //
1491+ // WAF best practices for container apps: https://learn.microsoft.com/en-us/azure/well-architected/service-guides/azure-container-apps
1492+ // PSRule for Container App: https://azure.github.io/PSRule.Rules.Azure/en/rules/resource/#container-app
1493+ var containerAppMcpResourceName = 'ca-mcp-${solutionSuffix }'
1494+ module containerAppMcp 'br/public:avm/res/app/container-app:0.18.1' = {
1495+ name : take ('avm.res.app.container-app.${containerAppMcpResourceName }' , 64 )
1496+ params : {
1497+ name : containerAppMcpResourceName
1498+ tags : tags
1499+ location : location
1500+ enableTelemetry : enableTelemetry
1501+ environmentResourceId : containerAppEnvironment .outputs .resourceId
1502+ managedIdentities : { userAssignedResourceIds : [userAssignedIdentity .outputs .resourceId ] }
1503+ ingressTargetPort : 9000
1504+ ingressExternal : true
1505+ activeRevisionsMode : 'Single'
1506+ corsPolicy : {
1507+ allowedOrigins : [
1508+ 'https://${webSiteResourceName }.azurewebsites.net'
1509+ 'http://${webSiteResourceName }.azurewebsites.net'
1510+ ]
1511+ }
1512+ // WAF aligned configuration for Scalability
1513+ scaleSettings : {
1514+ maxReplicas : enableScalability ? 3 : 1
1515+ minReplicas : enableScalability ? 2 : 1
1516+ rules : [
1517+ {
1518+ name : 'http-scaler'
1519+ http : {
1520+ metadata : {
1521+ concurrentRequests : '100'
1522+ }
1523+ }
1524+ }
1525+ ]
1526+ }
1527+ containers : [
1528+ {
1529+ name : 'mcp'
1530+ //image: '${backendContainerRegistryHostname}/${backendContainerImageName}:${backendContainerImageTag}'
1531+ image : 'macaemcpacrdk.azurecr.io/macae-mac-app:t9'
1532+ //TODO: configure probes for container app
1533+ // probes: [
1534+ // {
1535+ // httpGet: {
1536+ // httpHeaders: [
1537+ // {
1538+ // name: 'Custom-Header'
1539+ // value: 'Awesome'
1540+ // }
1541+ // ]
1542+ // path: '/health'
1543+ // port: 8080
1544+ // }
1545+ // initialDelaySeconds: 3
1546+ // periodSeconds: 3
1547+ // type: 'Liveness'
1548+ // }
1549+ // ]
1550+ resources : {
1551+ cpu : '2.0'
1552+ memory : '4.0Gi'
1553+ }
1554+ env : [
1555+ {
1556+ name : 'MCP_HOST'
1557+ value : '0.0.0.0'
1558+ }
1559+ {
1560+ name : 'MCP_PORT'
1561+ value : '9000'
1562+ }
1563+ {
1564+ name : 'MCP_DEBUG'
1565+ value : 'false'
1566+ }
1567+ {
1568+ name : 'MCP_SERVER_NAME'
1569+ value : 'MACAE MCP Server'
1570+ }
1571+ {
1572+ name : 'MCP_ENABLE_AUTH'
1573+ value : 'true'
1574+ }
1575+ {
1576+ name : 'AZURE_TENANT_ID'
1577+ value : tenant ().tenantId
1578+ }
1579+ {
1580+ name : 'AZURE_CLIENT_ID'
1581+ value : userAssignedIdentity !.outputs .clientId
1582+ }
1583+ {
1584+ name : 'AZURE_JWKS_URI'
1585+ value : 'https://login.microsoftonline.com/${tenant ().tenantId }/discovery/v2.0/keys'
1586+ }
1587+ {
1588+ name : 'AZURE_ISSUER'
1589+ value : 'https://sts.windows.net/${tenant ().tenantId }/'
1590+ }
1591+ {
1592+ name : 'AZURE_AUDIENCE'
1593+ value : 'api://${userAssignedIdentity !.outputs .clientId }'
1594+ }
1595+ {
1596+ name : 'DATASET_PATH'
1597+ value : './datasets'
1598+ }
14161599 ]
14171600 }
14181601 ]
0 commit comments