테라폼(Terraform) 코드를 통한 인프라 관리(휴먼 에러를 줄이려면)
테라폼(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 refresh나 terraform 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 콘솔에서 리소스를 수정하거나, 예상치 못한 시스템 변동으로 인해 발생할 수 있습니다. 테라폼에서 드리프트를 감지하면, 인프라를 코드에 정의된 상태로 되돌릴 수 있도록 합니다.