다음을 통해 공유


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을 사용할 때 일반적인 문제 해결

다음 단계