테라폼이 인프라를 최신 상태로 유지하는 방법

xgro·2022년 6월 25일
0

Terraform

목록 보기
1/10
post-thumbnail

[C912] Terraform의 선언적 방식으로 작성된 코드는 항상 인프라의 최신 상태를 의미합니다. Terraform은 어떤 방식으로 인프라를 최신 상태로 유지할 수 있는 걸까요?

📌 How does Terraform work?

테라폼은 애플리케이션 프로그래밍 인터페이스(API)를 통해 클라우드 플랫폼 및 기타 서비스에 리소스를 생성하고 관리합니다.

Provider들은 테라폼이 접근 가능한 API를 가진 사실상 모든 플랫폼이나 서비스와 함께 작동할 수 있도록 한다.

핵심 Terraform 워크플로우는 세 단계로 구성됩니다.

  • Write:
    여러 클라우드 프로바이더 및 서비스에 걸쳐 있는 리소스를 정의합니다.
    예를 들어 보안 그룹 및 로드 밸런서가 있는 VPC(Virtual Private Cloud) 네트워크의 가상 시스템에 애플리케이션을 배포하는 구성을 생성할 수 있습니다.

  • Plan:
    Terraform은 기존 인프라와 구성을 기반으로 생성, 업데이트 또는 제거할 인프라를 설명하는 실행 계획을 생성합니다.

  • Apply:
    Apply 시 Terraform은 자원 의존성과 관련하여 올바른 순서로 제안된 작업을 수행합니다.
    예를 들어 VPC의 속성을 업데이트하고 해당 VPC의 가상 시스템 수를 변경하면 Terraform이 가상 시스템을 확장하기 전에 VPC를 재생성합니다.

👉 Track your infrastructure

Terraform은 인프라를 수정하기 전에 계획을 생성하고 승인을 요청하는 메시지를 표시합니다. 실제 인프라를 state file로 추적한다.

Terraform은 상태 파일을 사용하여 사용자의 구성과 일치하도록 인프라에 대한 변경 사항을 결정합니다.

👉 State

Terraform은 관리중인 인프라 및 구성에 대한 상태를 저장한다.

Terraform에서 실제 리소스를 구성에 매핑하고 메타데이터를 추적하며 대규모 인프라의 성능을 향상시키는 데 사용됩니다.

기본적으로 terraform.tfstate라는 이름의 로컬 파일에 저장되지만 원격으로 저장할 수도 있어 팀 환경에서 더 잘 작동한다.

Terraform 상태의 주요 목적은 원격 시스템의 개체와 구성에 선언된 리소스 인스턴스 간의 바인딩을 저장하는 것입니다.

Terraform은 구성 변경에 대한 응답으로 원격 개체를 만들 때 특정 리소스 인스턴스에 대해 해당 원격 개체의 ID를 기록한 다음 향후 구성 변경에 따라 해당 개체를 업데이트하거나 삭제할 수 있습니다.

👉 Purpose of Terraform State

상태는 테라폼이 작동하기 위해 필요한 요구사항이다.

테라폼은 State 없이 작동하는 것이 가능한지, 아니면 매번 실행할 때마다 State를 사용하지 않고 클라우드 리소스만 검사하는 것이 가능한지 묻는다.

아래 보여지는 이유들로 인해 State는 필요한 요소이다.

✅ Mapping to the Real World

테라폼은 Terraform config을 실제로 매핑하기 위해 일종의 데이터베이스를 필요로 한다.

AWS와 같은 일부 제공업체의 경우, 테라폼은 이론적으로 AWS Tag와 같은 것을 사용한다

테라폼의 초기 프로토타입은 사실 state file이 존재하지 않았다. 그로인해 문제에 직면하게 되었는데, 바로 모든 리소스 및 클라우드 제공자가 태그기능을 지원하지는 않아서 발생했다.

현실에 구축하기 위해서 리소스간 매핑을 위해 테라폼은 자체적인 state structure를 이용한다.

✅ Metadata

테라폼은 리소스간의 의존성과 같은 메타데이터도 추적한다.

테라폼은 일반적으로 의존성 순서를 결정하기 위해서 config을 사용한다.

테라폼은 올바른 작동을 위해서 State 내에서 가장 최근의 종속성 집합의 복사본을 보유한다. 그로인해 config안의 하나 이상의 항목을 삭제해도 State로 부터 올바른 제거 순서를 결정 할 수 있게 된다.

리소스와 함께 가장 최근에 사용된 제공자 구성에 대한 포인터와 같은 유사한 이유로 다른 메타데이터를 저장한다.

✅ Performance

기본 매핑이외에 State의 모든 리소스에 대한 속성 값 캐시를 저장한다. 이 것은 성능 향상을 위해 수행된다.

소규모 인프라의 경우 테라폼은 공급자를 쿼리하고 모든 리소스의 최신 속성을 동기화 할 수 있다. 모든 plan과 apply에 대해서 State의 모든 리소스를 동기화 한다.

대규모 인프라의 경우 모든 리소스를 쿼리하는데 드는 비용이 크다. 이문제를 해결하기 위해서 -refresh=false-target를 많이 사용한다.

✅ Syncing

기본 구성에서 테라폼은 현재 작업중인 디렉터리의 파일에 state를 저장한다. 이것은 시작 단계에서는 사용하기 편리하지만, 팀에서 테라폼을 사용할때는 모든 구성원이 동일한 상태로 작업하여 동일한 원격 오브젝트로 작업을 적용하는것이 중요해진다.

이를 위해 테라폼은 Remote state를 사용한다. 구성원들은 state backend를 통해 원격으로 locking 하여 실수로 여러 사용자가 테라폼을 동시에 실행하는 것을 방지할 수 있으며, 각각의 테라폼 실행이 최신 업데이트된 상태로 시작되도록 적용할 수 있다.

⁉️ Remote State

Remote State는 루트 모듈에서 구성할 수 있는 백엔드 또는 Terraform Cloud에 의해 구현된다.

  • Delegation and Teamwork
    output values를 다른 config와 공유할 수 있다. 이것으로 인해 인프라를 더욱 작은 구성요소로 관리할수 있다.

    AWS의 보다 구체적인 예로서, remote state를 통해 VPC ID, 서브넷, NAT 인스턴스 ID 등을 공유하여 다른 Terraform state가 이를 사용하도록 할 수 있습니다.

  • Locking and Teamwork
    테라폼은 state locking을 사용하여 동일한 상태에 대해 테라폼의 동시 실행을 방지할 수 있다.

✅ 레퍼런스 참조

테라폼 공식 Docs
What is Terraform | Terraform by HashiCorp

Terraform 원리

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글