@@ -388,6 +388,19 @@ module userAssignedIdentity 'br/public:avm/res/managed-identity/user-assigned-id
388388 }
389389}
390390
391+ // ========== SQL Operations User Assigned Identity ========== //
392+ // Dedicated identity for backend SQL operations with limited permissions (db_datareader, db_datawriter)
393+ var sqlUserAssignedIdentityResourceName = 'id-sql-${solutionSuffix }'
394+ module sqlUserAssignedIdentity 'br/public:avm/res/managed-identity/user-assigned-identity:0.4.1' = {
395+ name : take ('avm.res.managed-identity.user-assigned-identity.${sqlUserAssignedIdentityResourceName }' , 64 )
396+ params : {
397+ name : sqlUserAssignedIdentityResourceName
398+ location : solutionLocation
399+ tags : tags
400+ enableTelemetry : enableTelemetry
401+ }
402+ }
403+
391404// ========== Network Module ========== //
392405module network 'modules/network.bicep' = if (enablePrivateNetworking ) {
393406 name : take ('network-${solutionSuffix }-deployment' , 64 )
@@ -509,6 +522,11 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = {
509522 principalType : 'ServicePrincipal'
510523 roleDefinitionIdOrName : 'Key Vault Administrator'
511524 }
525+ {
526+ principalId : sqlUserAssignedIdentity .outputs .principalId
527+ principalType : 'ServicePrincipal'
528+ roleDefinitionIdOrName : 'Key Vault Secrets User'
529+ }
512530 ]
513531 secrets : [
514532 {
@@ -539,6 +557,10 @@ module keyvault 'br/public:avm/res/key-vault/vault:0.12.1' = {
539557 name : 'AZURE-SEARCH-ENDPOINT'
540558 value : 'https://${aiSearchName }.search.windows.net'
541559 }
560+ {
561+ name : 'SQLDB-USER-MID'
562+ value : sqlUserAssignedIdentity .outputs .clientId
563+ }
542564 ]
543565 enableTelemetry : enableTelemetry
544566 }
@@ -918,6 +940,7 @@ module sqlDBModule 'br/public:avm/res/sql/server:0.20.1' = {
918940 systemAssigned : true
919941 userAssignedResourceIds : [
920942 userAssignedIdentity .outputs .resourceId
943+ sqlUserAssignedIdentity .outputs .resourceId
921944 ]
922945 }
923946 primaryUserAssignedIdentityResourceId : userAssignedIdentity .outputs .resourceId
@@ -988,7 +1011,7 @@ module webSite 'modules/web-sites.bicep' = {
9881011 name : webSiteResourceName
9891012 tags : tags
9901013 location : solutionLocation
991- managedIdentities : { userAssignedResourceIds : [userAssignedIdentity !.outputs .resourceId ] }
1014+ managedIdentities : { userAssignedResourceIds : [userAssignedIdentity !.outputs .resourceId , sqlUserAssignedIdentity !. outputs . resourceId ] }
9921015 kind : 'app,linux,container'
9931016 serverFarmResourceId : webServerFarm .?outputs .resourceId
9941017 siteConfig : {
@@ -1035,7 +1058,7 @@ module webSite 'modules/web-sites.bicep' = {
10351058 AZURE_COSMOSDB_CONVERSATIONS_CONTAINER : collectionName
10361059 AZURE_COSMOSDB_DATABASE : cosmosDbDatabaseName
10371060 AZURE_COSMOSDB_ENABLE_FEEDBACK : azureCosmosDbEnableFeedback
1038- SQLDB_USER_MID : userAssignedIdentity .outputs .clientId
1061+ SQLDB_USER_MID : sqlUserAssignedIdentity .outputs .clientId
10391062 AZURE_AI_SEARCH_ENDPOINT : 'https://${aiSearchName }.search.windows.net'
10401063 AZURE_SQL_SYSTEM_PROMPT : functionAppSqlPrompt
10411064 AZURE_CALL_TRANSCRIPT_SYSTEM_PROMPT : functionAppCallTranscriptSystemPrompt
@@ -1226,6 +1249,12 @@ output MANAGEDIDENTITY_WEBAPP_NAME string = userAssignedIdentity.outputs.name
12261249
12271250@description ('Client ID of the managed identity used by the web app.' )
12281251output MANAGEDIDENTITY_WEBAPP_CLIENTID string = userAssignedIdentity .outputs .clientId
1252+
1253+ @description ('Name of the managed identity used for SQL database operations.' )
1254+ output MANAGEDIDENTITY_SQL_NAME string = sqlUserAssignedIdentity .outputs .name
1255+
1256+ @description ('Client ID of the managed identity used for SQL database operations.' )
1257+ output MANAGEDIDENTITY_SQL_CLIENTID string = sqlUserAssignedIdentity .outputs .clientId
12291258@description ('Name of the AI Search service.' )
12301259output AI_SEARCH_SERVICE_NAME string = aiSearchName
12311260
@@ -1367,3 +1396,6 @@ output USE_AI_PROJECT_CLIENT string = useAIProjectClientFlag
13671396
13681397@description ('Indicates whether the internal stream should be used.' )
13691398output USE_INTERNAL_STREAM string = useInternalStream
1399+
1400+ @description ('The client ID of the managed identity.' )
1401+ output AZURE_CLIENT_ID string = userAssignedIdentity .outputs .clientId
0 commit comments