Observação:
- Este tutorial requer acesso ao Oracle Cloud. Para se inscrever em uma conta gratuita, consulte Conceitos básicos do Oracle Cloud Infrastructure Free Tier.
- Ele usa valores de exemplo para credenciais, tenancy e compartimentos do Oracle Cloud Infrastructure. Ao concluir seu laboratório, substitua esses valores por valores específicos do seu ambiente de nuvem.
Implante o OCI Managed Database com o PostgreSQL Service usando o Terraform
Introdução
PostgreSQL, um banco de dados relacional de objeto de código aberto amplamente aclamado, ocupa uma posição de destaque devido à sua arquitetura robusta e integridade de dados inabalável, tornando-se uma escolha favorita em paisagens empresariais. Sua disponibilidade na Oracle Cloud Infrastructure (OCI) apresenta um serviço de banco de dados totalmente gerenciado e de alto desempenho com dimensionamento inteligente, ajuste econômico e durabilidade. O PostgreSQL suporta empresas, pequenas e médias empresas (PMEs) e uma ampla gama de ambientes de desenvolvimento, demonstrando sua adaptabilidade e robustez.
Neste tutorial, aprenderemos como podemos implantar três nós de um sistema de banco de dados PostgreSQL gerenciado pelo OCI em uma tenancy de nuvem do OCI e estabelecer conexão privada por meio de uma instância de computação usando o script Terraform.
Objetivos
-
Implante um banco de dados gerenciado do OCI com PostgreSQL e uma instância de computação para conectar o serviço de banco de dados de forma privada usando scripts do Terraform. Vamos implantar a arquitetura a seguir na OCI usando o código Terraform.
Observação: se a região selecionada tiver um único domínio de disponibilidade, a criação de um sistema de banco de dados altamente disponível distribuirá todas as instâncias PostgreSQL entre todos os domínios de falha da região, não importa se é uma sub-rede regional ou específica do AD.
Pré-requisitos
-
Uma tenancy do Oracle Cloud Infrastructure.
-
Uma conta de usuário com privilégios para criar usuários, adicionar usuários a grupos de usuários e criar políticas de segurança.
-
O usuário deve ter permissões do OCI IAM. Para obter mais informações, consulte OCI Database com Políticas PostgreSQL.
Tarefa 1: Criar arquivos de script do Terraform em uma pasta
-
Crie o script
providers.tf
.Vamos começar criando um arquivo
providers.tf
. Crie uma pasta local e copie o código abaixo no arquivo criado. Os valores para tenancy_id, user_id, região etc. serão substituídos no arquivovariables.tf
, que criaremos em uma etapa posterior. Para obter os valores de configurações do OCI, gere chaves de API no OCI acessando as definições do usuário, crie um par de chaves de API, faça download seguro da chave privada e use-a junto com os OCIDs do usuário e da tenancy no código do Terraform para autenticação para implantar recursos do OCI. Para obter mais informações, consulte Gerar uma Chave de Assinatura 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 }
-
Crie o script
vcn.tf
.Precisamos de uma rede VCN com sub-redes privadas e públicas para implantar e acessar o sistema de banco de dados PostgreSQL do OCI, lembrando que o banco de dados PostgreSQL só será implantado em uma sub-rede privada. Crie um arquivo chamado
vcn.tf
usando o código a seguir. O código garantirá que somente o CIDR da VCN possa acessar a porta 5432 para PostgreSQL e permitirá o acesso à instância de computação por meio do SSH na porta 22 dentro da lista de segurança. Não há necessidade de se preocupar em substituir os valores aqui; você pode fazer isso no arquivovariables.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] }
-
Crie o script
instance.tf
.Para acessar o banco de dados PostgreSQL, precisamos de uma instância de computação na sub-rede pública. Estabeleceremos conexão com a instância e, em seguida, acessaremos PostgreSQL porque ela só pode ser acessada por meio da sub-rede privada. Para fazer isso, crie um arquivo chamado
instance.tf
usando o código a seguir. Você pode atualizar facilmente os valores das variáveis de computação no arquivovariables.tf
posteriormente.# 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 }
-
Crie o script
postgresql.tf
.Vamos configurar o sistema de banco de dados PostgreSQL do OCI adicionando o código do Terraform em um arquivo chamado
postgresql.tf
. Este código detalha a configuração do sistema, incluindo forma, núcleos e nós. Para uma configuração otimizada, considere um sistema de banco de dados de três nós: um nó principal e duas réplicas em diferentes zonas de disponibilidade. Comece criando o arquivopostgresql.tf
e inserindo o código fornecido. Você pode adicionar facilmente os valores de variável do banco de dados PostgreSQL no arquivovariables.tf
para atender aos seus 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 }
-
Crie o script
variables.tf
.Nesta seção, o usuário precisa ajustar e atualizar os valores dos recursos a serem criados na tenancy do OCI. Crie um arquivo
variables.tf
e adicione o código a seguir. Lembre-se, este é o arquivo final a ser criado na mesma pasta. Revise e modifique cuidadosamente cada variável de acordo com seus requisitos. Alguns valores serão pré-preenchidos na seção 'valor' de cada código, enquanto outros, específicos de suas necessidades, exigirão sua entrada. Depois que todos os valores tiverem sido adicionados ou modificados no arquivo, prossiga para a fase de execução.# 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 = "" }
Depois de criar os arquivos necessários e ajustar o arquivo
variables.tf
com os valores necessários, sua estrutura de pastas refletirá a configuração exibida na captura de tela a seguir.
Tarefa 2: Executar Scripts do Terraform
Usando seu terminal ou prompt de comando, execute os comandos a seguir para inicializar o Terraform e criar recursos na sua tenancy do OCI. Esses comandos inicializarão o Terraform e implantarão os recursos especificados na tenancy do OCI.
terraform init
terraform plan
terraform apply
Tarefa 3: Estabelecer Conexão com o Banco de Dados PostgreSQL do OCI
Após a conclusão, navegue até a Console do OCI para localizar o OCI PostgreSQL e uma instância de computação pré-carregada com o cliente psql. Acesse a instância de computação via SSH usando seu IP público e, em seguida, execute o comando fornecido para estabelecer uma conexão com o sistema de banco de dados PostgreSQL do OCI (a porta SSH 22
e a porta do banco de dados 5432
são criadas automaticamente por meio do script vcn.tf
; nenhuma ação é necessária para o gerenciamento de portas). Atualize o IP do ponto final privado, que pode ser obtido na console do banco de dados PostgreSQL do OCI, com o nome de usuário e a senha especificados no arquivo variable.tf
. Depois de executar o comando, ele solicitará que a senha se conecte.
psql --version
psql -h endpoint_ip -U admin_username -d postgres
Após a execução dos comandos acima, os usuários deverão ser capazes de ver a conexão estabelecida com o banco de dados PostgreSQL gerenciado.
O usuário implantou com sucesso três nós do banco de dados PostgreSQL gerenciado pelo OCI e os conectou de forma privada usando uma instância de computação.
Links Relacionados
Agradecimentos
- Autor - Akarsha I K (Arquiteto de Nuvem)
Mais Recursos de Aprendizagem
Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.
Para obter a documentação do produto, visite o Oracle Help Center.
Deploy OCI Managed Database with PostgreSQL Service using Terraform
F91015-01
January 2024
Copyright © 2024, Oracle and/or its affiliates.