Share via


Azure Storage에 Terraform 상태 저장

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

Terraform 상태는 배포된 리소스를 Terraform 구성과 조정하는 데 사용됩니다. 상태를 통해 Terraform은 추가, 업데이트 또는 삭제할 Azure 리소스를 알 수 있습니다.

기본적으로 Terraform 상태는 로컬로 저장되므로 다음과 같은 이유로 이상적이지 않습니다.

  • 로컬 상태는 팀 또는 협업 환경에서 잘 작동하지 않습니다.
  • Terraform 상태에는 중요한 정보가 포함될 수 있습니다.
  • 상태를 로컬로 저장하면 실수로 삭제할 가능성이 높아질 수 있습니다.

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

  • Azure Storage 계정 만들기
  • Azure Storage를 사용하여 원격 Terraform 상태를 저장합니다.
  • 상태 잠금 이해
  • 미사용 암호화 이해

1. 환경 구성

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

2. 원격 상태 스토리지 계정 구성

Azure Storage를 백 엔드로 사용하려면 먼저 스토리지 계정을 만들어야 합니다.

다음 명령 또는 구성을 실행하여 Azure Storage 계정 및 컨테이너를 만듭니다.

#!/bin/bash

RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate

# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location eastus

# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob

# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME

주요 정보:

  • Azure 스토리지 계정에는 전체적으로 고유한 이름이 필요합니다. 스토리지 계정 이름 문제 해결에 대한 자세한 내용은 스토리지 계정 이름에 대한 오류 해결을 참조 하세요.
  • Terraform 상태는 일반 텍스트로 저장되며 비밀을 포함할 수 있습니다. 상태가 잘못 보호되면 시스템에 대한 무단 액세스 및 데이터 손실이 발생할 수 있습니다.
  • 이 예제에서 Terraform은 액세스 키를 사용하여 Azure Storage 계정에 인증합니다. 프로덕션 배포에서는 azurerm 백 엔드에서 지원하는 사용 가능한 인증 옵션을 평가하고 사용 사례에 가장 안전한 옵션을 사용하는 것이 좋습니다.
  • 이 예제에서는 이 Azure Storage 계정에 대한 공용 네트워크 액세스가 허용됩니다. 프로덕션 배포에서는 스토리지 방화벽, 서비스 엔드포인트 또는 프라이빗 엔드포인트사용하여 이 스토리지 계정에 대한 액세스를 제한하는 것이 좋습니다.

3. Terraform 백 엔드 상태 구성

백 엔드 상태를 구성하려면 다음 Azure Storage 정보가 필요합니다.

  • storage_account_name: Azure Storage 계정의 이름입니다.
  • container_name: Blob 컨테이너의 이름입니다.
  • key: 만들 상태 저장소 파일의 이름입니다.
  • access_key: 스토리지 액세스 키입니다.

이러한 각 값은 Terraform 구성 파일 또는 명령줄에서 지정할 수 있습니다. 값에 환경 변수 access_key 를 사용하는 것이 좋습니다. 환경 변수를 사용하면 키가 디스크에 기록되지 않습니다.

다음 명령을 실행하여 스토리지 액세스 키를 가져와서 환경 변수로 저장합니다.

ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY

주요 정보:

  • Azure Storage 계정 액세스 키를 추가로 보호하려면 Azure Key Vault에 저장합니다. 그런 다음 다음과 유사한 명령을 사용하여 환경 변수를 설정할 수 있습니다. Azure Key Vault에 대한 자세한 내용은 Azure Key Vault 설명서를 참조하세요.

    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
    

구성 블록을 사용하여 Terraform 구성을 backend 만듭니다.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
  backend "azurerm" {
      resource_group_name  = "tfstate"
      storage_account_name = "<storage_account_name>"
      container_name       = "tfstate"
      key                  = "terraform.tfstate"
  }

}

provider "azurerm" {
  features {}
}

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

Azure Storage 계정의 이름으로 바꿉 <storage_account_name> 니다.

다음 명령을 실행하여 구성을 초기화합니다.

terraform init

다음 명령을 실행하여 구성을 실행합니다.

terraform apply

이제 Azure Storage Blob에서 상태 파일을 찾을 수 있습니다.

4. 상태 잠금 이해

Azure Storage Blob은 상태를 기록하는 작업 전에 자동으로 잠깁니다. 이 패턴은 손상을 일으킬 수 있는 동시 상태 작업을 방지합니다.

자세한 내용은 Terraform 설명서의 상태 잠금을 참조하세요.

Azure Portal 또는 기타 Azure 관리 도구를 통해 Blob을 검토할 때는 잠겨져 있습니다.

Azure blob with lock

5. 미사용 암호화 이해

Azure Blob에 저장된 데이터는 유지되기 전에 암호화됩니다. 필요한 경우 Terraform은 백 엔드에서 상태를 검색하고 로컬 메모리에 저장합니다. 이 패턴을 사용하는 경우 상태는 로컬 디스크에 기록되지 않습니다.

Azure Storage 암호화에 대한 자세한 내용은 미사용 데이터에 대한 Azure Storage 서비스 암호화를 참조 하세요.

Azure의 Terraform 문제 해결

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

다음 단계