2022년 1월 25일 화요일

Infrastructure as Code – Part 2. Terraform 도입 시 고려사항

앞서 Infrastructure as Code – Part 1. IaC 소개 편에서 다룬 다양한 IaC (Infrastructure as Code) 서비스 중 하나인 Terraform 을 사용하여 Cloud Service 환경에 도입 시 고려사항이 무엇인지 생각해보고자 한다.

Terraform 을 사용하기 위해 몇가지 관련 용어와 개념에 대한 이해가 필요하다. 먼저, Terraform 은 HCL (Hashicorp Configuration Lanaguage) 이라는 Code로 구성되는데 이는 흔히 접할 수 있는 JSON 의 형태와 비슷하다. HCL 을 기반으로 작성된 Script Code 를 살펴보면 Compute Instance, Network, Storage 등 각각의 요소를 Terraform 에서는 Resource 로 분류하고 있으며, 이를 사용자의 관리 단위에 맞춰 Module 로 Group화 하거나 또는 Workspace 로 구분지어 관리한다.

Hashicorp 와 Cloud Service Provider 가 협업하여 제공하는 Provider Plugin 을 사용하여 사용자의 환경에서 (예: Oracle OCI) 작성된 Script Code가 작동 가능한 지 검증하고 API를 호출하여 실제 작업을 수행한다. Code 는 각 요소의 역할에 대해 provider, variable, resource, module 등의 keyword와 이름을 지정하여 작성하도록 되어 있다.

작성된 Code 에 대해 사용자는 의존성을 고려할 필요가 없다. Provider 가 알아서 각 코드 간의 의존성에 따른 실행 순서를 정하기 때문이다. 사용자는 향후 관리를 용이하게 할 수 있도록 일련의 기준 (예: 프로젝트 단위 또는 Resource 의 종류별) 에 따라 Workspace 또는 Module 로 구분하여 Code 구성 및 관리해야 한다.

또한 작성된 Code는 재사용이 가능하여 언제든 동일한 구성의 환경을 여러벌 생성할 수 있어 운영환경과 동일한 구성의 테스트 환경을 구성해야 하는 등의 요건에 대해 빠르게 대응할 수 있다. 또한 대규모 환경을 구성해야할 때 Cloud Web Console 에서 모든 Resource 에 대해 수작업으로 생성 및 관리하는 대신, 동일 역할하는 Resource 에 대해 수량을 지정하는 count 변수를 사용하는 등 간단한 Code 작성으로 대규모 환경 구성에 대한 대응이 가능하다. 더불어 사용이 끝난 Resource 에 대해서는 Terraform Destroy 라는 명령어 하나로 Termination 시킴으로써 간결한 Resource 관리가 가능하며 주로 구독 형태로 이용되는 Cloud 환경에서는 불필요한 Credit 소진 또한 지양할 수 있다.

작성된 Code를 대상 환경에 적용하는 Terraform Apply 작업이 정상 수행 및 완료가 되면 Terraform은 .tfstate 라는 실제 Cloud Service에 구성된 Resource의 상태 정보를 담고 있는 파일을 생성하며 Terraform 을 통한 Resource 변경 작업이 발생할 때 마다 .tfstate 를 update 하며 실제 Resource 와의 Sync를 유지 및 관리한다.

이 때 .tfstate는 일반적으로 Terraform 작업을 수행하는 Local Machine 에 저장되는데 1인 사용자가 이용 시엔 문제가 없겠으나, 프로젝트를 위해 팀원들과 함께 작업하는 경우엔 각자의 Machine 에 작업한 .tfstate 가 각각 생성되면서 여러 상태 정보의 혼재로 Resource 가 의도치 않게 삭제 되거나 변경 되는 등의 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해 Terraform 에서는 Remote State 기능을 지원하여 하나의 .tfstate를 원격 저장소에 보관하여 프로젝트 단위별 한 개의 .tfstate를 기반으로 작업할 수 있다.

이 밖에 고려할 점은 첫번째, 기존에 Terraform 으로 관리되고 있지 않던 환경에 대해 Terraform 을 도입할 때, 어떻게 기존 환경에 대한 정보를 HCL Code 로 변환할 것인가 이다. 어떤 Cloud Service 에서는 기존 구성된 환경을 Terraform Script (.tf) 로 export 하는 기능을 지원하는데, 이렇게 export 를 해서 생성된 .tf 의 경우 Cloud Service 에서 지정하는 자체 단위별로 (예: core service – compute, storage, network , data service – database, data analytics) .tf 가 생성된다는 점이다. 이를 그대로 사용할 수도 있지만, t사용자가 원하는 관리 단위가 따로 있다면 이에 맞는 재구성이 필요하다. (Export 기능이 없는 Cloud Service 를 사용중이라면, 전체 수작업이 수반되어야 한다)

두번째로는, Terraform 으로 구성하여 상태정보 Sync 를 맞춰 사용 중인 환경에서 의도치 않게 Sync가 깨지는 경우이다. 예를 들면, Terraform 으로 Resource 에 대한 Update 를 진행하지 않고 Cloud Web Console 을 통해 수동으로 작업하는 경우이다. 변경분이 복잡하면 복잡할수록 다시 Sync 를 맞추는데 드는 수고가 크다.

마지막으로, 사용하려는 Cloud Service 에서 제공하는 각 Service 에 대한 이해가 필요하다. 각 Service 에서 지원되는 기능이 무엇인지 해당 기능을 사용하는데 필수적으로 설정되어야 하는 정보는 무엇인지 등에 대해 익숙하면 훨씬 수월하게 Terraform Code를 작성할 수 있다.

    Related Posts

    클라우드 환경에서의 데이터베이스 가용성
    Cloud 환경에서의 효율적인 보안 및 인증 관리
    Service Mesh 에서의 Control Plane, Consul

    Leave a Reply