求助:如何用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。示例代码:
(注:数据库配置存储为自动化变量,方便Terraform批量适配不同环境)# 用托管身份登录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 - 创建定时计划:分别创建两个计划,对应工作时段启动(如9:00)和非工作时段启动(如18:00),绑定到Runbook
- 配置权限:给自动化账户的托管身份分配
SQL DB Contributor角色到目标数据库所在的资源组,确保具备修改权限
2. 配置Azure DevOps流水线,实现多环境部署
- 创建环境变量组:针对开发、测试、生产等环境,配置对应的资源组名、SQL服务器名、数据库名、DTU层级参数(如
WorkHoursTier=S3、OffHoursTier=S0) - 搭建Terraform流水线:
- 代码检查:用
terraform fmt和terraform validate确保代码规范 - 初始化Terraform:使用Azure存储账户作为远程后端,保持状态一致性:
terraform init -backend-config="storage_account_name=tfstateaccount" -backend-config="container_name=tfstate" -backend-config="key=sql-scale.tfstate" - 生成执行计划:加载对应环境的变量配置:
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 - 应用配置:将自动化资源部署到目标环境:
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
相关产品推荐
相关产品推荐

