Skip to content

Commit fe9b436

Browse files
authored
Merge pull request #18 from mattchenderson/main
Updating infrastructure for readability and testing
2 parents 33077bd + eb0c84e commit fe9b436

24 files changed

+225
-622
lines changed

.vscode/settings.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,11 @@
44
"azureFunctions.projectLanguage": "Python",
55
"azureFunctions.projectRuntime": "~4",
66
"debug.internalConsoleOptions": "neverOpen",
7-
"azureFunctions.projectLanguageModel": 2
7+
"azureFunctions.projectLanguageModel": 2,
8+
"files.exclude": {
9+
"__azurite*": true,
10+
"__blobstorage__": true,
11+
"__queuestorage__": true,
12+
"AzuriteConfig": true
13+
}
814
}
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ param aiProjectDescription string = 'AI Project for Snippy code analysis'
2525
@description('Resource ID of the storage account')
2626
param storageAccountId string
2727

28-
@description('Resource ID of the key vault')
29-
param keyVaultId string
30-
3128
@description('Resource ID of the AI Services')
3229
param aiServicesId string
3330

@@ -37,6 +34,18 @@ param aiServicesEndpoint string
3734
@description('AI Services name')
3835
param aiServicesName string
3936

37+
@description('key vault name')
38+
param keyVaultName string
39+
40+
41+
module keyVault 'br/public:avm/res/key-vault/vault:0.12.1' = {
42+
name: 'keyVault'
43+
scope: resourceGroup()
44+
params: {
45+
location: location
46+
name: keyVaultName
47+
}
48+
}
4049

4150
resource aiServices 'Microsoft.CognitiveServices/accounts@2025-04-01-preview' existing = {
4251
name: aiServicesName
@@ -54,7 +63,7 @@ resource aiHub 'Microsoft.MachineLearningServices/workspaces@2025-01-01-preview'
5463
friendlyName: aiHubFriendlyName
5564
description: aiHubDescription
5665
storageAccount: storageAccountId
57-
keyVault: keyVaultId
66+
keyVault: keyVault.outputs.resourceId
5867
}
5968
kind: 'hub'
6069

infra/app/api.bicep

Lines changed: 76 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ param name string
22
param location string = resourceGroup().location
33
param tags object = {}
44
param applicationInsightsName string = ''
5-
param appServicePlanId string
65
param appSettings object = {}
7-
param runtimeName string
8-
param runtimeVersion string
96
param serviceName string = 'api'
107
param storageAccountName string
118
param deploymentStorageContainerName string
@@ -15,34 +12,96 @@ param maximumInstanceCount int = 100
1512
param identityId string = ''
1613
param identityClientId string = ''
1714
param aiServicesId string
15+
param resourceToken string
16+
17+
param runtimeName string = 'python'
18+
param runtimeVersion string = '3.11'
19+
20+
@allowed(['SystemAssigned', 'UserAssigned'])
21+
param identityType string = 'UserAssigned'
22+
23+
import * as regionSelector from './util/region-selector.bicep'
24+
var abbrs = loadJsonContent('../abbreviations.json')
1825

1926
var applicationInsightsIdentity = 'ClientId=${identityClientId};Authorization=AAD'
2027

21-
module api '../core/host/functions-flexconsumption.bicep' = {
28+
// The application backend is a function app
29+
module appServicePlan 'br/public:avm/res/web/serverfarm:0.1.1' = {
30+
name: 'appserviceplan'
31+
params: {
32+
name: '${abbrs.webServerFarms}${resourceToken}'
33+
location: regionSelector.getFlexConsumptionRegion(location)
34+
tags: tags
35+
sku: {
36+
name: 'FC1'
37+
tier: 'FlexConsumption'
38+
}
39+
reserved: true
40+
}
41+
}
42+
43+
resource stg 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
44+
name: storageAccountName
45+
}
46+
47+
resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = if (!empty(applicationInsightsName)) {
48+
name: applicationInsightsName
49+
}
50+
51+
module api 'br/public:avm/res/web/site:0.15.1' = {
2252
name: '${serviceName}-functions-module'
2353
params: {
2454
name: name
2555
location: location
56+
kind: 'functionapp,linux'
2657
tags: union(tags, { 'azd-service-name': serviceName })
27-
identityType: 'UserAssigned'
28-
identityId: identityId
29-
appSettings: union(appSettings,
58+
managedIdentities: {
59+
systemAssigned: identityType == 'SystemAssigned'
60+
userAssignedResourceIds: [
61+
'${identityId}'
62+
]
63+
}
64+
serverFarmResourceId: appServicePlan.outputs.resourceId
65+
functionAppConfig: {
66+
location: location
67+
deployment: {
68+
storage: {
69+
type: 'blobContainer'
70+
value: '${stg.properties.primaryEndpoints.blob}${deploymentStorageContainerName}'
71+
authentication: {
72+
type: identityType == 'SystemAssigned' ? 'SystemAssignedIdentity' : 'UserAssignedIdentity'
73+
userAssignedIdentityResourceId: identityType == 'UserAssigned' ? identityId : ''
74+
}
75+
}
76+
}
77+
scaleAndConcurrency: {
78+
instanceMemoryMB: instanceMemoryMB
79+
maximumInstanceCount: maximumInstanceCount
80+
}
81+
runtime: {
82+
name: runtimeName
83+
version: runtimeVersion
84+
}
85+
}
86+
appSettingsKeyValuePairs: union(appSettings,
3087
{
88+
AzureWebJobsStorage__blobServiceUri: stg.properties.primaryEndpoints.blob
89+
AzureWebJobsStorage__queueServiceUri: stg.properties.primaryEndpoints.queue
90+
AzureWebJobsStorage__tableServiceUri: stg.properties.primaryEndpoints.table
91+
AzureWebJobsStorage__credential: 'managedidentity'
3192
AzureWebJobsStorage__clientId : identityClientId
93+
APPLICATIONINSIGHTS_CONNECTION_STRING: applicationInsights.properties.ConnectionString
3294
APPLICATIONINSIGHTS_AUTHENTICATION_STRING: applicationInsightsIdentity
95+
AzureWebJobsFeatureFlags: 'EnableWorkerIndexing'
3396
AZURE_OPENAI_KEY: listKeys(aiServicesId, '2025-04-01-preview').key1
97+
PYTHON_ENABLE_WORKER_EXTENSIONS: '1'
3498
})
35-
applicationInsightsName: applicationInsightsName
36-
appServicePlanId: appServicePlanId
37-
runtimeName: runtimeName
38-
runtimeVersion: runtimeVersion
39-
storageAccountName: storageAccountName
40-
deploymentStorageContainerName: deploymentStorageContainerName
41-
virtualNetworkSubnetId: virtualNetworkSubnetId
42-
instanceMemoryMB: instanceMemoryMB
43-
maximumInstanceCount: maximumInstanceCount
99+
virtualNetworkSubnetId: !empty(virtualNetworkSubnetId) ? virtualNetworkSubnetId : null
100+
siteConfig: {
101+
alwaysOn: false
102+
}
44103
}
45104
}
46105

47106
output SERVICE_API_NAME string = api.outputs.name
48-
output SERVICE_API_IDENTITY_PRINCIPAL_ID string = api.outputs.identityPrincipalId
107+
output SERVICE_API_IDENTITY_PRINCIPAL_ID string = identityType == 'SystemAssigned' ? api.outputs.?systemAssignedMIPrincipalId ?? '' : ''
Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ param tags object
88
param accountName string
99

1010
@description('Database name')
11-
param databaseName string = 'snippy'
11+
param databaseName string
1212

1313
@description('Container name for snippets')
14-
param containerName string = 'snippets'
14+
param containerName string
1515

16-
@description('AI Services name')
17-
param aiServicesName string
16+
param dataContributorIdentityIds string[] = []
1817

1918
resource account 'Microsoft.DocumentDB/databaseAccounts@2023-11-15' = {
2019
name: accountName
@@ -48,7 +47,7 @@ resource database 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2023-11-15
4847
}
4948
}
5049

51-
resource container 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2023-11-15' = {
50+
resource container 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-11-15' = {
5251
parent: database
5352
name: containerName
5453
properties: {
@@ -73,13 +72,40 @@ resource container 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/container
7372
path: '/"_etag"/?'
7473
}
7574
]
75+
vectorIndexes: [
76+
{
77+
path: '/embedding'
78+
type: 'diskANN'
79+
}
80+
]
81+
}
82+
vectorEmbeddingPolicy: {
83+
vectorEmbeddings: [
84+
{
85+
path: '/embedding'
86+
distanceFunction: 'cosine'
87+
dataType: 'float32'
88+
dimensions: 1536
89+
}
90+
]
7691
}
7792
}
7893
}
7994
}
8095

96+
var CosmosDbDataContributor = '00000000-0000-0000-0000-000000000002'
97+
98+
resource assignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = [for identityId in dataContributorIdentityIds: {
99+
name: guid(CosmosDbDataContributor, identityId, account.id)
100+
parent: account
101+
properties: {
102+
principalId: identityId
103+
roleDefinitionId: '${subscription().id}/resourceGroups/${resourceGroup().name}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/sqlRoleDefinitions/${CosmosDbDataContributor}'
104+
scope: account.id
105+
}
106+
}]
107+
81108
output accountName string = account.name
82109
output databaseName string = database.name
83110
output containerName string = container.name
84111
output documentEndpoint string = account.properties.documentEndpoint
85-
output connectionString string = 'AccountEndpoint=${account.properties.documentEndpoint};AccountKey=${listKeys(account.id, account.apiVersion).primaryMasterKey}'

infra/app/key-vault.bicep

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ param location string = resourceGroup().location
44
param tags object = {}
55
param disableLocalAuth bool = false
66

7-
module logAnalytics 'loganalytics.bicep' = {
7+
module logAnalytics 'br/public:avm/res/operational-insights/workspace:0.7.0' = {
88
name: 'loganalytics'
99
params: {
1010
name: logAnalyticsName
@@ -13,19 +13,19 @@ module logAnalytics 'loganalytics.bicep' = {
1313
}
1414
}
1515

16-
module applicationInsights 'applicationinsights.bicep' = {
16+
module applicationInsights 'br/public:avm/res/insights/component:0.4.1' = {
1717
name: 'applicationinsights'
1818
params: {
1919
name: applicationInsightsName
2020
location: location
2121
tags: tags
22-
logAnalyticsWorkspaceId: logAnalytics.outputs.id
22+
workspaceResourceId: logAnalytics.outputs.resourceId
2323
disableLocalAuth: disableLocalAuth
2424
}
2525
}
2626

2727
output applicationInsightsConnectionString string = applicationInsights.outputs.connectionString
2828
output applicationInsightsInstrumentationKey string = applicationInsights.outputs.instrumentationKey
2929
output applicationInsightsName string = applicationInsights.outputs.name
30-
output logAnalyticsWorkspaceId string = logAnalytics.outputs.id
30+
output logAnalyticsWorkspaceId string = logAnalytics.outputs.resourceId
3131
output logAnalyticsWorkspaceName string = logAnalytics.outputs.name
File renamed without changes.

0 commit comments

Comments
 (0)