다음을 통해 공유


Terraform을 사용하여 PostgreSQL 유연한 서버 데이터베이스 배포

다음 Terraform 및 Terraform 공급자 버전으로 테스트된 문서:

Terraform은 클라우드 인프라의 정의, 미리 보기 및 배포를 사용합니다. Terraform을 사용하는 경우 HCL 구문를 사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure) 그리고 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후 배포되기 전에 인프라 변경을 미리 볼 수 있는 실행 계획를 만듭니다. 변경 내용을 확인 한 후에는 실행 계획을 적용하여 인프라를 배포합니다.

이 문서에서는 Terraform을 사용하여 PostgreSQL 유연한 서버 데이터베이스 를 배포하는 방법을 보여 줍니다.

이 문서에서는 다음 방법을 설명합니다.

참고 항목

이 문서의 예제 코드는 Azure Terraform GitHub 리포지토리에 있습니다.

1. 환경 구성

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

2. Terraform 코드 구현

  1. 샘플 Terraform 코드를 테스트 및 실행할 디렉터리를 만들고 현재 디렉터리로 만듭니다.

  2. providers.tf라는 파일을 만들고 다음 코드를 삽입합니다.

    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. 이름이 지정된 main.tf 파일을 만들고 다음 코드를 삽입하여 데이터베이스가 실행되는 PostgreSQL 유연한 서버를 배포합니다.

    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. 명명 postgresql-fs-db.tf 된 파일을 만들고 다음 코드를 삽입하여 데이터베이스를 인스턴스화합니다.

    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. variables.tf라는 파일을 만들고 다음 코드를 삽입합니다.

    variable "name_prefix" {
      default     = "postgresqlfs"
      description = "Prefix of the resource name."
    }
    
    variable "location" {
      default     = "eastus"
      description = "Location of the resource."
    }
    
  6. 이름을 지정 outputs.tf 한 파일을 만들고 다음 코드를 삽입하여 리소스 그룹 이름, Azure PostgreSQL 서버 이름 및 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. Terraform 초기화

terraform init를 실행하여 Terraform 배포를 초기화합니다. 이 명령은 Azure 리소스를 관리하는 데 필요한 Azure 공급자를 다운로드합니다.

terraform init -upgrade

주요 정보:

  • -upgrade 매개 변수는 필요한 공급자 플러그 인을 구성의 버전 제약 조건을 준수하는 최신 버전으로 업그레이드합니다.

4. Terraform 실행 계획 만들기

terraform plan을 실행하여 실행 계획을 만듭니다.

terraform plan -out main.tfplan

주요 정보:

  • terraform plan 명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.
  • 선택 사항인 -out 매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다. -out 매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.

5. Terraform 실행 계획 적용

terraform apply를 실행하여 실행 계획을 클라우드 인프라에 적용합니다.

terraform apply main.tfplan

주요 정보:

  • 예시 terraform apply 명령은 이전에 terraform plan -out main.tfplan를 실행했다고 가정합니다.
  • -out 매개 변수에 다른 파일 이름을 지정한 경우 terraform apply에 대한 호출에서 동일한 파일 이름을 사용합니다.
  • -out 매개 변수를 사용하지 않은 경우 매개 변수 없이 terraform apply를 호출합니다.

6. 결과 확인

az postgres flexible-server db show를 실행하여 Azure PostgreSQL 데이터베이스를 표시합니다.

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

주요 정보:

  • <resource_group_name>, <server_name><database_name>에 대한 값이 terraform apply 출력에 표시됩니다.

7. 리소스 정리

Terraform을 통해 리소스를 만들 필요가 더 이상 없으면 다음 단계를 수행합니다.

  1. terraform 플랜을 실행하고 destroy 플래그를 지정합니다.

    terraform plan -destroy -out main.destroy.tfplan
    

    주요 정보:

    • terraform plan 명령은 실행 계획을 만들지만 실행하지는 않습니다. 대신 구성 파일에 지정된 구성을 만드는 데 필요한 작업을 결정합니다. 이 패턴을 사용하면 실제 리소스를 변경하기 전에 실행 계획이 예상과 일치하는지 확인할 수 있습니다.
    • 선택 사항인 -out 매개 변수를 사용하여 계획의 출력 파일을 지정할 수 있습니다. -out 매개 변수를 사용하면 검토한 계획이 정확하게 적용됩니다.
  2. terraform apply를 실행하여 실행 계획을 적용합니다.

    terraform apply main.destroy.tfplan
    

Azure의 Terraform 문제 해결

Azure에서 Terraform을 사용할 때 일반적인 문제 해결

다음 단계