Note:
- Este tutorial requiere acceso a Oracle Cloud. Para registrarse en una cuenta gratuita, consulte Introducción a la cuenta gratuita de Oracle Cloud Infrastructure.
- Utiliza valores de ejemplo para credenciales, arrendamiento y compartimentos de Oracle Cloud Infrastructure. Al finalizar el laboratorio, sustituya estos valores por otros específicos del entorno en la nube.
Despliegue de una base de datos gestionada por OCI con el servicio PostgreSQL mediante Terraform
Introducción
PostgreSQL, una base de datos relacional de objetos de código abierto ampliamente aclamada, ocupa una posición destacada debido a su robusta arquitectura y su inquebrantable integridad de datos, lo que la convierte en una opción preferida en entornos empresariales. Su disponibilidad en Oracle Cloud Infrastructure (OCI) presenta un servicio de base de datos totalmente gestionado y de alto rendimiento con su tamaño inteligente, ajuste rentable y durabilidad. PostgreSQL apoya a empresas, pequeñas y medianas empresas (PYMES) y una amplia gama de entornos de desarrollo, demostrando su adaptabilidad y robustez.
En este tutorial, aprenderemos a desplegar tres nodos de un sistema de base de datos PostgreSQL gestionado por OCI en un arrendamiento en la nube de OCI y a conectarse de forma privada a través de una instancia informática mediante el script de Terraform.
Objetivos
-
Despliegue una base de datos gestionada por OCI con PostgreSQL y una instancia informática para conectar el servicio de base de datos de forma privada mediante scripts de Terraform. Desplegaremos la siguiente arquitectura en OCI con código de Terraform.
Nota: Si la región seleccionada tiene un único dominio de disponibilidad, la creación de un sistema de base de datos de alta disponibilidad distribuirá todas las instancias de PostgreSQL en todos los dominios de errores de la región, independientemente de si se trata de una subred regional o específica de AD.
Requisitos
-
Un arrendamiento de Oracle Cloud Infrastructure.
-
Cuenta de usuario con privilegios para crear usuarios, agregar usuarios a grupos de usuarios y crear políticas de seguridad.
-
El usuario debe tener permisos de OCI IAM. Para obtener más información, consulte OCI Database con políticas PostgreSQL.
Tarea 1: Crear archivos de script de Terraform en una carpeta
-
Cree el script
providers.tf
.Comencemos por crear un archivo
providers.tf
. Cree una carpeta local y copie el siguiente código en el archivo creado. Los valores de la región tenancy_id, user_id, etc. se sustituirán en el archivovariables.tf
, que crearemos en un paso posterior. Para obtener los valores de configuración de OCI, genere claves de API en OCI accediendo a la configuración de usuario, cree un par de claves de API, descargue de forma segura la clave privada y, a continuación, utilícela junto con los OCID de usuario y arrendamiento en el código de Terraform para la autenticación con el fin de desplegar recursos de OCI. Para obtener más información, consulte Generación de una clave de firma de API.terraform { required_providers { oci = { source = "oracle/oci" version = "5.22.0" } } } # Provider configuration for Tenancy provider "oci" { tenancy_ocid = var.tenancy_id user_ocid = var.user_id fingerprint = var.api_fingerprint private_key_path = var.api_private_key_path region = var.region }
-
Cree el script
vcn.tf
.Necesitamos una red VCN con subredes privadas y públicas para desplegar y acceder al sistema de base de datos PostgreSQL de OCI, recordando que la base de datos PostgreSQL solo se desplegará en una subred privada. Cree un archivo denominado
vcn.tf
con el siguiente código. El código se asegurará de que solo el CIDR de la VCN pueda acceder al puerto 5432 para PostgreSQL y permitirá el acceso a la instancia informática a través de SSH en el puerto 22 dentro de la lista de seguridad. No es necesario preocuparse por sustituir los valores aquí, puede hacerlo en el archivovariables.tf
.resource oci_core_vcn psql_vcn_tf { #Required compartment_id = var.compartment_id #Optional cidr_block = var.vcn_cidr_block display_name = var.vcn_display_name } resource oci_core_subnet public_subnet { #Required cidr_block = var.public_subnet_cidr_block compartment_id = var.compartment_id vcn_id = oci_core_vcn.psql_vcn_tf.id #Optional display_name = var.public_subnet_display_name route_table_id = oci_core_route_table.tf_public_route_table.id } resource oci_core_subnet private_subnet { #Required cidr_block = var.private_subnet_cidr_block compartment_id = var.compartment_id vcn_id = oci_core_vcn.psql_vcn_tf.id display_name = var.private_subnet_display_name route_table_id = oci_core_route_table.tf_private_route_table.id prohibit_internet_ingress = true security_list_ids = [oci_core_security_list.tf_private_security_list.id] } resource oci_core_internet_gateway vcntf_igw { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = var.internet_gateway_name } resource oci_core_nat_gateway tf_nat_gateway { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = example-ngw # Add route tables to direct traffic through this NAT gateway } data oci_core_services test_services { } variable create_service_gateway { description = whether to create a service gateway. If set to true, creates a service gateway. default = true type = bool } data oci_core_services all_oci_services { filter { name = name values = [All .* Services In Oracle Services Network] regex = true } count = var.create_service_gateway == true ? 1 : 0 } resource oci_core_service_gateway service_gateway { compartment_id = var.compartment_id display_name = var.service_gateway_displayname services { service_id = lookup(data.oci_core_services.all_oci_services[0].services[0], id) } vcn_id = oci_core_vcn.psql_vcn_tf.id count = var.create_service_gateway == true ? 1 : 0 } resource oci_core_security_list tf_public_security_list { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = var.public_subnet_security_list_display_name ingress_security_rules { protocol = 6 # TCP protocol for SSH source = 0.0.0.0/0 # Allow inbound traffic from all sources tcp_options { #Optional max = 22 min = 22 } description = Allow SSH from all sources } } resource oci_core_security_list tf_private_security_list { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = var.private_subnet_security_list_disply_name ingress_security_rules { protocol = 6 # TCP protocol to connect Postgress service from compute instance in public subnet source = oci_core_vcn.psql_vcn_tf.cidr_block # Allow inbound traffic from CIDR Block of VCN sources tcp_options { #Optional max = 5432 min = 5432 } description = Allow psql service connections from all ranges cidr vcn } } resource oci_core_route_table tf_public_route_table { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = var.public_subnet_route_table_display_name route_rules { // Define route rules for public subnet network_entity_id = oci_core_internet_gateway.vcntf_igw.id destination = 0.0.0.0/0 destination_type = CIDR_BLOCK } } resource oci_core_route_table tf_private_route_table { vcn_id = oci_core_vcn.psql_vcn_tf.id compartment_id = var.compartment_id display_name = var.private_subnet_route_table_display_name route_rules { // Define route rules for private subnet network_entity_id = oci_core_nat_gateway.tf_nat_gateway.id destination = 0.0.0.0/0 destination_type = CIDR_BLOCK } route_rules { network_entity_id = oci_core_service_gateway.service_gateway.0.id destination = all-iad-services-in-oracle-services-network destination_type = SERVICE_CIDR_BLOCK } } resource oci_core_route_table_attachment public_route_table_attachment { #Required subnet_id = oci_core_subnet.public_subnet.id route_table_id =oci_core_route_table.tf_public_route_table.id } resource oci_core_route_table_attachment private_route_table_attachment { #Required subnet_id = oci_core_subnet.private_subnet.id route_table_id =oci_core_route_table.tf_private_route_table.id depends_on = [oci_core_service_gateway.service_gateway] }
-
Cree el script
instance.tf
.Para acceder a la base de datos PostgreSQL, necesitamos una instancia informática en la subred pública. Nos conectaremos a la instancia y, a continuación, accederemos a PostgreSQL porque solo se puede acceder a ella a través de la subred privada. Para ello, cree un archivo denominado
instance.tf
con el siguiente código. Puede actualizar fácilmente los valores de variables de cálculo en el archivovariables.tf
más adelante.# Resources data "oci_identity_availability_domains" "ads" { compartment_id = var.compartment_id } resource "oci_core_instance" "tf_compute" { # Required availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name compartment_id = var.compartment_id shape = var.compute_shape source_details { source_id = var.source_operating_system_image_id source_type = "image" } display_name = var.compute_instance_display_name shape_config { ocpus = var.compute_cpus memory_in_gbs = var.compute_memory_in_gbs } create_vnic_details { subnet_id = oci_core_subnet.public_subnet.id assign_public_ip = true } metadata = { ssh_authorized_keys = file(var.compute_ssh_authorized_keys) } preserve_boot_volume = false provisioner "remote-exec" { inline = [ "sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm", "sudo dnf -qy module disable postgresql", "sudo dnf install -y postgresql16-server", "sudo /usr/pgsql-16/bin/postgresql-16-setup initdb", "sudo systemctl enable postgresql-16", "sudo systemctl start postgresql-16" ] connection { type = "ssh" host = self.public_ip user = "opc" private_key = file(var.api_private_key_for_ssh) } } } # Outputs output "compute_id" { value = oci_core_instance.tf_compute.id } output "compute_state" { value = oci_core_instance.tf_compute.state } output "compute_public_ip" { value = oci_core_instance.tf_compute.public_ip }
-
Cree el script
postgresql.tf
.Vamos a configurar el sistema de base de datos PostgreSQL de OCI agregando el código de Terraform en un archivo denominado
postgresql.tf
. Este código detalla la configuración del sistema, incluidas la unidad, los núcleos y los nodos. Para una configuración optimizada, considere un sistema de base de datos de tres nodos: un nodo principal y dos réplicas en diferentes zonas de disponibilidad. Para empezar, cree el archivopostgresql.tf
e inserte el código proporcionado. Puede agregar fácilmente los valores de variable de la base de datos PostgreSQL en el archivovariables.tf
para cumplir sus requisitos específicos.resource "oci_psql_db_system" "test_db_system" { #Required compartment_id = var.compartment_id db_version = var.db_system_db_version display_name = var.db_system_display_name network_details { #Required subnet_id = oci_core_subnet.private_subnet.id } shape = var.db_system_shape storage_details { #Required is_regionally_durable = var.db_system_storage_details_is_regionally_durable system_type = var.db_system_storage_details_system_type #Optional # availability_domain = var.db_system_storage_details_availability_domain # iops = var.db_system_storage_details_iops } credentials { #Required password_details { #Required password_type = var.db_system_credentials_password_details_password_type #Optional password = var.db_system_credentials_password_details_password } username = var.db_system_credentials_username } instance_count = var.db_system_instance_count instance_memory_size_in_gbs = var.db_system_instance_memory_size_in_gbs instance_ocpu_count = var.db_system_instance_ocpu_count }
-
Cree el script
variables.tf
.En esta sección, el usuario debe ajustar y actualizar los valores de los recursos que se van a crear en su arrendamiento de OCI. Cree un archivo
variables.tf
y agregue el siguiente código. Recuerde que este es el archivo final que se creará en la misma carpeta. Revise y modifique cuidadosamente cada variable según sus necesidades. Algunos valores se rellenarán previamente en la sección 'valor' de cada código, mientras que otros, específicos de sus necesidades, requerirán su entrada. Una vez que se hayan agregado o modificado todos los valores en el archivo, continúe con la fase de ejecución.# Provider identity parameters - Replace these values from API Key Values from OCI User variable "api_fingerprint" { description = "Fingerprint of OCI API private key for Requestor Tenancy" type = string default = "" } variable "api_private_key_path" { description = "Path to OCI API private key used for Requestor Tenancy" type = string default = "" } variable "tenancy_id" { description = "Tenancy ID where to create resources for Requestor Tenancy" type = string default = "" } variable "user_id" { description = "User ID that Terraform will use to create resources for Requestor Tenancy" type = string default = "" } variable "region" { description = "OCI region where resources will be created for Requestor Tenancy" type = string default = "us-ashburn-1" # example value # check this document, if you want to use different region - https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm#About } # compartment OCID - Replace these values variable "compartment_id" { description = "Compartment ID where to create resources for Requestor Tenancy" type = string default = "" } variable "db_system_db_version" { description = "Version" type = number default = 14 } variable "db_system_display_name" { description = "postgress db service name" type = string default = "psqlfromterraform" # example value } variable "db_system_shape" { description = "shape" type = string default = "PostgreSQL.VM.Standard.E4.Flex.4.64GB" # example value #change the shape value as per your requirements } variable "db_system_instance_count" { description = "instance count" type = number default = 3 # example value } variable "db_system_instance_memory_size_in_gbs" { description = "RAM" type = number default = 64 # example value } variable "db_system_instance_ocpu_count" { description = "OCPU count" type = number default = 4 # example value } variable "db_system_storage_details_is_regionally_durable" { description = "regional" type = bool default = true } variable "db_system_credentials_password_details_password_type" { description = "type" type = string default = "PLAIN_TEXT" } variable "db_system_credentials_password_details_password" { description = "password" type = string default = "" } variable "db_system_credentials_username" { description = "username" type = string default = "admin" # example value } variable "db_system_storage_details_system_type" { description = "type" type = string default = "OCI_OPTIMIZED_STORAGE" } # OCI VCN parameters - psql instance deployed on this variable "vcn_cidr_block" { description = "vcn cidr" type = string default = "172.16.0.0/16" # example value } variable "vcn_display_name" { description = "vcn name" type = string default = "vcn-from-tf-psql" # example value } variable "public_subnet_cidr_block" { description = "subnet cidr range" type = string default = "172.16.1.0/24" # example value } variable "private_subnet_cidr_block" { description = "subnet cidr range" type = string default = "172.16.2.0/24" # example value } variable "public_subnet_display_name" { description = "public subnet name" type = string default = "public-subnet" # example value } variable "private_subnet_display_name" { description = "public subnet name" type = string default = "private-subnet" # example value } variable "internet_gateway_name" { description = "internet gateway name" type = string default = "internetgateway" # example value } variable "service_gateway_displayname" { description = "Service Gateway Display Name" type = string default = "servicegateway" # example value } variable "public_subnet_security_list_display_name" { description = "Public Subnet Security List Display Name" type = string default = "public_subnet_security_list" # example value } variable "private_subnet_security_list_display_name" { description = "Public Subnet Security List Display Name" type = string default = "public_subnet_security_list" # example value } variable "public_subnet_route_table_display_name" { description = "Public Subnet Route table Display Name" type = string default = "public_subnet_route_table" # example value } variable "private_subnet_route_table_display_name" { description = "Public Subnet Route table Display Name" type = string default = "private_subnet_route_table" # example value } # OCI Compute Instance parameters - We will use this instance to connect postgreSQL db instance variable "compute_shape" { type = string default = "VM.Standard.E4.Flex" # example value } variable "compute_cpus" { type = string default = "1" # example value } variable "compute_memory_in_gbs" { type = string default = "1" # example value } variable "compute_ssh_authorized_keys" { type = string default = "" } variable "api_private_key_for_ssh" { type = string default = "" } variable "source_operating_system_image_id" { description = "Oracle Linux 8 image ocid" type = string default = "ocid1.image.oc1.iad.aaaaaaaaszr5wpipg6qskiol3fhbitm56qdmumpbcpv6irzxuofi2nfmlhma" # example value # if you change the region , then change the default value from the region you have selected from this document -https://docs.oracle.com/en-us/iaas/images/image/998f1273-d4fd-4e16-8673-dd2517ddd724/ } variable "compute_instance_display_name" { description = "display name of the compute name" type = string default = "" }
Después de crear los archivos necesarios y ajustar el archivo
variables.tf
con los valores necesarios, la estructura de carpetas reflejará la configuración que se muestra en la siguiente captura de pantalla.
Tarea 2: Ejecución de scripts de Terraform
Mediante el terminal o el símbolo del sistema, ejecute los siguientes comandos para inicializar Terraform y crear recursos en su arrendamiento de OCI. Estos comandos inicializarán Terraform y desplegarán los recursos especificados en su arrendamiento de OCI.
terraform init
terraform plan
terraform apply
Tarea 3: Conexión a la base de datos PostgreSQL de OCI
Al finalizar, navegue a la consola de OCI para localizar OCI PostgreSQL y una instancia informática precargada con el cliente psql. Acceda a la instancia informática a través de SSH mediante su IP pública y, a continuación, ejecute el comando proporcionado para establecer una conexión con el sistema de base de datos PostgreSQL de OCI (tanto el puerto SSH 22
como el puerto de base de datos 5432
se crean automáticamente mediante el script vcn.tf
; no se necesita ninguna acción para la gestión de puertos). Actualice la IP de punto final privado, que se puede obtener de la consola de base de datos PostgreSQL de OCI, junto con el nombre de usuario y la contraseña especificados en el archivo variable.tf
. Una vez que ejecute el comando, solicitará la contraseña para conectarse.
psql --version
psql -h endpoint_ip -U admin_username -d postgres
Después de la ejecución de los siguientes comandos, los usuarios deben poder ver la conexión establecida a la base de datos PostgreSQL gestionada.
El usuario ha desplegado correctamente tres nodos de la base de datos PostgreSQL gestionada por OCI y los ha conectado de forma privada mediante una instancia informática.
Enlaces relacionados
Agradecimientos
- Autor: Akarsha I K (arquitecto en la nube)
Más recursos de aprendizaje
Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.
Para obtener documentación sobre el producto, visite Oracle Help Center.
Deploy OCI Managed Database with PostgreSQL Service using Terraform
F91015-01
January 2024
Copyright © 2024, Oracle and/or its affiliates.