如何修改Terraform部署的Azure资源组及Log Analytics Workspace名称
问题描述
我已经在Azure不同区域成功部署了2个Log Analytics Workspace(LAW),每个LAW都位于对应区域的专属资源组中。现在需要修改两组资源组(p-ause-lp-management-rg & p-auea-lp-management-rg)以及对应的LAW(p-ause-lp-management-log & p-auea-lp-management-log)的名称,当前资源结构如下:
p-ause-lp-management-rg >p-ause-lp-management-log p-auea-lp-management-rg >p-auea-lp-management-log
当前使用的Terraform代码如下:
main.tf
resource "azurerm_resource_group" "workspaces" { for_each = var.workspaces name = each.key location = each.value.location } resource "azurerm_log_analytics_workspace" "workspaces" { for_each = var.workspaces name = each.key location = each.value.location resource_group_name = azurerm_resource_group.workspaces[each.key].name sku = "PerGB2018" retention_in_days = each.value.retention_in_days }
variables.tf
variable "workspaces" { type = map(object({ location = string retention_in_days = number })) default = { workspace1 = { location = "australiasoutheast" retention_in_days = 30 } workspace2 = { location = "australiaeast" retention_in_days = 30 } # Add more workspaces as needed } }
outputs.tf
# Define outputs output "workspace_ids" { value = values(azurerm_log_analytics_workspace.workspaces)[*].id } output "workspace_names" { value = values(azurerm_log_analytics_workspace.workspaces)[*].name } output "resource_group_ids" { value = values(azurerm_resource_group.workspaces)[*].id } output "resource_group_names" { value = values(azurerm_resource_group.workspaces)[*].name } output "resource_group_locations" { value = values(azurerm_resource_group.workspaces)[*].location }
修改方案
当前代码直接用变量map的key(workspace1/workspace2)作为资源组和LAW的名称,需要调整命名逻辑来生成目标格式,推荐两种实现方式:
方式一:直接指定目标名称(直观易维护)
修改variables.tf,将map的key替换为目标资源组名称,同时新增LAW名称字段:
variable "workspaces" { type = map(object({ location = string retention_in_days = number law_name = string })) default = { "p-ause-lp-management-rg" = { location = "australiasoutheast" retention_in_days = 30 law_name = "p-ause-lp-management-log" } "p-auea-lp-management-rg" = { location = "australiaeast" retention_in_days = 30 law_name = "p-auea-lp-management-log" } } }
同步修改main.tf,资源组名称复用map的key,LAW名称调用新增的law_name字段:
resource "azurerm_resource_group" "workspaces" { for_each = var.workspaces name = each.key location = each.value.location } resource "azurerm_log_analytics_workspace" "workspaces" { for_each = var.workspaces name = each.value.law_name location = each.value.location resource_group_name = azurerm_resource_group.workspaces[each.key].name sku = "PerGB2018" retention_in_days = each.value.retention_in_days }
方式二:通过规则自动生成(适合批量扩展)
如果后续需要新增更多区域的资源,可以通过区域缩写自动拼接命名,减少手动输入:
- 调整
variables.tf,用区域缩写作为map的key:
variable "workspaces" { type = map(object({ location = string retention_in_days = number })) default = { "ause" = { location = "australiasoutheast" retention_in_days = 30 } "auea" = { location = "australiaeast" retention_in_days = 30 } } }
- 修改
main.tf,通过字符串拼接生成资源组和LAW名称:
resource "azurerm_resource_group" "workspaces" { for_each = var.workspaces name = "p-${each.key}-lp-management-rg" location = each.value.location } resource "azurerm_log_analytics_workspace" "workspaces" { for_each = var.workspaces name = "p-${each.key}-lp-management-log" location = each.value.location resource_group_name = azurerm_resource_group.workspaces[each.key].name sku = "PerGB2018" retention_in_days = each.value.retention_in_days }
执行步骤
- 运行
terraform plan查看变更计划,确认资源组和LAW的名称是否符合预期 - 确认无误后运行
terraform apply执行变更
注意:Terraform中修改资源名称等同于销毁旧资源并创建新资源,请提前备份旧LAW中的数据,或确认数据不再需要后再执行操作。
内容的提问来源于stack exchange,提问作者Cyborganizer
相关产品推荐
相关产品推荐

