Creación de una VCN en Oracle Cloud Infrastructure (OCI) con Terraform
- Francisco Javier Huete
- Ia c , Cloud
- August 28, 2025
Índice
Las VCN (Virtual Cloud Network) son un recurso fundamental en Oracle Cloud Infrastructure. En este post se utiliza la herramienta de IaC Terraform para provisionar uno de estos recursos en un arrendamiento de OCI.
Creación de la configuración
La configuración para crear un recurso de este tipo es sencilla:
terraform {
required_providers {
oci = {
source = "oracle/oci"
version = "7.15.0"
}
}
}
provider "oci" {
region = "eu-madrid-1"
auth = "SecurityToken"
config_file_profile = "DEFAULT"
}
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"
}
El primer bloque de este fichero de configuración es terraform{}
. Este bloque contiene la configuración de Terraform como, por ejemplo, el proveedor con el que la herramienta se tiene que comunicar para provisionar el escenario definido en el fichero. En este caso, el proveedor que se configura es oracle/oci
del registro de Terraform.
A continuación, en el bloque provider
se configura el proveedor específico, en este caso oci
. La información que recibe Terraform en este bloque es la región, el token de autentificación y el perfil del fichero de configuración con el que debe conectarse al proveedor de cloud.
Por último, se definen los recursos en el bloque resorce
. En este caso, el único recurso que se define es una VCN. Antes del bloque se añaden dos cadenas que indican el tipo de recurso (oci_core_vcn
) y el nombre (mi_vcn
), respectivamente. En el bloque se añade otra información relevante como la etiqueta DNS del a VCN, el bloque de direcciones IP que se le asigna, el ID del compartimento en el que se debe crear o el nombre del recurso.
Inicializar el directorio
Una vez definida la infraestructura que Terraform debe crear en la nube, el siguiente paso es inicializar el directorio. Esto se hace con el comando terraform init
.
❯ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding latest version of oracle/oci...
- Installing oracle/oci v7.15.0...
- Installed oracle/oci v7.15.0 (signed by a HashiCorp partner, key ID 1533A49284137CEB)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://developer.hashicorp.com/terraform/cli/plugins/signing
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Inicializar el directorio descarga e instala el plugin que permite a Terraform comunicarse con el proveedor de cloud, en este caso, oci
. Este plugin se descarga e instala en un directorio oculto llamado .terraform
que la propia herramienta crea.
Formatear y validar la configuración
Cuando se trabaja con infraestructura como código es fundamental atender a las buenas prácticas de formato para que la configuración sea legible, entendible y replicable. Por eso, Terraform cuenta con un comando que revisa el formato de todos los ficheros de configuración de un directorio y aplica los cambios necesarios para corregir los posibles errores. Si realiza alguna modificación, devuelve el nombre de los ficheros sobre los que ha efectuado cambios. En este caso, se utiliza un único fichero con una configuración muy sencilla en el que esta herramienta no ha necesitado realizar ninguna modificación.
terraform fmt
Además, antes de aplicar la configuración se puede validar con terraform validate
. A diferencia del anterior, este comando sí devuelve una salida cuando el resultado es exitoso.
❯ terraform validate
Success! The configuration is valid.
Crear la infraestructura
Antes de ejecutar el comando que crea la infraestructura, es conveniente aplicar un plan
. Con este comando Terraform planifica la infraestructura que debe crear en el servicio de cloud y notifica los posibles errores que aparezcan durante el proceso. Es una buena práctica realizar este plan antes de aplicar la configuración.
❯ terraform plan
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_vcn.mi_vcn will be created
+ resource "oci_core_vcn" "mi_vcn" {
+ byoipv6cidr_blocks = (known after apply)
+ cidr_block = "172.22.0.0/16"
+ cidr_blocks = (known after apply)
+ compartment_id = <OCID_del_compartimento>
+ default_dhcp_options_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_list_id = (known after apply)
+ defined_tags = (known after apply)
+ display_name = "Mi VCN"
+ dns_label = "mivcn"
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ ipv6cidr_blocks = (known after apply)
+ ipv6private_cidr_blocks = (known after apply)
+ is_ipv6enabled = (known after apply)
+ is_oracle_gua_allocation_enabled = (known after apply)
+ security_attributes = (known after apply)
+ state = (known after apply)
+ time_created = (known after apply)
+ vcn_domain_name = (known after apply)
+ byoipv6cidr_details (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.
Tras comprobar que la información que muestra el plan es coherente con el objetivo que se busca, se puede aplicar la configuración.
❯ terraform apply
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_vcn.mi_vcn will be created
+ resource "oci_core_vcn" "mi_vcn" {
+ byoipv6cidr_blocks = (known after apply)
+ cidr_block = "172.22.0.0/16"
+ cidr_blocks = (known after apply)
+ compartment_id = <OCID_del_compartimento>
+ default_dhcp_options_id = (known after apply)
+ default_route_table_id = (known after apply)
+ default_security_list_id = (known after apply)
+ defined_tags = (known after apply)
+ display_name = "Mi VCN"
+ dns_label = "mivcn"
+ freeform_tags = (known after apply)
+ id = (known after apply)
+ ipv6cidr_blocks = (known after apply)
+ ipv6private_cidr_blocks = (known after apply)
+ is_ipv6enabled = (known after apply)
+ is_oracle_gua_allocation_enabled = (known after apply)
+ security_attributes = (known after apply)
+ state = (known after apply)
+ time_created = (known after apply)
+ vcn_domain_name = (known after apply)
+ byoipv6cidr_details (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_vcn.mi_vcn: Creating...
oci_core_vcn.mi_vcn: Creation complete after 2s [id=<OCID del recurso creado>]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Tras aplicar el plan con Terraform, el recurso se ha creado en OCI.
❯ oci network vcn list --compartment-id <OCID del compartimento> --profile javi-huete --auth security_token
{
"data": [
{
"byoipv6-cidr-blocks": null,
"cidr-block": "172.22.0.0/16",
"cidr-blocks": [
"172.22.0.0/16"
],
"compartment-id": "<OCID del compartimento>",
"default-dhcp-options-id": "<OCID del recurso>",
"default-route-table-id": "<OCID del recurso>",
"default-security-list-id": "<OCID del recurso>",
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "default/fjhuete",
"CreatedOn": "2025-08-22T14:31:11.222Z"
}
},
"display-name": "Mi VCN",
"dns-label": "mivcn",
"freeform-tags": {},
"id": "<OCID del recurso>",
"ipv6-cidr-blocks": null,
"ipv6-private-cidr-blocks": null,
"is-zpr-only": null,
"lifecycle-state": "AVAILABLE",
"security-attributes": {},
"time-created": "2025-08-22T14:31:11.279000+00:00",
"vcn-domain-name": "mivcn.oraclevcn.com"
}
]
}