인프라를 수동으로 프로비저닝하고 관리하는 것은 복잡하고 오류가 발생하기 쉬운 프로세스일 수 있습니다. 다행히도, 인프라스트럭처를 코드(IaC)로 사용하여 인프라 관리를 간소화하기 위해 Terraform과 같은 도구가 등장했습니다.
그러나 Terraform의 잠재력을 최대한 활용하려면 Terraform의 상태를 이해하는 것이 중요합니다. 이 상태는 일관된 인프라 구성을 보장하고 팀 간 효과적인 협업을 지원하는 데 중요한 역할을 합니다.
이 글에서는 Terraform의 상태, 중요도 및 상태 파일을 효과적으로 관리 및 조작하는 방법에 대해 알아봅니다.
Terraform State란?
Terraform 상태는 Terraform 기능의 중요한 구성 요소입니다. Terraform을 사용하여 관리하는 인프라에 대한 지속적인 기록으로 기능하며, 기본적으로 구성 파일(.tf)에 정의된 리소스와 실제 리소스 간의 맵입니다.
Terraform State의 운영 방식
Terraform은 기본적으로 terraform.tfstate라는 이름의 파일에 주 정보를 저장합니다. 이 파일은 terraform apply 명령을 실행할 때마다 자동으로 업데이트됩니다. 프로세스의 세부 사항은 다음과 같습니다.
- 현재 상태 캡처: 테라폼이 적용되는 동안, Terraform은 인프라를 읽고 리소스 속성 및 구성을 포함한 현재 상태를 캡처합니다.
- 상태 비교: Terraform은 캡처된 상태를 Terraform 구성 파일에 정의된 원하는 상태와 비교합니다.
- 변경 사항 확인: Terraform은 이전 단계의 비교를 기반으로 원하는 상태와 현재 상태 간의 불일치를 식별합니다.
- 업데이트 적용: 차이가 있는 경우, Terraform은 인프라가 정의된 구성과 정렬되도록 필요한 업데이트를 적용합니다.
Terraform State 사용의 이점 및 중요성
안정적 인프라 관리를 위해서는 일관되고 정확한 Terraform 상태를 유지하는 것이 필수적입니다. 그 이유는 다음과 같습니다.
- 감소된 구성 드리프트: 시간이 지남에 따라 인프라 구성은 수동 변경이나 외부 요인으로 인해 의도한 상태에서 벗어날 수 있습니다. Terraform의 최신 상태는 인프라의 실제 구성을 반영하는 단일 정보원 역할을 합니다.
- 안정적인 계획 및 실행: Terraform은 인프라 변경을 계획하고 적용하기 위해 주 파일에 의존합니다. 정확한 상태는 Terraform이 기존 인프라를 명확하게 파악할 수 있도록 합니다. 이를 통해 보다 안정적인 실행 계획을 수립하고 변경 사항 적용 시 오류를 방지할 수 있습니다.
- 팀 협업: Terraform State는 인프라 프로젝트에서 협업을 촉진합니다. HashiCorp Cloud Terraform Registry 또는 클라우드 스토리지 서비스와 같은 원격 백엔드와 같은 중앙 위치에 상태 파일을 저장하면 여러 팀원이 동일한 인프라 구성에서 동시에 작업하여 중앙 인프라 관리를 촉진할 수 있습니다.
- 대규모 인프라를 위한 확장성: 인프라의 복잡성이 증가함에 따라 Terraform 상태를 로컬로 관리하는 것은 번거로울 수 있습니다. 원격 백엔드에 상태를 저장하면 Terraform을 보다 효과적으로 확장할 수 있습니다. 원격 백엔드는 버전 제어 및 액세스 제어와 같은 기능을 제공하므로 대규모 및 지리적으로 분산된 인프라의 상태를 보다 쉽게 관리할 수 있습니다.
- 향상된 리소스 추적: Terraform 상태는 프로비저닝된 모든 리소스와 구성에 대한 세부 기록을 유지합니다. 이 포괄적인 로그를 통해 인프라를 훨씬 더 쉽게 관리하고 업데이트할 수 있습니다. 수백 개의 리소스와 구성을 수동으로 추적하는 것이 얼마나 어려운지 상상해 보세요. Terraform 상태는 모든 인프라 세부 정보를 위한 중앙 저장소를 제공하여 이러한 부담을 제거합니다.
- 효율적인 변경 감지: Terraform 상태를 통해 Terraform은 인프라의 변화를 지능적으로 감지할 수 있습니다. 테라폼 적용 을 실행하면 원하는 상태를 기록된 상태와 비교하고 실제로 변경된 리소스에만 업데이트를 적용합니다. 이를 통해 시간을 절약하고 인프라의 불필요한 수정을 피할 수 있습니다.
- 간소화된 의존성 관리: Terraform 상태는 리소스 간의 종속성을 추적합니다. 리소스가 생성되거나 업데이트되는 순서가 때때로 중요하기 때문에 이는 매우 중요합니다. 예를 들어, 웹 서버는 먼저 생성되는 데이터베이스에 따라 달라질 수 있습니다. Terraform 상태는 이러한 종속성을 고려하여 업데이트가 올바른 순서로 적용되도록 합니다.
Terraform 상태 관리
Terraform은 상태 파일을 저장할 수 있는 유연성을 제공합니다. 개발자의 컴퓨터에서 로컬 스토리지를 선택하거나 원격 백엔드를 활용하여 협업 및 확장성을 높일 수 있습니다.
- 로컬 백엔드: 로컬 백엔드는 기본 옵션이며 추가 구성이 필요하지 않습니다. 상태 파일은 로컬 파일 시스템에 저장되며, 일반적으로 작업 디렉토리에 terraform.tfstate로 명명됩니다. 이러한 접근 방식은 사용이 간편하며 소규모의 개인 프로젝트나 개인 개발에 적합합니다. 그러나 협업이나 대규모 인프라에는 적합하지 않습니다.
- 원격 백엔드: 원격 백엔드는 중앙 위치에 상태 파일을 저장하며, Amazon S3, Google Cloud Storage 또는 Azure Blob Storage와 같은 클라우드 스토리지 서비스도 제공합니다. 원격 백엔드를 사용하면 여러 팀원이 인프라 구성에 동시에 액세스하고 수정할 수 있습니다. 이는 대규모의 지리적으로 분산된 인프라에 적합하며, 버전 관리 및 재해 복구와 같은 기능을 제공합니다.
Terraform 상태 구성
특정 구성 단계는 선택한 원격 백엔드 제공업체에 따라 다릅니다. 다음은 AWS S3를 원격 백엔드로 사용하도록 Terraform을 구성하는 예입니다.
# Configure Terraform to use S3 as the remote backend
terraform {
backend "s3" {
bucket = "my-terraform-state" # Name of the S3 bucket to store the state file
key = "path/to/my/statefile" # Path within the bucket to store the state file
region = "us-west-2" # AWS region where the S3 bucket is located
}
}
상태 파일 정리 및 버전 관리를 위한 모범 사례
쉽게 관리 가능한 상태 파일을 유지하려면 다음 모범 사례를 고려하십시오.
- 세분화: 상태 파일을 환경(예: 개발, 스테이징, 프로덕션) 또는 프로젝트로 나누면 여러 환경 또는 프로젝트에서 작업할 때 조직을 유지하고 충돌을 방지하는 데 도움이 됩니다. 예를 들어, 개발 및 프로덕션 환경을 위해 terraform.tfstate.dev 및 terraform.tfstate.prod라는 별도의 주 파일을 고려하십시오.
- 버전 관리 시스템(VCS)을 통한 버전 관리: Git과 같은 버전 제어 시스템을 사용하면 시간이 지남에 따라 상태 파일의 변경 사항을 추적할 수 있습니다. 이를 통해 필요한 경우 이전 구성으로 롤백할 수 있으며, 변경 사항에 대한 감사 추적을 제공하여 협업을 용이하게 합니다.
- 암호화: 특히 원격 백엔드를 사용할 때 상태 파일을 암호화하면 무단 액세스 시 액세스 키 또는 암호와 같은 민감한 정보를 보호할 수 있습니다. 대부분의 클라우드 스토리지 제공업체는 저장 데이터 대해 서버 측 암호화를 제공합니다. 또한 클라이언트 측 암호화 툴을 탐색하여 상태 파일을 원격 백엔드로 업로드하기 전에 암호화할 수 있습니다.
Terraform 상태 조작
Terraform은 Terraform 상태와 상호 작용하기 위한 강력한 명령을 제공합니다. 이러한 명령을 통해 기존 인프라를 관리하고, 상태 파일을 재편성하여 유지보수를 개선하고, Terraform의 제어에서 리소스를 제거할 수 있습니다.
다음은 일반적으로 사용되는 몇 가지 Terraform 상태 명령입니다.
- 테라폼 가져오기: 이 명령은 Terraform의 관리 하에 기존 인프라 요소(리소스)를 통합하는 데 매우 중요합니다. Terraform은 클라우드 환경에 이미 존재하는 물리적 리소스를 인식하고 추적해야 합니다. 이는 기존 인프라를 Terraform으로 마이그레이션하거나 초기에 Terraform 외부에서 생성된 리소스를 관리하는 데 유용합니다.
- 테라폼 주: 이 코어 명령은 상태 파일을 조작하기 위한 다양한 하위 명령을 제공합니다. 그 중 일부는 다음과 같습니다.
- 테라폼 주 목록: 현재 상태 파일에서 추적된 모든 리소스를 나열합니다. 이는 Terraform이 관리하는 리소스에 대한 개요를 확인하는 데 도움이 됩니다.
- 테라폼 주 목록: 현재 상태 파일에서 추적된 모든 리소스를 나열합니다. 이는 Terraform이 관리하는 리소스에 대한 개요를 확인하는 데 도움이 됩니다.
- 테라폼 주 목록: 현재 상태 파일에서 추적된 모든 리소스를 나열합니다. 이는 Terraform이 관리하는 리소스에 대한 개요를 확인하는 데 도움이 됩니다.
- 테라폼 주 쇼: <resource_name> 특성 및 구성을 포함하여 상태 파일에 저장된 특정 리소스에 대한 세부 정보를 표시합니다.
- 테라폼 국가 rm <resource_name>: 상태 파일에서 리소스를 제거합니다. 이는 클라우드의 실제 인프라 리소스를 파괴하지 않으며, Terraform의 관리에서만 제거됩니다.
국가 조작을 위한 일반적인 시나리오
다음은 Terraform 상태를 조작해야 하는 몇 가지 실제 시나리오와 이를 달성하기 위한 몇 가지 샘플 명령입니다.
- 기존 리소스 추가: 테라폼 가져오기를 사용하여 기존 인프라 리소스를 테라폼의 통제 하에 도입하세요. 이는 기존 인프라를 Terraform으로 마이그레이션하거나 초기에 Terraform 외부에서 프로비저닝된 리소스를 관리할 때 특히 유용합니다. 예를 들어, 다음 명령은 ID i-1234567890abcdef0의 기존 AWS EC2 인스턴스를 Terraform으로 가져와 논리적 이름 예제를 할당합니다.
terraform import aws_instance.example i-1234567890abcdef0
- 리소스 이동: 더 나은 유지보수를 위해 테라폼 상태 mv를 사용하여 상태 파일을 재구성하세요. 모듈 내에서 관련 리소스를 그룹화하거나 상태 파일의 전체 구조를 개선하려는 경우 도움이 될 수 있습니다. 예를 들어, 다음 명령은 aws_instance.example 리소스를 new_module이라는 새 모듈로 이동합니다.
terraform state mv aws_instance.example
module.new_module.aws_instance.example
리소스 제거: 테라폼 상태 rm을 사용하면 클라우드의 실제 리소스를 파괴하지 않고 테라폼 관리에서 리소스를 제거할 수 있습니다. 이는 Terraform을 통한 리소스 관리를 중단하지만 클라우드 환경에서 리소스 자체를 보존하려는 경우에 유용합니다.
결론
Terraform 상태는 Terraform 인프라 관리 역량의 기본 구성 요소입니다. Terraform의 상태를 이해하고 효과적으로 관리함으로써, 일관적이고 안정적이며 확장 가능한 인프라를 보장할 수 있습니다. 로컬 백엔드든 원격 백엔드든 상관없이, 퓨어스토리지의 Portworx® 퓨어스토리지 는 Kubernetes를 사용하는 컨테이너 워크로드를 위한 최고의 영구 스토리지 솔루션을 제공합니다. Terraform 구성에서 이를 활용하면 Terraform 상태 파일의 변경과 관계없이 데이터를 항상 저장할 수 있습니다.