Infrastructure as Code 코드형 인프라

Infrastructure as Code (코드형 인프라)
코드형 인프라(Infrastructure as Code, IaC)는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말합니다.
IaC의 장점
인프라를 만드는 과정이 자동화되므로, 오류가 훨씬 덜 발생하고 안전합니다.
IaC는 쉽게 공유할 수 있고, 버전 관리에도 용이합니다.
코드와 현재 상태를 비교하여, 추후 인프라 상태의 변경에 따르는 위험을 분석하고 검증할 수 있습니다.
배포 과정을 소수의 시스템 관리자만 진행하는 것이 아닌, 개발자 스스로가 배포하고 인프라를 통제할 수 있는 환경으로 만들 수 있습니다.
- 재현성: IaC를 사용하면 쉽게 복제할 수 있는 인프라를 만들 수 있어 오류 및 불일치 위험을 줄일 수 있습니다.
- 버전 제어: 인프라 구성요소를 코드로 관리하고 버전 관리 시스템에 저장하며 팀 구성원이 변경사항을 검토할 수 있습니다.
- 자동화: IaC는 인프라 구축 및 구성을 자동화하여 수동 작업을 줄이고 인적 오류를 최소화합니다.
- 확장성: IaC를 사용하면 인프라 구성 요소를 확장 가능하게 배포하여 수동 확장에 필요한 시간과 노력을 줄일 수 있습니다.
- 향상된 협업: 팀은 인프라 코드에 대해 협업하여 커뮤니케이션을 개선하고 오류 위험을 줄일 수 있습니다.
- 민첩성 향상: IaC를 사용하면 비즈니스 요구사항의 변화에 보다 신속하게 대응하고 구축 속도를 높일 수 있습니다.
- 비용 절감: IaC는 수작업을 줄이고 협업을 개선하며 자동화를 가능하게 함으로써 시간과 리소스 측면에서 비용을 절감할 수 있습니다.
프로비저닝 vs. 배포 vs. 오케스트레이션
프로비저닝(provisioning)은 서버, 데이터베이스 및 네트워킹 구성요소와 같은 리소스를 특정 요구사항과 요구사항을 충족하도록 설정하고 구성하는 프로세스입니다. IT 인프라의 맥락에서 프로비저닝에는 애플리케이션과 사용자가 리소스를 사용할 수 있도록 리소스를 할당, 구성 및 관리하는 작업이 포함됩니다. 이 작업은 수동으로 수행하거나 구성 관리 소프트웨어, IaC(Infrastructure as Code) 도구 또는 클라우드 기반 프로비저닝 플랫폼과 같은 도구를 사용하여 자동화된 프로세스를 통해 수행할 수 있습니다. 프로비저닝의 목표는 필요한 리소스를 사용할 수 있고 올바르게 구성되어 애플리케이션이 원활하게 실행되고 사용자의 요구사항을 충족할 수 있도록 하는 것입니다.
배포(distribution)는 컴퓨팅에서 사용자에게 패키지화되어 배포된 운영 체제 또는 소프트웨어 패키지의 버전을 의미한다. 배포판은 일반적으로 소프트웨어 구성 요소와 도구의 특정 집합을 포함하며, 특정 사용자 그룹 또는 커뮤니티의 요구를 충족하도록 사용자 정의되는 경우가 많다.
배포 프로그램의 예로는 우분투 운영 체제가 있다. 우분투(Ubuntu)는 개인 컴퓨팅, 서버, 클라우드 컴퓨팅에 널리 사용되는 인기 있는 오픈 소스 리눅스 배포판이다. 그것은 사용자 친화적인 인터페이스와 그것의 개발과 지원에 기여하는 개발자들과 사용자들의 큰 커뮤니티로 알려져 있다.
오케스트레이션(orchestration)은 컴퓨터 시스템과 애플리케이션, 서비스의 자동화된 설정, 관리, 조정을 의미합니다. 오케스트레이션은 IT 팀이 복잡한 태스크와 워크플로우를 보다 쉽게 관리할 수 있도록 돕습니다. 일반적으로 IT 운영 및 DevOps의 맥락에서 이루어집니다. IT 인프라의 맥락에서 오케스트레이션은 서버, 데이터베이스 및 네트워크 구성요소와 같은 리소스의 프로비저닝, 확장 및 배포와 같은 작업의 자동화를 의미합니다. 조정의 목표는 복잡한 프로세스를 단순화하고 효율성을 개선하며 인적 오류의 위험을 줄이는 것입니다.
오케스트레이션은 구성 관리 소프트웨어, 코드로서의 인프라(IaC) 도구 및 클라우드 기반 오케스트레이션 플랫폼과 같은 다양한 도구와 기술을 사용하여 수행할 수 있습니다. 예를 들어, 오케스트레이션 도구를 사용하여 필요한 서버 프로비저닝, 네트워킹 구성 요소 구성, 애플리케이션 코드 배포 등 새로운 애플리케이션 배포 프로세스를 자동화할 수 있습니다.
예상치 못한 인프라의 변경에 따른 사고 (Configuration Drift)
AWS와 같은 클라우드 서비스에 여러분이 인프라 관리자로 일하고 있다고 가정해봅시다. 일반적으로 IAM을 통해 각 팀 또는 개인에게 필요한 만큼의 권한을 주고 인프라를 사용할 수 있게 할 것입니다. 그렇지만 도구를 각자의 손에 쥐어줄 경우 모두가 이를 제대로 사용하라는 법은 없기 마련입니다. 예를 들어, 프로덕션 레벨에 있는 어떤 특정한 인스턴스를 권한을 갖고 있는 누군가가 실수로 삭제해서 제품에 영향을 미칠 경우 이를 어떻게 알아내고, 어떻게 고칠 수 있을까요? 꼭 지우는 것만이 위험 요소가 아닙니다. 어떤 보안 그룹의 설정을 변경하여 시스템 전체에 영향을 미치는 경우는 또 어떨까요?
이처럼, 예상치 못한 인프라 변경에 대한 사고와 미치는 영향을 Configuration Drift 라고 부릅니다.
AWS에서는
- 잘못 설정된것을 찾기 위한 도구: AWS Config
- 바른 설정을 지정해놓고, 찾고 고칠 수 있게 만들어준다
- 사고 감지 도구: AWS CloudFormation Drift Detection
이러한 관리형 서비스 외에 보다 개발 방법에 가까운 솔루션은 다음이 있습니다.
- 정상 작동 상태를 파일로 저장: Terraform state files
Terraform의 상태 정의 파일은 인프라의 실제 상태와의 비교 대상으로서 현재 상황을 진단/점검할 수 있습니다.
Terraform을 배우기 이전에, IaC 도구의 종류를 알아보고, 왜 Terraform을 선택했는지 알아봅시다.
절차형/명령형
프로그래밍 언어를 이용해서 직접 순차적으로 인프라를 생성하도록 코드를 작성하는 방법입니다. 선언형에 비해 더 강력한 일들을 할 수 있으나, 실제 적용된 결과를 가늠하기 어렵고, 코드를 읽기에 직관적이지 않습니다. 문제를 해결하기 위해 취해야 하는 구체적인 단계를 설명하는 방법에 초점을 맞춘다.
절차형 IaC의 종류
- AWS CDK
- Pulumi
선언형 IaC
선언형 언어 JSON, YAML 등을 사용합니다. 실제 인프라가 적용된 결과(기대하는 상태)와 적용할 내용(YAML 등)이 직관적으로 매핑됩니다. 문제를 달성하는 데 필요한 특정 단계보다는 문제의 원하는 결과를 설명하는 것에 초점을 맞춘다.
선언형 IaC 종류
- CloudFormation (AWS에서만 사용가능)
- Azure Blueprint (Azure에서만 사용가능)
- Cloud Deployment Manager (GCP에서만 사용가능)
- Terraform: 어떤 클라우드 서비스에도 적용되는 범용 IaC 도구입니다.
가변적(mutable) 인프라와 불변적(immutable) 인프라의 차이는 무엇인가요?
가변 인프라는 구성 업데이트 또는 새 소프트웨어 릴리스 배포와 같이 실행 중인 환경에 변경이 적용되는 인프라입니다.
불변의 인프라는 실행 중인 환경에 대한 변경을 허용하지 않습니다. 대신 전체 환경을 원하는 변경 사항을 포함하는 새 버전으로 교체하여 원하는 변경 사항을 적용합니다.
이 둘의 차이점은 가변적인 인프라가 구성 드리프트를 일으키기 쉽다는 것입니다. 여기서 실행 환경은 시간이 지남에 따라 원하는 상태에서 멀어집니다. 반면에 불변의 인프라는 환경이 항상 알려진 상태로 일관되게 유지되도록 보장합니다. 이렇게 하면 관리가 쉬워지고 잘못된 구성이나 오래된 소프트웨어로 인해 발생하는 예기치 않은 문제의 위험이 줄어듭니다.
*멱등성 법칙 : 같은 작업을 여러 번해도 결과가 동일, 한번 설정된 서버는 서버는 수정 없이 파기되므로 멱등성
Terraform의 선언적 방식으로 작성된 코드는 항상 인프라의 최신 상태를 의미합니다. Terraform은 어떤 방식으로 인프라를 최신 상태로 유지할 수 있는 걸까요?
Terraform은 Terraform 구성 파일에 지정된 원하는 상태를 지속적으로 모니터링하고 인프라의 실제 상태와 비교하여 인프라를 최신 상태로 유지하고, 불일치가 감지되면 Terraform은 원하는 상태에 맞게 인프라를 자동으로 업데이트합니다. 이는 구성에 맞게 인프라를 업데이트하는 Terraform의 내장 "apply" 명령을 통해 달성됩니다. Terraform의 선언적 구문을 사용하여 인프라 변경사항을 쉽게 관리하고 버전화할 수 있으므로 인프라가 항상 원하는 상태에 있도록 보장합니다.
참고 레퍼런스
https://www.redhat.com/ko/topics/automation/what-is-infrastructure-as-code-iachttps://www.redhat.com/ko/topics/automation/what-is-orchestration