Infrastructure as Code

CHLEE·2023년 5월 21일
0

DevOps

목록 보기
19/24

IaC란?

코드형 인프라(Infrastructure as Code), 즉 IaC는 설정을 코드로 작성하여 클라우드 인프라스트럭처의 생성/수정/삭제를 자동화하는 방법이다.

이는 서버, 데이터베이스, 네트워크, 배포 프로세스, 테스트 등 거의 모든 것을 코드로 관리할 수 있다는 의미이다. 기존에는 (하드웨어) 서버 준비, 네트워킹과 같은 운영적 측면이 물리적 영역과 대응한다. 그러나 현재와 같은 클라우드 네이티브 환경에서는, 운영적 측면이 모두 코드로 대체될 수 있다.

이는 달리 얘기하면, IaC는 인프라스트럭처의 설계도가 될 수 있다.

IaC의 장점

  • 인프라를 만드는 과정이 자동화되므로, 오류가 훨씬 덜 발생하고 안전하다.
  • IaC는 쉽게 공유할 수 있고, 버전 관리에도 용이하다.
  • 코드와 현재 상태를 비교하여, 추후 인프라 상태의 변경에 따르는 위험을 분석하고 검증할 수 있다.
  • 배포 과정을 소수의 시스템 관리자만 진행하는 것이 아닌, 개발자 스스로가 배포하고 인프라를 통제할 수 있는 환경으로 만들 수 있다.

프로비저닝 vs. 배포 vs. 오케스트레이션

프로비저닝

시스템, 데이터 및 소프트웨어로 서버를 준비하고 네트워크 작동을 준비한다. Puppet, Ansible 등과 같은 구성 관리 도구를 사용하여 서버를 프로비저닝할 수 있다. 이처럼, 클라우드 서비스를 시작하고 구성하는 것을 "프로비저닝"한다고 한다.

배포

배포는 프로비저닝된 서버를 실행하기 위해 애플리케이션 버전을 제공하는 작업이다. 배포는 AWS CodePipeline, Jenkins, Github Actions를 통해 수행할 수 있다.

오케스트레이션

오케스트레이션은 여러 시스템 또는 서비스를 조정하는 작업이다.
오케스트레이션은 마이크로서비스, 컨테이너 및 Kubernetes로 작업할 때 일반적인 용어이다. 오케스트레이션도구로는 Kubernetes, Salt, Fabric가 있다.


  • [C911] 가변적(mutable) 인프라와 불변적(immutable) 인프라의 차이는 무엇인가요?
    가변적인 인프라와 불변적인 인프라는 소프트웨어 및 하드웨어 인프라스트럭처의 관리 및 변경 방식에 차이가 있습니다. 가변적 인프라(또는 mutable infrastructure)는 인프라 구성 요소의 상태를 동적으로 변경할 수 있는 방식을 의미합니다. 이는 서버, 네트워크, 스토리지 등의 구성 요소를 직접 수정하고 업데이트할 수 있는 유연성을 제공합니다. 가변적 인프라에서는 시스템 관리자나 운영팀이 인프라의 설정을 변경하고 업데이트할 수 있으며, 이는 인프라의 상태를 실시간으로 조정할 수 있는 이점을 제공합니다. 가변적 인프라는 신속한 변경이 필요한 상황에서 유용하며, 개발 및 운영팀 간의 협업을 촉진합니다. 불변적 인프라(또는 immutable infrastructure)는 인프라 구성 요소를 변경할 수 없는 방식을 의미합니다. 이는 인프라의 상태를 한 번 설정하고 나면 수정할 수 없으며, 변경이 필요한 경우 새로운 인프라 인스턴스를 배포하는 방식으로 처리됩니다. 불변적 인프라에서는 인프라 구성을 코드로 정의하고, 이를 템플릿 또는 스크립트로 관리합니다. 즉, 변경 사항이 발생하면 이전 상태를 수정하는 대신 새로운 인프라 인스턴스를 생성하여 이전 상태와 새로운 상태 간에 전환합니다. 이를 통해 확장성, 안정성 및 재현성을 개선할 수 있습니다. 불변적 인프라는 신뢰성이 높고 오류를 예방하며, 확장성이 용이하며 일관된 환경을 유지할 수 있는 장점이 있습니다. 또한, 인프라를 코드로 정의하고 버전 관리할 수 있으므로 소프트웨어 개발과 유사한 방식으로 인프라를 관리할 수 있습니다. 그러나 변경이 필요한 경우 새로운 인프라 인스턴스를 배포해야 하므로 배포 및 롤백 절차가 필요하며, 초기 설정에 대한 추가 작업이 필요할 수 있습니다.
  • [C912] Terraform의 선언적 방식으로 작성된 코드는 항상 인프라의 최신 상태를 의미합니다. Terraform은 어떤 방식으로 인프라를 최신 상태로 유지할 수 있는 걸까요?
    Terraform은 인프라스트럭처를 선언적 방식으로 정의하여, 인프라스트럭처의 최신 상태를 유지하는 데 도움을 줍니다. Terraform은 코드로 작성된 인프라스트럭처의 선언적 정의를 읽어들여, 현재 인프라스트럭처와 비교하여 차이점을 감지하고 필요한 변경사항을 인프라스트럭처에 적용합니다. 이를 통해 Terraform은 인프라스트럭처를 항상 최신 상태로 유지할 수 있습니다. Terraform의 인프라스트럭처 관리 과정은 다음과 같습니다.
    1. 코드 작성: Terraform은 코드로 인프라스트럭처를 정의할 수 있는 HCL(HashiCorp Configuration Language) 또는 JSON 포맷을 지원합니다. 개발자는 원하는 인프라스트럭처 구성을 코드로 작성합니다.

    2. 초기화: Terraform은 코드로 작성된 인프라스트럭처를 인식하기 위해 초기화 작업이 필요합니다. 이 작업은 필요한 리소스를 생성하고 Terraform state를 생성하여 코드와 실제 인프라스트럭처 간의 매핑을 생성합니다.

    3. 계획(Plan): Terraform은 변경 내용을 적용하기 전에 먼저 변경 내용을 계획합니다. Terraform은 인프라스트럭처와 코드를 비교하여 변경된 리소스를 감지하고, 변경 내용을 계획하고 적용 전에 변경 내용을 미리 확인할 수 있도록 도와줍니다.

    4. 적용(Apply): Terraform은 변경 내용을 적용합니다. 이 과정에서 Terraform은 코드와 실제 인프라스트럭처 간의 차이점을 감지하고, 변경된 리소스를 업데이트하거나 생성하고 삭제합니다.

    5. 검증: 변경 내용을 적용한 후에는 Terraform을 사용하여 변경 내용이 제대로 적용되었는지 검증할 수 있습니다.

      Terraform은 이러한 과정을 자동화하여, 인프라스트럭처를 선언적 방식으로 관리할 수 있습니다. 코드로 작성된 인프라스트럭처 정의를 기반으로 Terraform은 인프라스트럭처의 상태를 항상 최신 상태로 유지할 수 있습니다.

profile
🤗

0개의 댓글