@@ -68,25 +68,87 @@ module "azure_sql_server" {
6868 tags = var. tags
6969}
7070
71- module "managed_identity_sql_db_management" {
72- for_each = var. sqlserver != {} ? var. regions : {}
71+ # Create User Assigned Managed Identities for Azure SQL access by other resources
72+
73+ locals {
74+ managed_identities = flatten ([
75+ for region , _ in var . regions : [
76+ for mi_name in var . sqlserver . user_assigned_identities : {
77+ region = region
78+ mi_name = mi_name
79+ }
80+ ]
81+ ])
82+
83+ managed_identities_map = {
84+ for object in local . managed_identities : " ${ object . mi_name } -${ object . region } " => object
85+ }
86+ }
87+
88+ module "user_assigned_managed_identity_sql" {
89+ for_each = local. managed_identities_map
7390
7491 source = " ../../../dtos-devops-templates/infrastructure/modules/managed-identity"
7592
76- uai_name = " ${ var . sqlserver . db_management_mi_name_prefix } - ${ lower (var . environment ) } -${ lower (each. key )} "
77- resource_group_name = azurerm_resource_group. core [each . key ]. name
78- location = each. key
93+ uai_name = " ${ module . regions_config [ each . value . region ] . names . managed-identity } -${ lower (each. value . mi_name )} "
94+ resource_group_name = azurerm_resource_group. core [each . value . region ]. name
95+ location = each. value . region
7996
8097 tags = var. tags
8198}
8299
100+ # Assign RBAC roles to the User Assigned Managed Identities for Azure SQL access by other resources
101+ # DB-MANAGEMENT needs Contributor on the SQL Server to be able to run migrations
83102module "sql_db_management_rbac_assignment" {
84- for_each = var. sqlserver != {} ? var. regions : {}
103+ for_each = contains (var . sqlserver . user_assigned_identities , " db-management " ) && var. sqlserver != {} ? var. regions : {}
85104
86105 source = " ../../../dtos-devops-templates/infrastructure/modules/rbac-assignment"
87106
88- principal_id = module. managed_identity_sql_db_management [ each . key ]. principal_id
107+ principal_id = module. user_assigned_managed_identity_sql [ " db-management- ${ each . key } " ]. principal_id
89108 role_definition_name = " Contributor"
90109 scope = module. azure_sql_server [each . key ]. sql_server_id
91110
92111}
112+
113+ # DB-BACKUP needs SQL DB Contributor on the SQL Server to be able to read the database, and Storage Blob Data Contributor on the Storage Account to write the backups
114+ module "sql_db_backup_rbac_assignment_sql_contributor" {
115+ for_each = contains (var. sqlserver . user_assigned_identities , " db-backup" ) && var. sqlserver != {} ? var. regions : {}
116+
117+ source = " ../../../dtos-devops-templates/infrastructure/modules/rbac-assignment"
118+
119+ principal_id = module. user_assigned_managed_identity_sql [" db-backup-${ each . key } " ]. principal_id
120+ role_definition_name = " SQL DB Contributor"
121+ scope = module. azure_sql_server [each . key ]. sql_server_id
122+ }
123+
124+ module "sql_db_backup_rbac_assignment_storage_contributor" {
125+ for_each = contains (var. sqlserver . user_assigned_identities , " db-backup" ) && var. sqlserver != {} ? var. regions : {}
126+
127+ source = " ../../../dtos-devops-templates/infrastructure/modules/rbac-assignment"
128+
129+ principal_id = module. user_assigned_managed_identity_sql [" db-backup-${ each . key } " ]. principal_id
130+ role_definition_name = " Storage Blob Data Contributor"
131+ scope = data. terraform_remote_state . audit . outputs . storage_account_audit [" sqlbackups-${ local . primary_region } " ]. id
132+ }
133+
134+
135+ # DB-RESTORE needs SQL DB Contributor on the SQL Server to be able to write to the database, and Storage Blob Data Reader on the Storage Account to read the backups
136+ module "sql_db_restore_rbac_assignment_sql_contributor" {
137+ for_each = contains (var. sqlserver . user_assigned_identities , " db-restore" ) && var. sqlserver != {} ? var. regions : {}
138+
139+ source = " ../../../dtos-devops-templates/infrastructure/modules/rbac-assignment"
140+
141+ principal_id = module. user_assigned_managed_identity_sql [" db-restore-${ each . key } " ]. principal_id
142+ role_definition_name = " SQL DB Contributor"
143+ scope = module. azure_sql_server [each . key ]. sql_server_id
144+ }
145+
146+ module "sql_db_restore_rbac_assignment_storage_reader" {
147+ for_each = contains (var. sqlserver . user_assigned_identities , " db-restore" ) && var. sqlserver != {} ? var. regions : {}
148+
149+ source = " ../../../dtos-devops-templates/infrastructure/modules/rbac-assignment"
150+
151+ principal_id = module. user_assigned_managed_identity_sql [" db-restore-${ each . key } " ]. principal_id
152+ role_definition_name = " Storage Blob Data Reader"
153+ scope = data. terraform_remote_state . audit . outputs . storage_account_audit [" sqlbackups-${ local . primary_region } " ]. id
154+ }
0 commit comments