Share via


Implantar um banco de dados de servidor flexível PostgreSQL usando Terraform

Artigo testado com as seguintes versões do provedor Terraform e Terraform:

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar o provedor de nuvem - como o Azure - e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

Este artigo mostra como implantar um banco de dados de servidor flexível PostgreSQL usando Terraform.

Neste artigo, vai aprender a:

Nota

O código de exemplo neste artigo está localizado no repositório GitHub do Azure Terraform.

1. Configure seu ambiente

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

2. Implementar o código Terraform

  1. Crie um diretório no qual testar e executar o código Terraform de exemplo e torná-lo o diretório atual.

  2. Crie um arquivo chamado providers.tf e insira o seguinte código:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = ">= 3.4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Crie um arquivo chamado main.tf e insira o código a seguir para implantar o Servidor Flexível PostgreSQL no qual o banco de dados é executado.

    resource "random_pet" "name_prefix" {
      prefix = var.name_prefix
      length = 1
    }
    
    resource "azurerm_resource_group" "default" {
      name     = random_pet.name_prefix.id
      location = var.location
    }
    
    resource "azurerm_virtual_network" "default" {
      name                = "${random_pet.name_prefix.id}-vnet"
      location            = azurerm_resource_group.default.location
      resource_group_name = azurerm_resource_group.default.name
      address_space       = ["10.0.0.0/16"]
    }
    
    resource "azurerm_network_security_group" "default" {
      name                = "${random_pet.name_prefix.id}-nsg"
      location            = azurerm_resource_group.default.location
      resource_group_name = azurerm_resource_group.default.name
    
      security_rule {
        name                       = "test123"
        priority                   = 100
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "*"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
      }
    }
    
    resource "azurerm_subnet" "default" {
      name                 = "${random_pet.name_prefix.id}-subnet"
      virtual_network_name = azurerm_virtual_network.default.name
      resource_group_name  = azurerm_resource_group.default.name
      address_prefixes     = ["10.0.2.0/24"]
      service_endpoints    = ["Microsoft.Storage"]
    
      delegation {
        name = "fs"
    
        service_delegation {
          name = "Microsoft.DBforPostgreSQL/flexibleServers"
    
          actions = [
            "Microsoft.Network/virtualNetworks/subnets/join/action",
          ]
        }
      }
    }
    
    resource "azurerm_subnet_network_security_group_association" "default" {
      subnet_id                 = azurerm_subnet.default.id
      network_security_group_id = azurerm_network_security_group.default.id
    }
    
    resource "azurerm_private_dns_zone" "default" {
      name                = "${random_pet.name_prefix.id}-pdz.postgres.database.azure.com"
      resource_group_name = azurerm_resource_group.default.name
    
      depends_on = [azurerm_subnet_network_security_group_association.default]
    }
    
    resource "azurerm_private_dns_zone_virtual_network_link" "default" {
      name                  = "${random_pet.name_prefix.id}-pdzvnetlink.com"
      private_dns_zone_name = azurerm_private_dns_zone.default.name
      virtual_network_id    = azurerm_virtual_network.default.id
      resource_group_name   = azurerm_resource_group.default.name
    }
    
    resource "random_password" "pass" {
      length = 20
    }
    
    resource "azurerm_postgresql_flexible_server" "default" {
      name                   = "${random_pet.name_prefix.id}-server"
      resource_group_name    = azurerm_resource_group.default.name
      location               = azurerm_resource_group.default.location
      version                = "13"
      delegated_subnet_id    = azurerm_subnet.default.id
      private_dns_zone_id    = azurerm_private_dns_zone.default.id
      administrator_login    = "adminTerraform"
      administrator_password = random_password.pass.result
      zone                   = "1"
      storage_mb             = 32768
      sku_name               = "GP_Standard_D2s_v3"
      backup_retention_days  = 7
    
      depends_on = [azurerm_private_dns_zone_virtual_network_link.default]
    }
    
  4. Crie um arquivo chamado postgresql-fs-db.tf e insira o seguinte código para instanciar o banco de dados:

    resource "azurerm_postgresql_flexible_server_database" "default" {
      name      = "${random_pet.name_prefix.id}-db"
      server_id = azurerm_postgresql_flexible_server.default.id
      collation = "en_US.utf8"
      charset   = "UTF8"
    }
    
  5. Crie um arquivo chamado variables.tf e insira o seguinte código:

    variable "name_prefix" {
      default     = "postgresqlfs"
      description = "Prefix of the resource name."
    }
    
    variable "location" {
      default     = "eastus"
      description = "Location of the resource."
    }
    
  6. Crie um arquivo chamado outputs.tf e insira o seguinte código para gerar o nome do grupo de recursos, o nome do servidor Azure PostgreSQL e o nome do banco de dados do Azure PostgreSQL:

    output "resource_group_name" {
      value = azurerm_resource_group.default.name
    }
    
    output "azurerm_postgresql_flexible_server" {
      value = azurerm_postgresql_flexible_server.default.name
    }
    
    output "postgresql_flexible_server_database_name" {
      value = azurerm_postgresql_flexible_server_database.default.name
    }
    
    output "postgresql_flexible_server_admin_password" {
      sensitive = true
      value     = azurerm_postgresql_flexible_server.default.administrator_password
    }
    

3. Inicialize o Terraform

Execute terraform init para inicializar a implantação do Terraform. Este comando baixa o provedor do Azure necessário para gerenciar seus recursos do Azure.

terraform init -upgrade

Pontos principais:

  • O -upgrade parâmetro atualiza os plug-ins de provedor necessários para a versão mais recente que está em conformidade com as restrições de versão da configuração.

4. Crie um plano de execução Terraform

Execute o plano de terraforma para criar um plano de execução.

terraform plan -out main.tfplan

Pontos principais:

  • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais.
  • O parâmetro opcional -out permite especificar um arquivo de saída para o plano. O uso do -out parâmetro garante que o plano revisado seja exatamente o que é aplicado.

5. Aplique um plano de execução Terraform

Execute terraform apply para aplicar o plano de execução à sua infraestrutura de nuvem.

terraform apply main.tfplan

Pontos principais:

  • O comando de exemplo terraform apply pressupõe que você executou terraform plan -out main.tfplananteriormente o .
  • Se você especificou um nome de arquivo diferente para o -out parâmetro, use esse mesmo nome de arquivo na chamada para terraform apply.
  • Se você não usou o -out parâmetro, ligue terraform apply sem nenhum parâmetro.

6. Verificar os resultados

Execute az postgres flexible-server db show para exibir o banco de dados PostgreSQL do Azure.

az postgres flexible-server db show --resource-group <resource_group_name> --server-name <server_name> --database-name <database_name>

Pontos principais:

  • Os valores para o <resource_group_name>, <server_name>e <database_name> são exibidos na terraform apply saída.

7. Limpar os recursos

Quando você não precisar mais dos recursos criados via Terraform, execute as seguintes etapas:

  1. Execute o plano de terraforma e especifique o destroy sinalizador.

    terraform plan -destroy -out main.destroy.tfplan
    

    Pontos principais:

    • O terraform plan comando cria um plano de execução, mas não o executa. Em vez disso, ele determina quais ações são necessárias para criar a configuração especificada em seus arquivos de configuração. Esse padrão permite que você verifique se o plano de execução corresponde às suas expectativas antes de fazer quaisquer alterações nos recursos reais.
    • O parâmetro opcional -out permite especificar um arquivo de saída para o plano. O uso do -out parâmetro garante que o plano revisado seja exatamente o que é aplicado.
  2. Execute terraform apply para aplicar o plano de execução.

    terraform apply main.destroy.tfplan
    

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximos passos