You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用Terraform+Azure DevOps实现数据库DTU每日自动按需扩缩容?

Azure数据库DTU定时扩缩容方案(Terraform + Azure DevOps)

这个需求完全可行,结合Terraform、Azure Automation和Azure DevOps流水线,能批量实现跨订阅/环境的数据库DTU定时扩缩容,具体实现步骤如下:

一、核心方案概述

用Terraform定义Azure自动化资源(自动化账户、Runbook、定时计划),通过Runbook调用Azure API修改数据库DTU层级,再借助Azure DevOps流水线将这套自动化配置部署到各个目标订阅/环境,实现每日自动按时段调整DTU。

二、具体实现步骤

1. 编写Terraform配置,部署自动化组件

  • 创建Azure自动化账户:托管Runbook和执行计划,推荐启用系统分配的托管身份(替代服务主体,简化权限管理)
  • 编写扩缩容Runbook:用PowerShell编写逻辑,判断当前时段并修改数据库DTU。示例代码:
    # 用托管身份登录Azure
    Connect-AzAccount -Identity
    
    # 从自动化变量读取配置(避免硬编码)
    $resourceGroup = Get-AzAutomationVariable -ResourceGroupName "auto-account-rg" -AutomationAccountName "sql-scale-account" -Name "RGName" | Select-Object -ExpandProperty Value
    $serverName = Get-AzAutomationVariable -AutomationAccountName "sql-scale-account" -Name "SQLServerName" | Select-Object -ExpandProperty Value
    $dbName = Get-AzAutomationVariable -AutomationAccountName "sql-scale-account" -Name "DBName" | Select-Object -ExpandProperty Value
    $workTier = Get-AzAutomationVariable -AutomationAccountName "sql-scale-account" -Name "WorkHoursTier" | Select-Object -ExpandProperty Value
    $offTier = Get-AzAutomationVariable -AutomationAccountName "sql-scale-account" -Name "OffHoursTier" | Select-Object -ExpandProperty Value
    
    # 判断时段,设置目标DTU层级
    $currentHour = (Get-Date).Hour
    $targetTier = if ($currentHour -ge 9 -and $currentHour -lt 18) { $workTier } else { $offTier }
    
    # 执行DTU修改
    Set-AzSqlDatabase -ResourceGroupName $resourceGroup -ServerName $serverName -DatabaseName $dbName -Edition "Standard" -RequestedServiceObjectiveName $targetTier
    
    (注:数据库配置存储为自动化变量,方便Terraform批量适配不同环境)
  • 创建定时计划:分别创建两个计划,对应工作时段启动(如9:00)和非工作时段启动(如18:00),绑定到Runbook
  • 配置权限:给自动化账户的托管身份分配SQL DB Contributor角色到目标数据库所在的资源组,确保具备修改权限

2. 配置Azure DevOps流水线,实现多环境部署

  • 创建环境变量组:针对开发、测试、生产等环境,配置对应的资源组名、SQL服务器名、数据库名、DTU层级参数(如WorkHoursTier=S3、OffHoursTier=S0)
  • 搭建Terraform流水线:
    1. 代码检查:用terraform fmt和terraform validate确保代码规范
    2. 初始化Terraform:使用Azure存储账户作为远程后端,保持状态一致性:
      terraform init -backend-config="storage_account_name=tfstateaccount" -backend-config="container_name=tfstate" -backend-config="key=sql-scale.tfstate"
      
    3. 生成执行计划:加载对应环境的变量配置:
      terraform plan -var "rg_name=$(RG_NAME)" -var "sql_server_name=$(SQL_SERVER_NAME)" -var "db_name=$(DB_NAME)" -var "work_tier=$(WORK_TIER)" -var "off_tier=$(OFF_TIER)" -out=tfplan
      
    4. 应用配置:将自动化资源部署到目标环境:
      terraform apply -auto-approve tfplan
      
  • 多阶段流水线配置:为每个订阅/环境创建独立阶段,通过Azure DevOps服务连接切换目标订阅,实现批量部署

3. 验证与监控

  • 手动触发Runbook,检查数据库DTU是否正常变更
  • 查看Azure Automation的作业历史,排查执行异常
  • 配置Azure Monitor告警:当Runbook执行失败时,触发邮件或Teams通知

三、关键注意事项

  • 最小权限原则:限制托管身份的权限范围,仅赋予目标资源组的SQL DB Contributor权限,避免过度授权
  • 业务影响评估:DTU变更会导致短暂的数据库连接中断,需确保在非工作时段执行,并提前同步给业务团队
  • 多数据库批量处理:可在Runbook中循环处理多个数据库,或通过Terraform参数化创建多个Runbook/计划,实现批量管理

内容的提问来源于stack exchange,提问作者Gowtham Varma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:05:20