@@ -40,9 +40,15 @@ param apiWebAppName string = 'app-projectestimate-api-${env}'
4040@description ('Optional. The name of the Storage Account to create.' )
4141param storageAccountName string = 'stoprojectestimate${env }'
4242
43+ @description ('Optional. The name of the Key Vault to create.' )
44+ param keyVaultName string = 'kv-projectestimate-${env }'
45+
4346@description ('Optional. Indicates number fo days to retain deleted items (containers, blobs, snapshosts, versions). Default value is 7' )
4447param daysSoftDelete int = 7
4548
49+ @description ('Optional. Enable Key Vault purge protection. Default is false.' )
50+ param enableKeyVaultPurgeProtection bool = false
51+
4652resource logAnalytics 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
4753 name : logAnalyticsName
4854 location : location
@@ -78,6 +84,28 @@ resource appInsights 'Microsoft.Insights/components@2020-02-02' = {
7884 }
7985}
8086
87+ resource keyVault 'Microsoft.KeyVault/vaults@2024-11-01' = {
88+ name : keyVaultName
89+ location : location
90+ tags : tags
91+ properties : {
92+ sku : {
93+ family : 'A'
94+ name : 'standard'
95+ }
96+ tenantId : subscription ().tenantId
97+ enableRbacAuthorization : true
98+ enableSoftDelete : true
99+ enablePurgeProtection : enableKeyVaultPurgeProtection ? true : null
100+ softDeleteRetentionInDays : 10
101+ publicNetworkAccess : 'Enabled'
102+ networkAcls : {
103+ defaultAction : 'Allow'
104+ bypass : 'AzureServices'
105+ }
106+ }
107+ }
108+
81109module storageAccount 'storageAccount.bicep' = {
82110 name : storageAccountName
83111 params : {
@@ -116,6 +144,54 @@ resource documentIntelligence 'Microsoft.CognitiveServices/accounts@2024-10-01'
116144 }
117145}
118146
147+ resource applicationInsightsConnectionStringSecret 'Microsoft.KeyVault/vaults/secrets@2024-11-01' = {
148+ parent : keyVault
149+ name : 'ApplicationInsights--ConnectionString'
150+ properties : {
151+ value : appInsights .properties .ConnectionString
152+ }
153+ }
154+
155+ resource storageConnectionStringSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
156+ parent : keyVault
157+ name : 'StorageAccount--ConnectionString'
158+ properties : {
159+ value : storageAccount .outputs .connectionString
160+ }
161+ }
162+
163+ resource openAiEndpointSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
164+ parent : keyVault
165+ name : 'Azure--OpenAI--Endpoint'
166+ properties : {
167+ value : openAIService .outputs .endpoint
168+ }
169+ }
170+
171+ resource openAiApiKeySecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
172+ parent : keyVault
173+ name : 'Azure--OpenAI--ApiKey'
174+ properties : {
175+ value : openAIService .outputs .apiKey
176+ }
177+ }
178+
179+ resource documentIntelligenceEndpointSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
180+ parent : keyVault
181+ name : 'Azure--DocumentIntelligence--Endpoint'
182+ properties : {
183+ value : documentIntelligence .properties .endpoint
184+ }
185+ }
186+
187+ resource documentIntelligenceApiKeySecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
188+ parent : keyVault
189+ name : 'Azure--DocumentIntelligence--ApiKey'
190+ properties : {
191+ value : documentIntelligence .listKeys ().key1
192+ }
193+ }
194+
119195resource appServicePlan 'Microsoft.Web/serverfarms@2024-04-01' = {
120196 name : appServicePlanName
121197 location : location
@@ -154,25 +230,72 @@ module apiWebApp 'webApp.bicep' = {
154230 clientAffinityEnabled : false
155231 httpsOnly : true
156232 kind : 'app,linux'
233+ useManagedIdentity : true
234+ }
235+ }
236+
237+ resource keyVaultRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
238+ scope : keyVault
239+ name : guid (keyVault .id , apiWebAppName , 'Key Vault Secrets User' )
240+ properties : {
241+ roleDefinitionId : subscriptionResourceId (
242+ 'Microsoft.Authorization/roleDefinitions' ,
243+ '4633458b-17de-408a-b874-0445c86b69e6'
244+ ) // Key Vault Secrets User
245+ principalId : apiWebApp .outputs .principalId
246+ principalType : 'ServicePrincipal'
247+ }
248+ }
249+
250+ resource uiWebAppConfig 'Microsoft.Web/sites/config@2024-04-01' = {
251+ name : '${uiWebApp .name }/web'
252+ properties : {
253+ linuxFxVersion : 'NODE|22-lts'
157254 }
158255}
159256
160257resource apiWebAppConfig 'Microsoft.Web/sites/config@2024-04-01' = {
161258 name : '${apiWebAppName }/web'
162- dependsOn : [apiWebApp ]
259+ dependsOn : [apiWebApp , keyVaultRoleAssignment ]
163260 properties : {
164261 linuxFxVersion : 'DOTNETCORE|9.0'
165262 cors : {
166263 allowedOrigins : [uiWebApp .outputs .endpoint ]
167264 supportCredentials : true
168265 }
169266 appSettings : [
170- { name : 'APPLICATIONINSIGHTS_CONNECTION_STRING' , value : appInsights .properties .ConnectionString }
171- { name : 'Azure__StorageAccount__ConnectionString' , value : storageAccount .outputs .connectionString }
172- { name : 'Azure__OpenAI__Endpoint' , value : openAIService .outputs .endpoint }
173- { name : 'Azure__OpenAI__ApiKey' , value : openAIService .outputs .apiKey }
174- { name : 'Azure__DocumentIntelligence__Endpoint' , value : documentIntelligence .properties .endpoint }
175- { name : 'Azure__DocumentIntelligence__ApiKey' , value : documentIntelligence .listKeys ().key1 }
267+ {
268+ name : 'APPLICATIONINSIGHTS_CONNECTION_STRING'
269+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=ApplicationInsights--ConnectionString)'
270+ }
271+ {
272+ name : 'Azure__StorageAccount__ConnectionString'
273+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=StorageAccount--ConnectionString)'
274+ }
275+ {
276+ name : 'Azure__OpenAI__Endpoint'
277+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Azure--OpenAI--Endpoint)'
278+ }
279+ {
280+ name : 'Azure__OpenAI__ApiKey'
281+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Azure--OpenAI--ApiKey)'
282+ }
283+ {
284+ name : 'Azure__DocumentIntelligence__Endpoint'
285+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Azure--DocumentIntelligence--Endpoint)'
286+ }
287+ {
288+ name : 'Azure__DocumentIntelligence__ApiKey'
289+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Azure--DocumentIntelligence--ApiKey)'
290+ }
291+ {
292+ name : 'Security__Authentication__Authority'
293+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Security--Authentication--Authority)'
294+ }
295+ {
296+ name : 'Security__Authentication__Audience'
297+ value : '@Microsoft.KeyVault(VaultName=${keyVaultName };SecretName=Security--Authentication--Audience)'
298+ }
176299 ]
177300 }
178301}
0 commit comments