Terraform创建OCI自治数据库启用Data Guard报错方案咨询
问题说明
使用Terraform创建OCI自治数据库时,若创建阶段直接将is_data_guard_enabled设为true,会触发以下报错:
Error: 400-InvalidParameter, Operation failed. Cannot enable Autonomous Data Guard during database creation.
该报错由OCI平台限制导致:Autonomous Data Guard不支持在数据库创建流程中直接启用,必须先以Data Guard关闭的状态完成数据库创建,再通过更新操作为已存在的数据库开启Data Guard能力。
实现逻辑
不需要拆分多资源、多阶段部署,通过Terraform自身的条件判断+资源状态识别,即可实现「首次创建自动传false完成建库、后续更新读取变量值开启Data Guard」的逻辑,单次terraform apply即可完成全流程,无需人工二次执行命令。
具体修改方式
调整资源中两个Data Guard相关参数的赋值逻辑,通过判断当前资源是否已存在(资源ID是否生成)来决定传入的参数值:
- 资源首次创建时,资源ID为空,强制给两个DG参数传入
false,绕过创建阶段的平台限制 - 资源创建完成后,资源ID已生成,参数值读取你定义的变量值,自动触发更新操作开启Data Guard
修改后的完整资源代码如下:
resource "oci_database_autonomous_database" "autonomous_database_function" { compartment_id = var.compartment_id db_name = var.db_name display_name = var.db_name private_endpoint_label = var.db_name admin_password = random_password.oci_password.result is_preview_version_with_service_terms_accepted = "false" is_free_tier = "false" is_dedicated = "false" db_workload = var.db_workload cpu_core_count = var.cpu_core_count is_auto_scaling_enabled = var.auto_scaling_enabled is_auto_scaling_for_storage_enabled = var.auto_scaling_enabled is_mtls_connection_required = var.is_mtls_connection_required data_storage_size_in_tbs = var.data_storage_size_in_tbs license_model = var.license_model nsg_ids = var.nsg_ids db_version = var.db_version # 调整DG参数赋值逻辑,创建阶段固定传false,创建完成后读取变量值 is_data_guard_enabled = try(oci_database_autonomous_database.autonomous_database_function.id, "") == "" ? false : var.is_data_guard_enabled database_edition = var.database_edition is_local_data_guard_enabled = try(oci_database_autonomous_database.autonomous_database_function.id, "") == "" ? false : var.local_dg # Networking subnet_id = var.subnet_id dynamic "customer_contacts" { for_each = var.alert_recepient_email_address content { email = customer_contacts.value } } scheduled_operations { day_of_week { name = var.sched_ops_day_time[0] } scheduled_start_time = var.sched_ops_day_time[1] } }
注意事项
- 上述逻辑同时适配跨区域Autonomous Data Guard和本地Data Guard两个能力,两个参数必须同时套用条件判断,任意一个参数在创建阶段传
true都会触发相同报错 - OCI Terraform provider内置了资源状态轮询逻辑,会等待数据库创建完成进入
AVAILABLE状态后,再执行Data Guard开启的更新操作,不需要额外添加等待资源就绪的逻辑 - 该逻辑不会丢失后续参数变更能力,Data Guard开启完成后,后续如果需要关闭Data Guard、调整其他数据库配置,直接修改变量值执行apply即可正常触发更新
- 不需要拆分两次apply执行,单次执行会自动按顺序完成建库、开启DG的全流程
内容的提问来源于stack exchange,提问作者Naresh
相关产品推荐
相关产品推荐

