如何通过Terraform或Bash自动备份Azure PostgreSQL至Azure文件共享
Azure PostgreSQL弹性数据库自动备份至Azure文件共享的自动化方案
你已经通过Terraform完成了存储账户和文件共享的创建,接下来可以通过以下步骤实现PostgreSQL弹性数据库的定时自动备份:
一、核心实现路径
推荐使用**Azure自动化账户(Automation Account)**搭配PowerShell/Shell Runbook,结合计划触发器实现定时备份——这是Azure生态中轻量、易维护的自动化方案,无需额外搭建服务器。
二、第一步:配置权限
要确保自动化流程能访问PostgreSQL和存储账户,需要配置两个关键权限:
- 给自动化账户的系统分配服务主体,分配PostgreSQL服务器的备份操作员角色(或参与者角色,权限更宽泛),允许执行数据库导出操作。
- 给该服务主体分配存储账户的存储文件数据SMB共享参与者角色,允许向目标文件共享写入备份文件。
- 额外配置:如果PostgreSQL服务器启用了VNet防火墙,需要将自动化账户的VNet加入允许列表,或者开启服务端点让自动化账户能访问数据库。
三、第二步:编写备份脚本(以PowerShell为例)
脚本核心逻辑是用pg_dump导出数据库,再将备份文件上传到Azure文件共享。建议把敏感信息(如数据库密码、存储账户密钥)存到自动化账户的凭据库,避免硬编码。
示例脚本:
# 从自动化账户凭据库读取敏感信息 $pgCred = Get-AutomationPSCredential -Name "PostgresAdminCred" $storageCred = Get-AutomationPSCredential -Name "StorageAccountCred" # 基础配置参数 $pgHost = "your-postgres-flex-server.postgres.database.azure.com" $dbName = "target-database" $backupFileName = "backup_$(Get-Date -Format 'yyyyMMddHHmmss').sql" $storageAccountName = $storageCred.UserName $storageShareName = "backup_psql" $storageKey = $storageCred.GetNetworkCredential().Password # 安装pg_dump(首次运行需要,后续可省略) if (-not (Get-Command "pg_dump" -ErrorAction SilentlyContinue)) { Install-Module -Name PostgreSQLCmdlets -Force -Scope CurrentUser } # 导出数据库 $env:PGPASSWORD = $pgCred.GetNetworkCredential().Password pg_dump -h $pgHost -U $pgCred.UserName -d $dbName -f $backupFileName -w # 上传到Azure文件共享 $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageKey Set-AzStorageFileContent -Context $ctx -ShareName $storageShareName -Source $backupFileName -Force # 清理本地临时文件 Remove-Item $backupFileName -Force
四、第三步:用Terraform固化自动化基础设施
可以把自动化账户、Runbook、定时计划都用Terraform定义,实现全流程的基础设施即代码。
1. 创建自动化账户
resource "azurerm_automation_account" "backup_automation" { name = "postgres-backup-automation" location = data.azurerm_resource_group.rg_pssql_flex.location resource_group_name = data.azurerm_resource_group.rg_pssql_flex.name sku_name = "Basic" }
2. 创建备份Runbook
resource "azurerm_automation_runbook" "postgres_backup_runbook" { name = "PostgresFlexBackupRunbook" location = azurerm_automation_account.backup_automation.location resource_group_name = azurerm_automation_account.backup_automation.resource_group_name automation_account_name = azurerm_automation_account.backup_automation.name runbook_type = "PowerShell" log_verbose = true log_progress = true content = <<CONTENT # 填入上面的PowerShell备份脚本 CONTENT }
3. 创建定时计划触发器
比如设置每天凌晨2点执行备份:
resource "azurerm_automation_schedule" "daily_backup_schedule" { name = "DailyPostgresBackupSchedule" resource_group_name = azurerm_automation_account.backup_automation.resource_group_name automation_account_name = azurerm_automation_account.backup_automation.name frequency = "Day" interval = 1 start_time = "2024-01-01T02:00:00Z" time_zone = "Asia/Shanghai" } # 关联计划和Runbook resource "azurerm_automation_job_schedule" "backup_job_schedule" { automation_account_name = azurerm_automation_account.backup_automation.name resource_group_name = azurerm_automation_account.backup_automation.resource_group_name schedule_name = azurerm_automation_schedule.daily_backup_schedule.name runbook_name = azurerm_automation_runbook.postgres_backup_runbook.name }
五、可选优化建议
- 敏感信息加密存储:把数据库密码、存储账户密钥放到Azure Key Vault,让自动化账户通过密钥访问,进一步提升安全性。
- 备份压缩:在
pg_dump命令中添加-Fc参数生成压缩格式的备份文件,减少存储空间占用。 - 旧备份清理:在脚本中添加逻辑,删除超过指定天数(如7天)的旧备份文件,避免存储溢出。
- 失败告警:配置自动化账户的作业日志告警,当备份任务失败时,通过邮件或短信通知运维人员。
内容的提问来源于stack exchange,提问作者Ikteaja hsan
相关产品推荐
相关产品推荐

