@@ -13,16 +13,54 @@ resource "azurerm_resource_group" "rg" {
1313 }
1414}
1515
16- # Reference existing Key Vault
17- data "azurerm_key_vault" "vmss" {
18- name = var. keyvault_name
19- resource_group_name = data. azurerm_resource_group . rg . name
16+ # Create Key Vault for storing GitHub runner token
17+ resource "azurerm_key_vault" "vmss" {
18+ name = var. keyvault_name
19+ resource_group_name = azurerm_resource_group. rg . name
20+ location = azurerm_resource_group. rg . location
21+ tenant_id = data. azurerm_client_config . current . tenant_id
22+ sku_name = " standard"
23+ soft_delete_retention_days = 7
24+ purge_protection_enabled = false
25+
26+ # Enable RBAC authorization
27+ enable_rbac_authorization = true
28+
29+ # Network ACLs - allow Azure services
30+ network_acls {
31+ bypass = " AzureServices"
32+ default_action = " Allow"
33+ }
34+
35+ tags = {
36+ Environment = " CI"
37+ ManagedBy = " Terraform"
38+ }
2039}
2140
22- # Reference existing custom image
41+ # Resource group for custom images
42+ # This must exist and contain the golden image with GitHub Actions runner pre-installed
43+ resource "azurerm_resource_group" "images" {
44+ name = var. image_resource_group
45+ location = var. location
46+
47+ tags = {
48+ Environment = " CI"
49+ ManagedBy = " Terraform"
50+ Purpose = " Custom-Images"
51+ }
52+ }
53+
54+ # Reference custom golden image
55+ # PREREQUISITE: The golden image must be created separately and contain:
56+ # - Windows Server with SQL Server pre-installed
57+ # - GitHub Actions runner binaries at C:\actions-runner
58+ # - All required dependencies (PowerShell modules, etc.)
2359data "azurerm_image" "golden" {
2460 name = var. image_name
25- resource_group_name = var. image_resource_group
61+ resource_group_name = azurerm_resource_group. images . name
62+
63+ depends_on = [azurerm_resource_group . images ]
2664}
2765
2866# Create virtual network for VMSS
@@ -116,10 +154,41 @@ resource "azurerm_virtual_machine_scale_set_extension" "vmss" {
116154
117155# Grant VMSS managed identity access to Key Vault secrets
118156resource "azurerm_role_assignment" "vmss_kv_secrets_user" {
119- scope = data . azurerm_key_vault . vmss . id
157+ scope = azurerm_key_vault. vmss . id
120158 role_definition_name = " Key Vault Secrets User"
121159 principal_id = azurerm_windows_virtual_machine_scale_set. vmss . identity [0 ]. principal_id
122160
123- # Wait for VMSS to be created
124- depends_on = [azurerm_windows_virtual_machine_scale_set . vmss ]
161+ depends_on = [
162+ azurerm_windows_virtual_machine_scale_set . vmss ,
163+ azurerm_key_vault . vmss
164+ ]
165+ }
166+
167+ # Grant Terraform service principal access to manage Key Vault secrets
168+ resource "azurerm_role_assignment" "terraform_kv_secrets_officer" {
169+ scope = azurerm_key_vault. vmss . id
170+ role_definition_name = " Key Vault Secrets Officer"
171+ principal_id = data. azurerm_client_config . current . object_id
172+
173+ depends_on = [azurerm_key_vault . vmss ]
174+ }
175+
176+ # Wait for role assignment to propagate
177+ resource "time_sleep" "wait_for_rbac" {
178+ create_duration = " 60s"
179+
180+ depends_on = [azurerm_role_assignment . terraform_kv_secrets_officer ]
181+ }
182+
183+ # Store GitHub runner token in Key Vault
184+ resource "azurerm_key_vault_secret" "github_runner_token" {
185+ name = " GITHUB-RUNNER-TOKEN"
186+ value = var. github_token
187+ key_vault_id = azurerm_key_vault. vmss . id
188+
189+ depends_on = [
190+ azurerm_key_vault . vmss ,
191+ azurerm_role_assignment . terraform_kv_secrets_officer ,
192+ time_sleep . wait_for_rbac
193+ ]
125194}
0 commit comments