Skip to content

Commit

Permalink
Added suport for file shares and installing vm extensions to support …
Browse files Browse the repository at this point in the history
…backup
  • Loading branch information
ravensorb committed Nov 19, 2022
1 parent d41bbd9 commit 6dbd543
Show file tree
Hide file tree
Showing 3 changed files with 179 additions and 6 deletions.
141 changes: 139 additions & 2 deletions main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ locals {
}
}

file_shares = {
for idx, fs in var.backup_file_shares : fs.name => {
idx : idx
file_share : fs
}
}

timeout_create = "180m"
timeout_update = "60m"
Expand All @@ -33,29 +39,46 @@ resource "azurerm_resource_group" "rg" {
count = var.create_resource_group ? 1 : 0
name = var.resource_group_name
location = var.location

tags = merge({ "ResourceName" = "${var.resource_group_name}" }, var.tags, )

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}

#-------------------------------------
## Recovery Services
#-------------------------------------

resource "azurerm_recovery_services_vault" "vault" {
name = var.recovery_services_vault_name != null ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault"
name = var.recovery_services_vault_name != "" ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault"
location = var.location
resource_group_name = local.resource_group_name
sku = var.recovery_services_vault_sku != null ? var.recovery_services_vault_sku : "Standard"
storage_mode_type = var.recovery_services_vault_storage_mode != null ? var.recovery_services_vault_storage_mode : "LocallyRedundant"

#cross_region_restore_enabled = var.recovery_servuces_vault_cross_region_restore_enabled

tags = merge({ "ResourceName" = var.recovery_services_vault_name != "" ? var.recovery_services_vault_name : "${local.resource_prefix}-bvault" }, var.tags, )

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}

#-------------------------------------
## Backup Policy
#-------------------------------------

resource "azurerm_backup_policy_vm" "policy" {
name = "${local.resource_prefix}-bkpol"
name = "${local.resource_prefix}-bkpol-vms"
resource_group_name = local.resource_group_name
recovery_vault_name = azurerm_recovery_services_vault.vault.name
policy_type = var.backup_policy_type != null ? var.backup_policy_type : "V2"
Expand Down Expand Up @@ -102,6 +125,53 @@ resource "azurerm_backup_policy_vm" "policy" {
}
}

resource "azurerm_backup_policy_file_share" "policy" {
name = "${local.resource_prefix}-bkpol-fileshares"
resource_group_name = local.resource_group_name
recovery_vault_name = azurerm_recovery_services_vault.vault.name

timezone = var.backup_policy_time_zone != null ? var.backup_policy_time_zone : "UTC"

backup {
frequency = var.backup_policy_frequency != null ? var.backup_policy_frequency : "Daily"
time = var.backup_policy_time != null ? var.backup_policy_time : "23:00"
}

dynamic "retention_daily" {
for_each = var.backup_policy_retention_daily_count != "" ? [1] : []

content {
count = var.backup_policy_retention_daily_count
}
}

dynamic "retention_weekly" {
for_each = var.backup_polcy_retention_weekly_count != "" ? [1] : []

content {
count = var.backup_polcy_retention_weekly_count
weekdays = var.backup_policy_retention_weekly_weekdays != null ? var.backup_policy_retention_weekly_weekdays : [ "Saturday" ]
}
}

dynamic "retention_monthly" {
for_each = var.backup_polcy_retention_monthly_count != "" ? [1] : []

content {
count = var.backup_polcy_retention_monthly_count
weekdays = var.backup_policy_retention_monthly_weekdays != null ? var.backup_policy_retention_monthly_weekdays : [ "Saturday" ]
weeks = [ "Last" ]
}
}

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}

#-------------------------------------
## Enable Backups for VMs
#-------------------------------------
Expand All @@ -113,6 +183,16 @@ data "azurerm_virtual_machine" "vm" {
resource_group_name = each.value.vm.resource_group_name != "" ? each.value.vm.resource_group_name : local.resource_group_name
}

# resource "azurerm_virtual_machine_extension" "vm_extensions" {
# for_each = local.virtual_machines

# name = each.value.vm.name
# virtual_machine_id = data.azurerm_virtual_machine.vm[each.value.vm.name].id
# publisher = "Microsoft.Azure.RecoveryServices"
# type = each.value.vm.os_type == "linux" ? "VMSnapshotLinux" : "VMSnapshot"
# type_handler_version = "1.0"
# }

resource "azurerm_backup_protected_vm" "vm" {
for_each = local.virtual_machines

Expand All @@ -122,10 +202,67 @@ resource "azurerm_backup_protected_vm" "vm" {

source_vm_id = data.azurerm_virtual_machine.vm[each.value.vm.name].id

# depends_on = [
# azurerm_virtual_machine_extension.vm_extensions
# ]

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}

#-------------------------------------
## Enable Backups for File Shares
#-------------------------------------

data "azurerm_storage_account" "storage_backup" {
for_each = local.file_shares

name = each.value.file_share.storage_account_name
resource_group_name = each.value.file_share.resource_group_name
}

resource "azurerm_backup_container_storage_account" "container" {
for_each = local.file_shares

recovery_vault_name = azurerm_recovery_services_vault.vault.name
resource_group_name = local.resource_group_name

storage_account_id = data.azurerm_storage_account.storage_backup[each.value.file_share.name].id

depends_on = [
data.azurerm_storage_account.storage_backup
]

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}

resource "azurerm_backup_protected_file_share" "share" {
for_each = local.file_shares

resource_group_name = local.resource_group_name
recovery_vault_name = azurerm_recovery_services_vault.vault.name
backup_policy_id = azurerm_backup_policy_file_share.policy.id

source_storage_account_id = data.azurerm_storage_account.storage_backup[each.value.file_share.name].id
source_file_share_name = each.value.file_share.name

depends_on = [
azurerm_backup_container_storage_account.container
]

timeouts {
create = local.timeout_create
delete = local.timeout_delete
read = local.timeout_read
update = local.timeout_update
}
}
4 changes: 2 additions & 2 deletions repo-settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "terraform-azurerm-azure-backup",
"description": "Terraform module for setting up Azure Backup",
"version": "v1.0.1",
"message": "Changed vm backup details to a list of objects"
"version": "v1.0.2",
"message": "Added suport for file shares and installing vm extensions to support backup"
}
40 changes: 38 additions & 2 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ variable "name" {
}

variable "create_resource_group" {
description = "Whether to create resource group and use it for all networking resources"
description = "Whether to create resource group and use it for all resources"
default = true
}

variable "resource_group_name" {
description = "A container that holds related resources for an Azure solution"
default = "rg-filestorage"
default = ""
}

variable "location" {
Expand All @@ -23,6 +23,31 @@ variable "resource_prefix" {
default = ""
}

variable "create_storage_account" {
description = "Whether to create storage account and use it for all backups"
default = true
}

variable "storage_account_resource_group_name" {
description = "A container that holds related resources for an Azure solution"
default = ""
}

variable "storage_account_name" {
description = "(Optional) Indicates the name of the storage account to either use or create"
default = ""
}

variable "storage_account_tier" {
description = "(Optional) Indicates the storage acccount tier"
default = ""
}

variable "storage_account_replication_type" {
description = "(Optional) Indicates the storage account replication type"
default = "LZR"
}

variable "recovery_services_vault_name" {
description = "(Optional) Indicates the name of recovery services vault to be created"
default = ""
Expand Down Expand Up @@ -118,6 +143,17 @@ variable "backup_virtual_machines" {
type = list(object({
name = string
resource_group_name = string
os_type = string
}))
default = []
}

variable "backup_file_shares" {
description = "Contains the list file shares that will be backed up"
type = list(object({
name = string
storage_account_name = string
resource_group_name = string
}))
default = []
}
Expand Down

0 comments on commit 6dbd543

Please sign in to comment.