Editar recursos en Oracle Cloud Infrastructure (OCI) con Terraform

Índice

En un post anterior se mostraba cómo crear un recurso de tipo VCN (virtual cloud network o red virtual en la nube) en Oracle Cloud Infrastructure (OCI) usando Terraform. Pero este tipo de recurso, por sí solo no tiene ninguna utilidad. Así que en esta entrada se muestra cómo añadir una subred a la VCN y cómo modificarla posteriormente.

Añadir recursos a la configuración

Para añadir recursos a una configuración de Terraform simplemente es necesario añadir un nuevo bloque de tipo resource a la configuración. Es recomendable organizar los diferentes recursos en ficheros de configuración separados para mantener el orden y la organización de la infraestructura que se describe en el proyecto. Sin embargo, en este caso, como se trata de una configuración muy sencilla y todos los recursos creados están relacionados con la red se sigue trabajando en el mismo fichero main.tf que en el post anterior.

terraform {
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "7.15.0"
    }
  }
}

provider "oci" {
  region              = "eu-madrid-1"
  auth                = "SecurityToken"
  config_file_profile = "terraform-tutorial"
}

resource "oci_core_vcn" "mi_vcn" {
  dns_label      = "mivcn"
  cidr_block     = "172.22.0.0/16"
  compartment_id = "<OCID del compartimento>"
  display_name   = "Mi VCN"
}

resource "oci_core_subnet" "private_subnet" {
  vcn_id                      = oci_core_vcn.mi_vcn.id
  cidr_block                  = "172.22.0.0/24"
  compartment_id              = "<OCID del compartimento>"
  display_name                = "Private Subnet"
  prohibit_public_ip_on_vnic  = true
  dns_label                   = "privatesubnet"
}

En este caso, con el último bloque del fichero de configuración se crea un nuevo recurso de tipo subnet a la VCN previamente existente. Crear el recurso es tan sencillo como ejecutar un terraform plan:

❯ terraform plan
oci_core_vcn.mi_vcn: Refreshing state... [id=<OCID de la VCN>]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # oci_core_subnet.private_subnet will be created
  + resource "oci_core_subnet" "private_subnet" {
      + availability_domain        = (known after apply)
      + cidr_block                 = "172.22.0.0/24"
      + compartment_id             = "<OCID del compartimento>"
      + defined_tags               = (known after apply)
      + dhcp_options_id            = (known after apply)
      + display_name               = "Private Subnet"
      + dns_label                  = "privatesubnet"
      + freeform_tags              = (known after apply)
      + id                         = (known after apply)
      + ipv6cidr_block             = (known after apply)
      + ipv6cidr_blocks            = (known after apply)
      + ipv6virtual_router_ip      = (known after apply)
      + prohibit_internet_ingress  = (known after apply)
      + prohibit_public_ip_on_vnic = true
      + route_table_id             = (known after apply)
      + security_list_ids          = (known after apply)
      + state                      = (known after apply)
      + subnet_domain_name         = (known after apply)
      + time_created               = (known after apply)
      + vcn_id                     = "OCID de la VCN"
      + virtual_router_ip          = (known after apply)
      + virtual_router_mac         = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

───────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

La ejecución de este comando muestra los recursos que se van a crear cuando el plan se aplique. Si se alinean con los objetivos perseguidos, entonces, se puede proceder a aplicar el plan con terraform apply:

❯ terraform apply
oci_core_vcn.mi_vcn: Refreshing state... [id=<OCID de la VCN>]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # oci_core_subnet.private_subnet will be created
  + resource "oci_core_subnet" "private_subnet" {
      + availability_domain        = (known after apply)
      + cidr_block                 = "172.22.0.0/24"
      + compartment_id             = "<OCID del compartimento>"
      + defined_tags               = (known after apply)
      + dhcp_options_id            = (known after apply)
      + display_name               = "Private Subnet"
      + dns_label                  = "privatesubnet"
      + freeform_tags              = (known after apply)
      + id                         = (known after apply)
      + ipv6cidr_block             = (known after apply)
      + ipv6cidr_blocks            = (known after apply)
      + ipv6virtual_router_ip      = (known after apply)
      + prohibit_internet_ingress  = (known after apply)
      + prohibit_public_ip_on_vnic = true
      + route_table_id             = (known after apply)
      + security_list_ids          = (known after apply)
      + state                      = (known after apply)
      + subnet_domain_name         = (known after apply)
      + time_created               = (known after apply)
      + vcn_id                     = "<OCID de la VCN>"
      + virtual_router_ip          = (known after apply)
      + virtual_router_mac         = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

oci_core_subnet.private_subnet: Creating...
oci_core_subnet.private_subnet: Creation complete after 4s [id=<OCID de la subred>]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Tras aplicar la configuración, la nueva subred se crea en el compartimento indicado de OCI.

❯ oci network subnet list --profile terraform-tutorial --auth security_token --compartment-id <OCID del compartimento>
{
  "data": [
    {
      "availability-domain": null,
      "cidr-block": "172.22.0.0/24",
      "compartment-id": "<OCID del compartimento>",
      "defined-tags": {
        "Oracle-Tags": {
          "CreatedBy": "default/fjhuete",
          "CreatedOn": "2025-08-22T15:36:51.582Z"
        }
      },
      "dhcp-options-id": "<OCID del recurso>",
      "display-name": "Private Subnet",
      "dns-label": "privatesubnet",
      "freeform-tags": {},
      "id": "<OCID de la subred>",
      "ipv6-cidr-block": null,
      "ipv6-cidr-blocks": null,
      "ipv6-virtual-router-ip": null,
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": true,
      "prohibit-public-ip-on-vnic": true,
      "route-table-id": "<OCID del recurso>",
      "security-list-ids": [
        "<OCID del recurso>"
      ],
      "subnet-domain-name": "privatesubnet.mivcn.oraclevcn.com",
      "time-created": "2025-08-22T15:36:51.612000+00:00",
      "vcn-id": "<OCID del recurso>",
      "virtual-router-ip": "172.22.0.1",
      "virtual-router-mac": "00:00:17:D1:34:5F"
    }
  ]
}

Modificar recursos con Terraform

El proceso para modificar alguno de los recursos creados es bastante sencillo. Simplemente hay que modificar la definición del recurso en la configuración y volver a aplicar el plan de nuevo. En el mejor de los casos, el recurso permitirá ediciones y modificaciones en calienta y Terraform simplemente aplicará ese cambio. En el peor de los casos, el recurso no admitirá el cambio configurado y, por tanto, Terraform deberá eliminarlo y crearlo de nuevo. Este es uno de los motivos por el que es importante usar terraform plan antes de terraform apply, ya que el primer comando indica cuando un recurso se puede modificar o cuando, en cambio, es necesario eliminarlo y volverlo a crear.

En este ejemplo, la modificación consiste en cambiar el nombre o display_name de la subred. Para ello, sólo hay que cambiar este valor en el fichero de configuración main.tf.

terraform {
  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "7.15.0"
    }
  }
}

provider "oci" {
  region              = "eu-madrid-1"
  auth                = "SecurityToken"
  config_file_profile = "terraform-tutorial"
}

resource "oci_core_vcn" "mi_vcn" {
  dns_label      = "mivcn"
  cidr_block     = "172.22.0.0/16"
  compartment_id = "<OCID del compartimento>"
  display_name   = "Mi VCN"
}

resource "oci_core_subnet" "private_subnet" {
  vcn_id                      = oci_core_vcn.mi_vcn.id
  cidr_block                  = "172.22.0.0/24"
  compartment_id              = "<OCID del compartimento>"
  display_name                = "Subred Privada"
  prohibit_public_ip_on_vnic  = true
  dns_label                   = "privatesubnet"
}

Al planear la ejecución de la configuración, Terraform avisa de que este valor se modificará en la infraestructura de OCI al aplicar el plan:

❯ terraform plan
oci_core_vcn.mi_vcn: Refreshing state... [id=<OCID de la VCN>]
oci_core_subnet.private_subnet: Refreshing state... [id=<OCID de la subred>]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # oci_core_subnet.private_subnet will be updated in-place
  ~ resource "oci_core_subnet" "private_subnet" {
      ~ display_name               = "Private Subnet" -> "Subred Privada"
        id                         = "<OCID de la subred>"
        # (17 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

───────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

Como se ve, la actualización se produce “in-place” y, por tanto, no requiere eliminar el recurso. Por tanto, a continuación, se puede aplicar el plan:

❯ terraform apply 
oci_core_vcn.mi_vcn: Refreshing state... [id=<OCID de la VCN>]
oci_core_subnet.private_subnet: Refreshing state... [id=<OCID de la subred>]

Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  # oci_core_subnet.private_subnet will be updated in-place
  ~ resource "oci_core_subnet" "private_subnet" {
      ~ display_name               = "Private Subnet" -> "Subred Privada"
        id                         = "<OCID de la subred>"
        # (17 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

oci_core_subnet.private_subnet: Modifying... [id=<OCID de la subred>]
oci_core_subnet.private_subnet: Modifications complete after 1s [id=<OCID de la subred>]

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

Tras aplicar esta modificación, el nombre del recurso cambia en la infraestructura de OCI:

❯ oci network subnet list --profile terraform-tutorial --auth security_token --compartment-id <OCID del compartimento>
{
  "data": [
    {
      "availability-domain": null,
      "cidr-block": "172.22.0.0/24",
      "compartment-id": "<OCID del compartimento>",
      "defined-tags": {
        "Oracle-Tags": {
          "CreatedBy": "default/fjhuete",
          "CreatedOn": "2025-08-22T15:36:51.582Z"
        }
      },
      "dhcp-options-id": "<OCID del recurso>",
      "display-name": "Subred Privada",
      "dns-label": "privatesubnet",
      "freeform-tags": {},
      "id": "<OCID de la subred>",
      "ipv6-cidr-block": null,
      "ipv6-cidr-blocks": null,
      "ipv6-virtual-router-ip": null,
      "lifecycle-state": "AVAILABLE",
      "prohibit-internet-ingress": true,
      "prohibit-public-ip-on-vnic": true,
      "route-table-id": "<OCID del recurso>",
      "security-list-ids": [
        "<OCID del recurso>"
      ],
      "subnet-domain-name": "privatesubnet.mivcn.oraclevcn.com",
      "time-created": "2025-08-22T15:36:51.612000+00:00",
      "vcn-id": "<OCID de la VCN>",
      "virtual-router-ip": "172.22.0.1",
      "virtual-router-mac": "00:00:17:D1:34:5F"
    }
  ]
}
comments powered by Disqus

Relacionados

Cómo simular un servidor web en GNS3

Existen varias formas de crear un servidor web en un escenario de GNS3. En este post se optará por añadir una máquina Linux con Debian 11 en la que se instalará el servidor Nginx para que pueda actuar a forma de servidor web en el escenario.

Leer

Cómo configurar un servidor DHCP en un router Cisco

La mayor parte de routers pueden funcionar también como servidores DHCP para los equipos de su red. En este post se explica cómo configurar un servidor DHCP en un router Cisco.

Leer

Qué es ARP y cómo funciona

El protocolo de resolución de direcciones (ARP) es el protocolo de comunicaciones responsable de encontrar la dirección MAC que corresponde a una determinada dirección IP. Lo hace a través de un conjunto de tramas de petición y respuesta.

Leer