Skip to content

oracle-terraform-modules/terraform-oci-fsdr

Oracle Cloud Infrastructure Terraform Module for Full Stack Disaster Recovery

This module is for creating resources related to Full Stack Disaster Recovery in Oracle Cloud Infrastructure

Note: the root folder of this module contains no Terraform code: it groups together the related submodules.

The file and directory layout follows the Terraform Standard Module Structure:

modules folder contains several standalone, reusable, submodules for creating IAM resources in Oracle Cloud Infrastructure, examples folder contains fully-functional examples that you can copy and paste "as is" to have a first look at the submodules capabilities.

Pre-requisites:

  • git is installed.
  • Terraform 1.3.0 or higher version is installed.

Usage

See the examples/ folder for usage examples.

module "fsdr" {
  source = "../../"
  providers = {
    oci.region1 = oci.region1
    oci.region2 = oci.region2
  }
  region1_config = yamldecode(file("${path.module}/region1.yaml"))
  region2_config = yamldecode(file("${path.module}/region2.yaml"))
}
Name Version
terraform >= 1.3.0
oci >= 5.0.0

Providers

Name Version
oci.region1 >= 5.0.0
oci.region2 >= 5.0.0

Modules

Name Source Version
dr_plan_execution_region1 ./modules/dr-plan-and-execution n/a
dr_plan_execution_region2 ./modules/dr-plan-and-execution n/a
dr_plan_region1 ./modules/dr-plan-and-execution n/a
dr_plan_region2 ./modules/dr-plan-and-execution n/a
dr_protection_group_region1 ./modules/dr-protection-group n/a
dr_protection_group_region2 ./modules/dr-protection-group n/a

Resources

Name Type
oci_disaster_recovery_dr_protection_group.region1_dr_protection_group data source
oci_disaster_recovery_dr_protection_group.region2_dr_protection_group data source
oci_disaster_recovery_dr_protection_groups.region1_dr_protection_groups data source
oci_disaster_recovery_dr_protection_groups.region2_dr_protection_groups data source

Inputs

Name Description Type Default Required
region1_config Region1 config is required. This is PRIMARY.
object({
compartment_id = string
protection_group_display_name = string
peer_region = string
defined_tags = optional(map(string), null)
freeform_tags = optional(map(string), null)
log_location = object({
bucket = string
namespace = string
})
disassociate_trigger = optional(number, null)
add_members = optional(list(object({
autonomous_database_standby_type_for_dr_drills = optional(string, null)
member_id = string
member_type = string
bucket = optional(string, null)
connection_string_type = optional(string, null)
destination_availability_domain = optional(string, null)
destination_backup_policy_id = optional(string, null)
destination_capacity_reservation_id = optional(string, null)
destination_compartment_id = optional(string, null)
destination_dedicated_vm_host_id = optional(string, null)
destination_load_balancer_id = optional(string, null)
destination_network_load_balancer_id = optional(string, null)
destination_snapshot_policy_id = optional(string, null)
gtid_reconciliation_timeout = optional(number, 0)
is_continue_on_gtid_reconciliation_timeout = optional(bool, false)
is_movable = optional(bool, false)
is_retain_fault_domain = optional(bool, false)
is_start_stop_enabled = optional(bool, false)
jump_host_id = optional(string, null)
namespace = optional(string, null)
password_vault_secret_id = optional(string, null)
peer_cluster_id = optional(string, null)
peer_db_system_id = optional(string, null)
backend_set_mappings = optional(list(object({
destination_backend_set_name = optional(string, null)
is_backend_set_for_non_movable = optional(bool, false)
source_backend_set_name = optional(string, null)
})), [])
backup_config = optional(object({
backup_schedule = optional(string, null)
exclude_namespaces = optional(list(string), [])
image_replication_vault_secret_id = optional(string, null)
max_number_of_backups_retained = optional(number, null)
namespaces = optional(list(string), [])
replicate_images = optional(string, null)
}), null)
backup_location = optional(object({
bucket = optional(string, null)
namespace = optional(string, null)
}), null)
block_volume_attach_and_mount_operations = optional(object({
attachments = optional(list(object({
block_volume_id = optional(string, null)
volume_attachment_reference_instance_id = optional(string, null)
})), [])
mounts = optional(list(object({
mount_point = optional(string, null)
})), [])
}), {})
common_destination_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
db_system_admin_user_details = optional(object({
password_vault_secret_id = optional(string, null)
username = optional(string, null)
}), null)
db_system_replication_user_details = optional(object({
password_vault_secret_id = optional(string, null)
username = optional(string, null)
}), null)
destination_encryption_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
export_mappings = optional(list(object({
destination_mount_target_id = optional(string, null)
export_id = optional(string, null)
})), [])
file_system_operations = optional(list(object({
export_path = optional(string, null)
mount_details = optional(object({
mount_target_id = optional(string, null)
}), null)
unmount_details = optional(object({
unmount_target_id = optional(string, null)
}), null)
mount_point = optional(string, null)
mount_target_id = optional(string, null)
})), [])
load_balancer_mappings = optional(list(object({
destination_load_balancer_id = optional(string, null)
source_load_balancer_id = optional(string, null)
})), [])
managed_node_pool_configs = optional(list(object({
id = optional(string, null)
maximum = optional(number, null)
minimum = optional(number, null)
})), [])
network_load_balancer_mappings = optional(list(object({
destination_network_load_balancer_id = optional(string, null)
source_network_load_balancer_id = optional(string, null)
})), [])
source_volume_to_destination_encryption_key_mappings = optional(list(object({
source_volume_id = optional(string, null)
destination_encryption_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
})), [])
vault_mappings = optional(list(object({
destination_vault_id = optional(string, null)
source_vault_id = optional(string, null)
})), [])
virtual_node_pool_configs = optional(list(object({
id = optional(string, null)
maximum = optional(number, null)
minimum = optional(number, null)
})), [])
vnic_mapping = optional(list(object({
destination_nsg_id_list = optional(list(string), [])
destination_subnet_id = optional(string, null)
source_vnic_id = optional(string, null)
})), [])
vnic_mappings = optional(list(object({
destination_nsg_id_list = optional(list(string), [])
destination_primary_private_ip_address = optional(string, null)
destination_primary_private_ip_hostname_label = optional(string, null)
destination_reserved_public_ip_id = optional(string, null)
destination_subnet_id = optional(string, null)
source_vnic_id = optional(string, null)
})), [])
})), [])

remove_members = optional(list(string), [])
dr_plan_and_execution = optional(list(object({
plan_display_name = string
type = string
defined_tags = optional(map(string), null)
freeform_tags = optional(map(string), null)
source_plan_id = optional(string, null)
refresh_trigger = optional(number, null)
verify_trigger = optional(number, null)
plan_execution = optional(list(object({
plan_execution_type = string
are_prechecks_enabled = optional(bool, false)
are_warnings_ignored = optional(bool, false)
defined_tags = optional(map(string), null)
execution_display_name = string
freeform_tags = optional(map(string), null)
timeouts_create = optional(string, "20m")
timeouts_update = optional(string, "20m")
})), [])
})), [])
})
n/a yes
region2_config Region2 config is required. This is STANDBY.
object({
compartment_id = string
protection_group_display_name = string
defined_tags = optional(map(string), null)
freeform_tags = optional(map(string), null)
log_location = object({
bucket = string
namespace = string
})
disassociate_trigger = optional(number, null)
add_members = optional(list(object({
autonomous_database_standby_type_for_dr_drills = optional(string, null)
member_id = string
member_type = string
bucket = optional(string, null)
connection_string_type = optional(string, null)
destination_availability_domain = optional(string, null)
destination_backup_policy_id = optional(string, null)
destination_capacity_reservation_id = optional(string, null)
destination_compartment_id = optional(string, null)
destination_dedicated_vm_host_id = optional(string, null)
destination_load_balancer_id = optional(string, null)
destination_network_load_balancer_id = optional(string, null)
destination_snapshot_policy_id = optional(string, null)
gtid_reconciliation_timeout = optional(number, 0)
is_continue_on_gtid_reconciliation_timeout = optional(bool, false)
is_movable = optional(bool, false)
is_retain_fault_domain = optional(bool, false)
is_start_stop_enabled = optional(bool, false)
jump_host_id = optional(string, null)
namespace = optional(string, null)
password_vault_secret_id = optional(string, null)
peer_cluster_id = optional(string, null)
peer_db_system_id = optional(string, null)
backend_set_mappings = optional(list(object({
destination_backend_set_name = optional(string, null)
is_backend_set_for_non_movable = optional(bool, false)
source_backend_set_name = optional(string, null)
})), [])
backup_config = optional(object({
backup_schedule = optional(string, null)
exclude_namespaces = optional(list(string), [])
image_replication_vault_secret_id = optional(string, null)
max_number_of_backups_retained = optional(number, null)
namespaces = optional(list(string), [])
replicate_images = optional(string, null)
}), null)
backup_location = optional(object({
bucket = optional(string, null)
namespace = optional(string, null)
}), null)
block_volume_attach_and_mount_operations = optional(object({
attachments = optional(list(object({
block_volume_id = optional(string, null)
volume_attachment_reference_instance_id = optional(string, null)
})), [])
mounts = optional(list(object({
mount_point = optional(string, null)
})), [])
}), {})
common_destination_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
db_system_admin_user_details = optional(object({
password_vault_secret_id = optional(string, null)
username = optional(string, null)
}), null)
db_system_replication_user_details = optional(object({
password_vault_secret_id = optional(string, null)
username = optional(string, null)
}), null)
destination_encryption_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
export_mappings = optional(list(object({
destination_mount_target_id = optional(string, null)
export_id = optional(string, null)
})), [])
file_system_operations = optional(list(object({
export_path = optional(string, null)
mount_details = optional(object({
mount_target_id = optional(string, null)
}), null)
unmount_details = optional(object({
unmount_target_id = optional(string, null)
}), null)
mount_point = optional(string, null)
mount_target_id = optional(string, null)
})), [])
load_balancer_mappings = optional(list(object({
destination_load_balancer_id = optional(string, null)
source_load_balancer_id = optional(string, null)
})), [])
managed_node_pool_configs = optional(list(object({
id = optional(string, null)
maximum = optional(number, null)
minimum = optional(number, null)
})), [])
network_load_balancer_mappings = optional(list(object({
destination_network_load_balancer_id = optional(string, null)
source_network_load_balancer_id = optional(string, null)
})), [])
source_volume_to_destination_encryption_key_mappings = optional(list(object({
source_volume_id = optional(string, null)
destination_encryption_key = optional(object({
encryption_key_id = optional(string, null)
vault_id = optional(string, null)
}), null)
})), [])
vault_mappings = optional(list(object({
destination_vault_id = optional(string, null)
source_vault_id = optional(string, null)
})), [])
virtual_node_pool_configs = optional(list(object({
id = optional(string, null)
maximum = optional(number, null)
minimum = optional(number, null)
})), [])
vnic_mapping = optional(list(object({
destination_nsg_id_list = optional(list(string), [])
destination_subnet_id = optional(string, null)
source_vnic_id = optional(string, null)
})), [])
vnic_mappings = optional(list(object({
destination_nsg_id_list = optional(list(string), [])
destination_primary_private_ip_address = optional(string, null)
destination_primary_private_ip_hostname_label = optional(string, null)
destination_reserved_public_ip_id = optional(string, null)
destination_subnet_id = optional(string, null)
source_vnic_id = optional(string, null)
})), [])
})), [])
remove_members = optional(list(string), [])
dr_plan_and_execution = optional(list(object({
plan_display_name = string
type = string
defined_tags = optional(map(string), null)
freeform_tags = optional(map(string), null)
source_plan_id = optional(string, null)
refresh_trigger = optional(number, null)
verify_trigger = optional(number, null)
plan_execution = optional(list(object({
plan_execution_type = string
are_prechecks_enabled = optional(bool, false)
are_warnings_ignored = optional(bool, false)
defined_tags = optional(map(string), null)
execution_display_name = string
freeform_tags = optional(map(string), null)
timeouts_create = optional(string, "20m")
timeouts_update = optional(string, "20m")
})), [])
})), [])
})
n/a yes

Outputs

Name Description
region1_dr_protection_group_id Protection group OCID of region1
region1_members Members of the existing protection group in region1
region1_plan_ids OCID of region1 plans
region2_dr_protection_group_id Protection group OCID of region2
region2_members Members of the existing protection group in region2
region2_plan_ids OCID of region2 plans

Contributing

This project is open source. Oracle appreciates any contributions that are made by the open source community.

Learn how to contribute.

Security

Please consult the security guide for our responsible security vulnerability disclosure process

License

Copyright (c) 2025, Oracle and/or its affiliates.

Licensed under the Universal Permissive License 1.0 or Apache License 2.0.

See LICENSE for more details.## Requirements

About

Terraform Module for managing Oracle Cloud Infrastructure Full Stack Disaster Recovery resources

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages