IaC

Terraform - Azure(2)

Operation CWAL 2022. 3. 13. 00:32

Terraform을 통해 생성된 리소스의 상태(Terraform State)는 'terraform.tfstate' 라는 파일에 의해 관리된다. 이 파일이 저장되는 곳을 Terraform Backend라고 하는데, 기본적으로 terraform 명령어를 실행한 Local directory에 저장한다. 다만 설정을 통해 클라우드에 위치한 별도의 Storage(ex: AWS S3, Azure Storage Account)를 사용할 수 있다. 이 경우, Terraform을 실행하는 위치(개발자 Local PC, Bastion Host, Jenkins 등)와 관계없이 다양한 곳에서 항상 동일한 결과를 얻을 수 있다.

 

이번 시간엔 Azure에 Terraform Backend를 만들고, 이를 활용하는 방법에 대해서 설명한다.

 

Terraform Backend 생성

 

1. Storage Account 생성

Terraform Backend로 사용할 Storage Account 역시 Terraform으로 생성할 수 있다. 우선 아래와 같이 backend/main.tf를 작성한다.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.46.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "random_string" "resource_code" {
  length  = 5
  special = false
  upper   = false
}

resource "azurerm_resource_group" "tfstate" {
  name     = "tfstate"
  location = "koreacentral"
}

resource "azurerm_storage_account" "tfstate" {
  name                     = "tfstate${random_string.resource_code.result}"
  resource_group_name      = azurerm_resource_group.tfstate.name
  location                 = azurerm_resource_group.tfstate.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
  allow_blob_public_access = true

  tags = {
    environment = "staging"
  }
}

resource "azurerm_storage_container" "tfstate" {
  name                  = "tfstate"
  storage_account_name  = azurerm_storage_account.tfstate.name
  container_access_type = "blob"
}

 

구성 자체는 간단하다. koreacentral region에 tfstate라는 Resource Group을 만들고, 그 안에 tfstate<길이 5의 random 문자열>로 이름을 붙인 Storage Account를 생성한다. 스펙은 Stanard tier에 LRS 복제 방식을 사용하며, Public Access를 허용한다. 그리고 해당 Storage Account 안에 blob 저장을 위한 container인 tfstate를 추가한다.

 

이제 terraform init, plan, apply를 순서대로 실행한다.

실제로 생성이 되었는지 Azure Portal을 통해 확인해보자.

main.tf 파일에 정의한대로 Storage Account가 생성된 것을 알 수 있다.

 

테스트

아래와 같이 demo-rg2/main.tf 파일을 작성하고 terraform init, plan, apply를 순서대로 실행한다.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.46.0"
    }
  }
    backend "azurerm" {
        resource_group_name  = "tfstate"
        storage_account_name = "<storage account 이름>"
        container_name       = "tfstate"
        key                  = "terraform.tfstate"
    }

}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "state-demo-secure" {
  name     = "state-demo"
  location = "koreacentral"
}

<storage account 이름>은 이전에 생성한 Storage Account의 이름을 입력한다.

state-demo라는 Resource Group은 정상적으로 생성되었다. 그렇다면 terraofrm.tfstate 파일이 실제로 Storage Account 안에 존재하는지 확인해보자.

지금은 Container의 이름을 tfstate로 짓긴 했지만, 실제로는 인프라를 구분할 수 있는 이름으로 Container를 생성할 필요가 있다.

 

그리고 Storage Account는 과금이 발생하기 때문에, 계속 사용하지 않는다면 terraform destroy 명령어로 삭제하자.

 

참고

Store Terraform state in Azure Storage

'IaC' 카테고리의 다른 글

Terraform - Kubernetes 연동  (0) 2022.06.05
Terraform - Azure(3)  (0) 2022.03.14
Terraform - Azure(1)  (0) 2022.03.11
Terraform - (7) Advanced  (1) 2021.06.19
Terraform - (6) IAM  (0) 2021.06.18