IT/Terraform

테라폼(Terraform) 코드를 통한 인프라 관리(휴먼 에러를 줄이려면)

엔지니어 문 2024. 8. 15. 23:50

테라폼(Terraform)을 통해 반복 가능한 환경을 구축하고 변경 사항을 추적할 수 있습니다. 테라폼(Terraform)의 이런 기능을 통해 인프라를 관리하는 것은 매우 유용합니다. 그런데 쉽게 리소스를 관리할 수 있는 만큼 위험요소도 존재합니다. 잘못된 코드로 운영 중인 리소스가 삭제되거나 옵션변경이 반영되면서 리소스가 새롭게 대체될 수도 있습니다. 테라폼을 사용하면서 발생할 수 있는 휴먼 에러를 줄일 수 있는 방법을 정리해 보려고 합니다.

 

1. 코드 리뷰 프로세스 도입

모든 테라폼 코드는 코드 리뷰를 통해 검토되도록 합니다. 코드 리뷰를 통해 실수를 사전에 발견할 수 있으며, 여러 사람의 검토를 통해 더 안전한 인프라 구성을 보장할 수 있습니다.

 

2. 테라폼 모듈화

테라폼 모듈화를 통해 반복적으로 사용하는 리소스를 표준화하고 재사용합니다. 이를 통해 일관성을 유지하고 오류 발생 가능성을 줄일 수 있습니다.

모듈은 공통적으로 사용하는 리소스를 묶어두는 역할을 하며, 이러한 모듈들을 사용하면 일관된 환경을 유지할 수 있습니다.

 

3. 변경 사항 시뮬레이션 (Terraform Plan)

terraform plan 명령어를 사용하여 적용 전에 변경 사항을 미리 검토합니다. 이는 실제 리소스에 변경이 적용되기 전에 어떤 일이 발생할지 미리 예측할 수 있어 실수를 방지하는 데 매우 유용합니다.

plan 출력물을 철저히 검토하여 예상치 못한 변경 사항이 없는지 확인합니다.

 

4. 버전 관리 (Version Control)

테라폼 코드를 Git과 같은 버전 관리 시스템으로 관리합니다. 이를 통해 변경 사항을 추적하고, 이전 상태로 쉽게 되돌릴 수 있습니다.

각 변경 사항마다 커밋 메시지에 명확한 설명을 추가하여 어떤 변경이 있었는지 기록을 남깁니다.

 

5. 자동화된 테스트

terraform validate와 같은 명령어를 사용하여 코드를 배포하기 전에 문법 오류와 같은 문제를 자동으로 검토합니다.

테라폼 코드에 대한 테스트를 자동화하여 실수를 미리 잡아낼 수 있도록 합니다. 예를 들어, Terratest와 같은 도구를 사용하여 인프라의 특정 부분이 예상대로 동작하는지 확인할 수 있습니다.

 

6. 변경 관리 정책 적용

인프라 변경 시 사전 승인을 받는 정책을 적용합니다. 이는 중요한 인프라 변경이 단독으로 이루어지는 것을 방지하고, 휴먼 에러를 줄이는 데 도움이 됩니다.

PR(풀 리퀘스트) 기반으로 테라폼 코드를 관리하여, 다른 팀원이 코드 변경을 검토하고 승인할 수 있도록 합니다.

 

7. 역할 기반 접근 제어 (*RBAC)

AWS IAM과 테라폼을 연동하여 필요한 권한만 부여받도록 설정합니다. 이를 통해 실수로 중요한 리소스에 접근하여 변경하는 것을 방지할 수 있습니다.

 

8. 상태 파일 관리

테라폼의 상태 파일(tfstate)을 안전하게 관리합니다. S3와 같은 중앙 집중식 저장소에 저장하고, 버전 관리를 적용하여 변경 사항을 추적할 수 있도록 합니다.

상태 파일에 대한 접근 권한을 엄격하게 제한하여, 의도치 않은 수정이 발생하지 않도록 합니다.

 

9. *드리프트 감지 및 관리

terraform refreshterraform plan을 주기적으로 실행하여 인프라의 실제 상태와 코드 간의 차이(드리프트)를 감지합니다. 이를 통해 의도하지 않은 변경을 감지하고 수정할 수 있습니다.

 

10. Lifecycle Rule을 활용한 삭제 방지

Terraform의 lifecycle 블록을 사용하여 리소스의 삭제를 방지할 수 있습니다. 삭제되면 문제가 발생할 인프라 리소스는 방어 코드를 통해 destory를 방지한다.

resource "리소스" "example" {

...

  // Lifecycle block to prevent deletion
  lifecycle {
    prevent_destroy = true
  }
}

 

용어정리

*RBAC (Role-Based Access Control): RBAC는 역할 기반 접근 제어를 의미하며, 사용자 또는 시스템이 특정 리소스에 접근할 수 있는 권한을 역할(Role)에 따라 할당하는 접근 제어 방법입니다. AWS에서는 IAM(Role)을 사용해 특정 작업에 필요한 최소한의 권한만 부여하여 보안을 강화하고, 실수로 중요한 리소스에 접근하는 것을 방지할 수 있습니다.

*드리프트(Drift): 드리프트는 인프라 관리에서 코드로 정의된 상태와 실제 클라우드 환경의 상태가 불일치하는 상황을 의미합니다. 이는 사람이 직접 AWS 콘솔에서 리소스를 수정하거나, 예상치 못한 시스템 변동으로 인해 발생할 수 있습니다. 테라폼에서 드리프트를 감지하면, 인프라를 코드에 정의된 상태로 되돌릴 수 있도록 합니다.