diff --git a/README.md b/README.md index 650840416..787c5f6f2 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Currently available modules: - **development** - [API Gateway](./modules/api-gateway), [Apigee](./modules/apigee), [Artifact Registry](./modules/artifact-registry), [Cloud Build V2 Connection](./modules/cloud-build-v2-connection), [Container Registry](./modules/container-registry), [Cloud Source Repository](./modules/source-repository), [Cloud Deploy](./modules/cloud-deploy), [Secure Source Manager instance](./modules/secure-source-manager-instance), [Workstation cluster](./modules/workstation-cluster) - **security** - [Binauthz](./modules/binauthz/), [Certificate Authority Service (CAS)](./modules/certificate-authority-service), [KMS](./modules/kms), [SecretManager](./modules/secret-manager), [VPC Service Control](./modules/vpc-sc), [Certificate Manager](./modules/certificate-manager/) - **serverless** - [Cloud Function v1](./modules/cloud-function-v1), [Cloud Function v2](./modules/cloud-function-v2), [Cloud Run v2](./modules/cloud-run-v2) +- **other** - [Backup DR](./modules/backup-dr) For more information and usage examples see each module's README file. diff --git a/modules/README.md b/modules/README.md index c85a16893..6eabc99f1 100644 --- a/modules/README.md +++ b/modules/README.md @@ -132,3 +132,7 @@ These modules are used in the examples included in this repository. If you are u - [Cloud Functions v1](./cloud-function-v1) - [Cloud Functions v2](./cloud-function-v2) - [Cloud Run v2](./cloud-run-v2) + +## Other + +- [Backup DR](./backup-dr) diff --git a/modules/backup-dr/README.md b/modules/backup-dr/README.md new file mode 100644 index 000000000..ca6f68f42 --- /dev/null +++ b/modules/backup-dr/README.md @@ -0,0 +1,203 @@ +# Terraform Google Backup DR Plan + +This Terraform module creates a Google Cloud Backup and DR backup plan and, optionally, a backup vault. + +## Description + +This module allows you to define a backup plan for your Google Cloud resources. You can specify backup rules, including schedules and retention policies. The module can also create a new backup vault or use an existing one. + +## Examples + + +- [Description](#description) +- [Examples](#examples) + - [Create backup vault (basic usage)](#create-backup-vault-basic-usage) + - [Create backup vault (extended options)](#create-backup-vault-extended-options) + - [Create vault and plan](#create-vault-and-plan) + - [Create only backup plan with existing vault](#create-only-backup-plan-with-existing-vault) + - [Create management_server](#create-management_server) +- [Variables](#variables) +- [Outputs](#outputs) + + +### Create backup vault (basic usage) +```hcl +module "dr_example" { + source = "./fabric/modules/backup-dr" + project_id = "your-gcp-project-id" + location = "us-central1" + name = "backup-vault-01" +} +# tftest modules=1 resources=1 +``` + +### Create backup vault (extended options) +```hcl +module "dr_example" { + source = "./fabric/modules/backup-dr" + project_id = "your-gcp-project-id" + location = "us-central1" + name = "backup-vault" + vault_config = { + access_restriction = "WITHIN_ORGANIZATION" + annotations = { + "key" = "value" + } + backup_minimum_enforced_retention_duration = "100000s" + backup_retention_inheritance = "INHERIT_VAULT_RETENTION" + description = "Backup Vault managed by Terraform IAC." + allow_missing = false + force_update = false + ignore_backup_plan_references = false + ignore_inactive_datasources = false + labels = { + "key" = "value" + } + } +} +# tftest inventory=extended.yaml +``` + +### Create vault and plan +```hcl +module "dr_example" { + source = "./fabric/modules/backup-dr" + project_id = "your-gcp-project-id" + location = "us-central1" + name = "backup-vault" + + backup_plans = { + my-backup-plan = { + resource_type = "compute.googleapis.com/Instance" + description = "Backup Plan for GCE Instances." + backup_rules = [ + { + rule_id = "daily-backup-rule" + backup_retention_days = 30 + standard_schedule = { + recurrence_type = "HOURLY" + hourly_frequency = 6 + time_zone = "America/Los_Angeles" + backup_window = { + start_hour_of_day = 1 + end_hour_of_day = 5 + } + } + }, + { + rule_id = "monthly-backup-rule" + backup_retention_days = 30 + standard_schedule = { + recurrence_type = "MONTHLY" + time_zone = "America/Los_Angeles" + week_day_of_month = { + week_of_month = "FIRST" + day_of_week = "MONDAY" + } + backup_window = { + start_hour_of_day = 1 + end_hour_of_day = 5 + } + } + } + ] + } + } +} +# tftest inventory=vault-plan.yaml +``` + +### Create only backup plan with existing vault +```hcl +module "dr_example" { + source = "./fabric/modules/backup-dr" + project_id = "your-gcp-project-id" + location = "us-central1" + + vault_reuse = { + vault_id = "backup-vault-test" + } + + backup_plans = { + "my-backup-plan" = { + resource_type = "compute.googleapis.com/Instance" + description = "Backup Plan for GCE Instances." + backup_rules = [ + { + rule_id = "daily-backup-rule" + backup_retention_days = 30 + standard_schedule = { + recurrence_type = "HOURLY" + hourly_frequency = 6 + time_zone = "America/Los_Angeles" + backup_window = { + start_hour_of_day = 1 + end_hour_of_day = 5 + } + } + }, + { + rule_id = "monthly-backup-rule" + backup_retention_days = 30 + standard_schedule = { + recurrence_type = "MONTHLY" + time_zone = "America/Los_Angeles" + week_day_of_month = { + week_of_month = "FIRST" + day_of_week = "MONDAY" + } + backup_window = { + start_hour_of_day = 1 + end_hour_of_day = 5 + } + } + } + ] + } + } +} +# tftest inventory=reuse.yaml +``` + +### Create management_server +```hcl +module "dr_example" { + source = "./fabric/modules/backup-dr" + project_id = "your-gcp-project-id" + location = "us-central1" + + management_server_config = { + name = "backup-dr-mgmt-server" + location = "us-central1" + type = "BACKUP_RESTORE" + network_config = { + network = "default" + peering_mode = "PRIVATE_SERVICE_ACCESS" + } + } +} +# tftest inventory=server.yaml +``` + + +## Variables + +| name | description | type | required | default | +|---|---|:---:|:---:|:---:| +| [location](variables.tf#L47) | Location for the Backup Vault and Plans (e.g. us-central1). | string | ✓ | | +| [project_id](variables.tf#L71) | Project ID. | string | ✓ | | +| [backup_plans](variables.tf#L17) | Map of Backup Plans to create in this Vault. | map(object({…})) | | {} | +| [management_server_config](variables.tf#L52) | Configuration to create a Management Server. If null, no server is created. | object({…}) | | null | +| [name](variables.tf#L65) | Name of the Backup Vault to create. Leave null if reusing an existing vault via `vault_reuse`. | string | | null | +| [vault_config](variables.tf#L76) | Configuration for the Backup Vault. Only used if `vault_reuse` is null. | object({…}) | | {} | +| [vault_reuse](variables.tf#L93) | Configuration to reuse an existing Backup Vault. | object({…}) | | null | + +## Outputs + +| name | description | sensitive | +|---|---|:---:| +| [backup_plans](outputs.tf#L16) | The ID of the created Backup Plans. | | +| [backup_vault_id](outputs.tf#L21) | The ID of the Backup Vault. | | +| [management_server](outputs.tf#L26) | The Management Server created. | | +| [management_server_uri](outputs.tf#L31) | The Management Server ID created. | | + diff --git a/modules/backup-dr/main.tf b/modules/backup-dr/main.tf new file mode 100644 index 000000000..4c81a66b5 --- /dev/null +++ b/modules/backup-dr/main.tf @@ -0,0 +1,87 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +resource "google_backup_dr_backup_vault" "backup_vault" { + count = var.name != null && var.vault_reuse == null ? 1 : 0 + project = var.project_id + location = var.location + backup_vault_id = var.name + description = var.vault_config.description + backup_minimum_enforced_retention_duration = var.vault_config.backup_minimum_enforced_retention_duration + annotations = var.vault_config.annotations + labels = var.vault_config.labels + force_update = var.vault_config.force_update + access_restriction = var.vault_config.access_restriction + backup_retention_inheritance = var.vault_config.backup_retention_inheritance + ignore_inactive_datasources = var.vault_config.ignore_inactive_datasources + ignore_backup_plan_references = var.vault_config.ignore_backup_plan_references + allow_missing = var.vault_config.allow_missing +} + +resource "google_backup_dr_backup_plan" "backup_plan" { + for_each = var.backup_plans + project = var.project_id + backup_plan_id = each.key + description = each.value.description + location = var.location + resource_type = each.value.resource_type + backup_vault = var.vault_reuse != null ? var.vault_reuse.vault_id : one(google_backup_dr_backup_vault.backup_vault[*].id) + + dynamic "backup_rules" { + for_each = each.value.backup_rules + content { + rule_id = backup_rules.value.rule_id + backup_retention_days = backup_rules.value.backup_retention_days + + standard_schedule { + recurrence_type = backup_rules.value.standard_schedule.recurrence_type + + hourly_frequency = backup_rules.value.standard_schedule.hourly_frequency + days_of_week = backup_rules.value.standard_schedule.days_of_week + days_of_month = backup_rules.value.standard_schedule.days_of_month + months = backup_rules.value.standard_schedule.months + dynamic "week_day_of_month" { + for_each = try(backup_rules.value.standard_schedule.week_day_of_month != null ? [backup_rules.value.standard_schedule.week_day_of_month] : []) + content { + week_of_month = week_day_of_month.value.week_of_month + day_of_week = week_day_of_month.value.day_of_week + } + } + time_zone = backup_rules.value.standard_schedule.time_zone + backup_window { + start_hour_of_day = backup_rules.value.standard_schedule.backup_window.start_hour_of_day + end_hour_of_day = backup_rules.value.standard_schedule.backup_window.end_hour_of_day + } + } + } + } +} + +resource "google_backup_dr_management_server" "management_server" { + count = var.management_server_config != null ? 1 : 0 + project = var.project_id + location = var.location + name = var.management_server_config.name + type = var.management_server_config.type + + dynamic "networks" { + for_each = var.management_server_config.network_config != null ? [var.management_server_config.network_config] : [] + content { + network = networks.value.network + peering_mode = networks.value.peering_mode + } + } +} \ No newline at end of file diff --git a/modules/backup-dr/outputs.tf b/modules/backup-dr/outputs.tf new file mode 100644 index 000000000..d473eca22 --- /dev/null +++ b/modules/backup-dr/outputs.tf @@ -0,0 +1,34 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +output "backup_plans" { + description = "The ID of the created Backup Plans." + value = google_backup_dr_backup_plan.backup_plan +} + +output "backup_vault_id" { + description = "The ID of the Backup Vault." + value = var.name != null ? one(google_backup_dr_backup_vault.backup_vault[*].id) : null +} + +output "management_server" { + description = "The Management Server created." + value = var.management_server_config != null ? one(google_backup_dr_management_server.management_server) : null +} + +output "management_server_uri" { + description = "The Management Server ID created." + value = var.management_server_config != null ? one(google_backup_dr_management_server.management_server[*].management_uri) : null +} \ No newline at end of file diff --git a/modules/backup-dr/variables.tf b/modules/backup-dr/variables.tf new file mode 100644 index 000000000..3662eb250 --- /dev/null +++ b/modules/backup-dr/variables.tf @@ -0,0 +1,103 @@ +/** + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +variable "backup_plans" { + description = "Map of Backup Plans to create in this Vault." + type = map(object({ + resource_type = string + description = optional(string) + backup_rules = list(object({ + rule_id = string + backup_retention_days = number + standard_schedule = object({ + recurrence_type = string + hourly_frequency = optional(number) + days_of_week = optional(list(string)) + days_of_month = optional(list(number)) + months = optional(list(string)) + week_day_of_month = optional(object({ + week_of_month = string + day_of_week = string + })) + time_zone = string + backup_window = object({ + start_hour_of_day = number + end_hour_of_day = number + }) + }) + })) + })) + default = {} + nullable = false +} + +variable "location" { + description = "Location for the Backup Vault and Plans (e.g. us-central1)." + type = string +} + +variable "management_server_config" { + description = "Configuration to create a Management Server. If null, no server is created." + type = object({ + name = string + type = optional(string, "BACKUP_RESTORE") + network_config = optional(object({ + network = string + peering_mode = optional(string, "PRIVATE_SERVICE_ACCESS") + })) + }) + default = null +} + +variable "name" { + description = "Name of the Backup Vault to create. Leave null if reusing an existing vault via `vault_reuse`." + type = string + default = null +} + +variable "project_id" { + description = "Project ID." + type = string +} + +variable "vault_config" { + description = "Configuration for the Backup Vault. Only used if `vault_reuse` is null." + type = object({ + description = optional(string) + labels = optional(map(string), {}) + annotations = optional(map(string), {}) + access_restriction = optional(string) + backup_minimum_enforced_retention_duration = optional(string, "100000s") + backup_retention_inheritance = optional(string) + force_update = optional(bool, false) + ignore_inactive_datasources = optional(bool, false) + ignore_backup_plan_references = optional(bool, false) + allow_missing = optional(bool, false) + }) + default = {} +} + +variable "vault_reuse" { + description = "Configuration to reuse an existing Backup Vault." + type = object({ + vault_id = string + }) + default = null + validation { + condition = var.name == null || var.vault_reuse == null + error_message = "name and vault_reuse can not be used together." + } +} \ No newline at end of file diff --git a/modules/backup-dr/versions.tf b/modules/backup-dr/versions.tf new file mode 100644 index 000000000..e4d8ced0b --- /dev/null +++ b/modules/backup-dr/versions.tf @@ -0,0 +1,35 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Fabric release: v49.0.0 + +terraform { + required_version = ">= 1.12.2" + required_providers { + google = { + source = "hashicorp/google" + version = ">= 7.6.0, < 8.0.0" # tftest + } + google-beta = { + source = "hashicorp/google-beta" + version = ">= 7.6.0, < 8.0.0" # tftest + } + } + provider_meta "google" { + module_name = "google-pso-tool/cloud-foundation-fabric/modules/backup-dr:v49.0.0-tf" + } + provider_meta "google-beta" { + module_name = "google-pso-tool/cloud-foundation-fabric/modules/backup-dr:v49.0.0-tf" + } +} diff --git a/modules/backup-dr/versions.tofu b/modules/backup-dr/versions.tofu new file mode 100644 index 000000000..dac6d8857 --- /dev/null +++ b/modules/backup-dr/versions.tofu @@ -0,0 +1,35 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Fabric release: v49.0.0 + +terraform { + required_version = ">= 1.10.0" + required_providers { + google = { + source = "hashicorp/google" + version = ">= 7.6.0, < 8.0.0" # tftest + } + google-beta = { + source = "hashicorp/google-beta" + version = ">= 7.6.0, < 8.0.0" # tftest + } + } + provider_meta "google" { + module_name = "google-pso-tool/cloud-foundation-fabric/modules/backup-dr:v49.0.0-tofu" + } + provider_meta "google-beta" { + module_name = "google-pso-tool/cloud-foundation-fabric/modules/backup-dr:v49.0.0-tofu" + } +} diff --git a/tests/modules/backup_dr/examples/extended.yaml b/tests/modules/backup_dr/examples/extended.yaml new file mode 100644 index 000000000..bf1f3f3b4 --- /dev/null +++ b/tests/modules/backup_dr/examples/extended.yaml @@ -0,0 +1,49 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.dr_example.google_backup_dr_backup_vault.backup_vault[0]: + access_restriction: WITHIN_ORGANIZATION + allow_missing: false + annotations: + key: value + backup_minimum_enforced_retention_duration: 100000s + backup_retention_inheritance: INHERIT_VAULT_RETENTION + backup_vault_id: backup-vault + description: Backup Vault managed by Terraform IAC. + effective_annotations: + key: value + effective_labels: + goog-terraform-provisioned: 'true' + key: value + effective_time: null + force_delete: false + force_update: false + ignore_backup_plan_references: false + ignore_inactive_datasources: false + labels: + key: value + location: us-central1 + project: your-gcp-project-id + terraform_labels: + goog-terraform-provisioned: 'true' + key: value + timeouts: null + +counts: + google_backup_dr_backup_vault: 1 + modules: 1 + resources: 1 + +outputs: {} diff --git a/tests/modules/backup_dr/examples/reuse.yaml b/tests/modules/backup_dr/examples/reuse.yaml new file mode 100644 index 000000000..29ee17f6d --- /dev/null +++ b/tests/modules/backup_dr/examples/reuse.yaml @@ -0,0 +1,60 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.dr_example.google_backup_dr_backup_plan.backup_plan["my-backup-plan"]: + backup_plan_id: my-backup-plan + backup_rules: + - backup_retention_days: 30 + rule_id: daily-backup-rule + standard_schedule: + - backup_window: + - end_hour_of_day: 5 + start_hour_of_day: 1 + days_of_month: null + days_of_week: null + hourly_frequency: 6 + months: null + recurrence_type: HOURLY + time_zone: America/Los_Angeles + week_day_of_month: [] + - backup_retention_days: 30 + rule_id: monthly-backup-rule + standard_schedule: + - backup_window: + - end_hour_of_day: 5 + start_hour_of_day: 1 + days_of_month: null + days_of_week: null + hourly_frequency: null + months: null + recurrence_type: MONTHLY + time_zone: America/Los_Angeles + week_day_of_month: + - day_of_week: MONDAY + week_of_month: FIRST + backup_vault: backup-vault-test + description: Backup Plan for GCE Instances. + location: us-central1 + log_retention_days: null + project: your-gcp-project-id + resource_type: compute.googleapis.com/Instance + timeouts: null + +counts: + google_backup_dr_backup_plan: 1 + modules: 1 + resources: 1 + +outputs: {} diff --git a/tests/modules/backup_dr/examples/server.yaml b/tests/modules/backup_dr/examples/server.yaml new file mode 100644 index 000000000..b821698cf --- /dev/null +++ b/tests/modules/backup_dr/examples/server.yaml @@ -0,0 +1,31 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.dr_example.google_backup_dr_management_server.management_server[0]: + location: us-central1 + name: backup-dr-mgmt-server + networks: + - network: default + peering_mode: PRIVATE_SERVICE_ACCESS + project: your-gcp-project-id + timeouts: null + type: BACKUP_RESTORE + +counts: + google_backup_dr_management_server: 1 + modules: 1 + resources: 1 + +outputs: {} diff --git a/tests/modules/backup_dr/examples/vault-plan.yaml b/tests/modules/backup_dr/examples/vault-plan.yaml new file mode 100644 index 000000000..632640567 --- /dev/null +++ b/tests/modules/backup_dr/examples/vault-plan.yaml @@ -0,0 +1,81 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +values: + module.dr_example.google_backup_dr_backup_plan.backup_plan["my-backup-plan"]: + backup_plan_id: my-backup-plan + backup_rules: + - backup_retention_days: 30 + rule_id: daily-backup-rule + standard_schedule: + - backup_window: + - end_hour_of_day: 5 + start_hour_of_day: 1 + days_of_month: null + days_of_week: null + hourly_frequency: 6 + months: null + recurrence_type: HOURLY + time_zone: America/Los_Angeles + week_day_of_month: [] + - backup_retention_days: 30 + rule_id: monthly-backup-rule + standard_schedule: + - backup_window: + - end_hour_of_day: 5 + start_hour_of_day: 1 + days_of_month: null + days_of_week: null + hourly_frequency: null + months: null + recurrence_type: MONTHLY + time_zone: America/Los_Angeles + week_day_of_month: + - day_of_week: MONDAY + week_of_month: FIRST + description: Backup Plan for GCE Instances. + location: us-central1 + log_retention_days: null + project: your-gcp-project-id + resource_type: compute.googleapis.com/Instance + timeouts: null + module.dr_example.google_backup_dr_backup_vault.backup_vault[0]: + access_restriction: WITHIN_ORGANIZATION + allow_missing: false + annotations: null + backup_minimum_enforced_retention_duration: 100000s + backup_retention_inheritance: null + backup_vault_id: backup-vault + description: null + effective_labels: + goog-terraform-provisioned: 'true' + effective_time: null + force_delete: false + force_update: false + ignore_backup_plan_references: false + ignore_inactive_datasources: false + labels: null + location: us-central1 + project: your-gcp-project-id + terraform_labels: + goog-terraform-provisioned: 'true' + timeouts: null + +counts: + google_backup_dr_backup_plan: 1 + google_backup_dr_backup_vault: 1 + modules: 1 + resources: 2 + +outputs: {}