如何使用Terraform为OCI现有默认路由表添加新规则
可行解决方法
补充说明:你自行创建的自定义路由表无法生效的核心原因是没有将其关联到你部署资源的对应子网,若不想修改默认路由表,也可以在子网配置中指定你创建的自定义路由表ID,即可让自定义路由规则生效。
方案1:导入现有默认路由表到Terraform状态进行管理
这是最符合Terraform声明式管理逻辑的方案,操作步骤如下:
- 首先获取你目标VCN对应默认路由表的OCID,可通过OCI控制台或
oci network route-table list --vcn-id <你的VCN_OCID> --compartment-id <你的 compartment_OCID> --display-name "Default Route Table"命令获取 - 修改你的Terraform代码,把
oci_core_route_table资源的配置对应上默认路由表的属性,比如display_name、compartment_id、vcn_id都和现有默认表一致,然后补全你要加的路由规则 - 执行导入命令将现有默认路由表导入到Terraform状态:
terraform import oci_core_route_table.test_route_table <你获取到的默认路由表OCID>
- 之后执行
terraform plan确认配置差异,确认只有你新增的路由规则会被添加,没有其他意外变更后执行terraform apply即可完成规则追加
方案2:使用oci_core_default_route_table专属资源管理
OCI Terraform Provider专门提供了默认资源类型来管理VCN创建时自动生成的默认路由表,无需手动导入,直接配置即可:
- 替换你原来的
oci_core_route_table资源为以下配置:
resource "oci_core_internet_gateway" "test_internet_gateway" { compartment_id = var.compartment_ocid vcn_id = oci_core_vcn.test_vcn.id } resource "oci_core_default_route_table" "default_route_table" { # 填写你目标VCN的ID,Provider会自动关联该VCN对应的默认路由表 manage_default_resource_id = oci_core_vcn.test_vcn.default_route_table_id # 这里可以保留原有路由规则,再追加你需要的互联网网关路由 route_rules { network_entity_id = oci_core_internet_gateway.test_internet_gateway.id destination = "0.0.0.0/0" } # 开启后Terraform只会管理你在配置中声明的路由规则,不会修改或删除默认路由表中已存在的其他规则 # 注意:该参数需要Provider版本在3.0.0以上支持 preserve_other_rules = true }
方案3:通过本地执行OCI CLI追加规则(临时变通方案)
如果你不想将默认路由表纳入Terraform状态管理,可以用null_resource配合local-exec调用OCI CLI添加规则,仅作为临时方案使用:
resource "oci_core_internet_gateway" "test_internet_gateway" { compartment_id = var.compartment_ocid vcn_id = oci_core_vcn.test_vcn.id } resource "null_resource" "add_default_route_rule" { triggers = { igw_id = oci_core_internet_gateway.test_internet_gateway.id vcn_id = oci_core_vcn.test_vcn.id } provisioner "local-exec" { command = <<EOT oci network route-table update \ --rt-id ${oci_core_vcn.test_vcn.default_route_table_id} \ --route-rules '[{"destination":"0.0.0.0/0","networkEntityId":"${oci_core_internet_gateway.test_internet_gateway.id}"}]' \ --preserve-other-rules EOT } }
该方案需要本地环境已安装并配置好OCI CLI,且有权限操作对应路由表
内容的提问来源于stack exchange,提问作者Shubham Jain
相关产品推荐
相关产品推荐

