Infrastructure as Code
IaC (코드형 인프라) 란?
- IaC: Infrastructure as Code - 코드로 인프라 관리
- 코드(스크립트)를 작성 및 실행하여 인프라를 생성, 배포, 수정, 정리하는 것
- 서버를 물리적으로 설치하는 등의 하드웨어 측면을 포함하여 운영의 모든 측면을 소프트웨어적으로 생각하는 중대한 사고 전환을 보여줌.
- 코드형 인프라의 핵심은 서버, 데이터베이스, 네트워크, 로그 파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 것을 코드(스크립트)로 관리 가능
- 코드현 인프라 도구로는 애드혹 스크립트, 구성 관리 도구, 서버 템플릿 도구, 오케스트레이션 도구, 프로비전 도구 등이 있다.
애드혹 스크립트
- 수행할 작업을 단계별로 나누고 배시(Bash)와 같은 언어를 사용하여 각 단계를 코드로 정의하고 작성된 스크립트를 서버에서 수동으로 실행하는 것
- 코드를 직접 작성하여 매번 수동으로 맞춤 코드를 작성해야 되기 때문에 간단한 설치에 적합
- 예시
#!/bin/bash
yum install -y httpd
systemctl enabled --now httpd
echo "Hello World" > /var/www/html/index.html
구성 관리 도구(Configuration)
- 셰프(aws), 퍼핏(openstack), 앤서블, 솔트스택 등은 모두 구성 관리 도구로써 대상 서버에 소프트웨어를 설치하고 관리하도록 설계
- 서버 자체를 만들지는 않으나 여러 서버를 일괄적으로 관리하고 싶은 경우
- 파이썬과 SSH를 이용
- 배시 스크립트와 비슷해 보이나 애드혹 스크립트를 사용할 때와 다른 여러 가지 장점 존재
- 코딩 규칙
구성 관리 도구는 문서화, 파일 레이아웃, 명확하게 이름 붙여진 매개 변수, 시크릿 관리 등을 포함하는 코딩 규칙으로 일관되고, 예측 가능한 구조를 제공
- 멱등성
구성 관리 도구는 실행 횟수에 관계없이 설정 파일을 사용하여 소프트웨어가 설치되지 않았을 경우에만 설치하고 소프트웨어가 동작하지 않는 경우에만 동작 - (실행 횟수와 관계 없이 매번 동일한 결과를 볼 수 있는 가, 한번 수행한 것은 스킵)
- 분산형 구조
애드혹 스크립트는 단일 로컬 머신에서만 실행되도록 설계되어 있지만 앤서블과 같은 구성 관리 도구는 원격의 수많은 서버를 관리하기 위해 특별히 설계된 것
관리가 필요한 서버들의 IP를 정리한 hosts 파일을 생성하고 플레이북을 정의하여 실행
플레이북 - 모든 워크플로우, 표준화된 업무 프로세스, 필요한 조치, 비즈니스 목표 등을 기술한 문서
💦 서버 템플릿 도구
- 도커, 패커, 베어그런트와 같은 서버 템플릿 도구는 여러 서버를 시작하고 각각 동일한 코드를 실행하여 서버를 구성하는 기존 방식과 다르게 운영체제, 소프트웨어, 파일 및 기타 필요한 모든 내용을 포함하고 있는 스냅샷으로 ❗이미지❗를 생성하여 모든 서버에 이미지를 설치 가능
- 실행은 서버에 이미지를 배포한다고 볼 수 있다.
- 💤 구성 관리 도구와의 차이는 없는 서버를 만든다는 차이가 있다.
오케스트레이션 도구
- 서버 템플릿 도구는 VM이나 컨테이너를 생성하기에는 좋은 도구이지만 ❗ 관리 부분 ❗이 부족하기 때문에 오케스트레이션 도구가 필요
- 오케스트레이션 도구는 VM 과 컨테이너 배포, 효율적 업데이트 및 롤백, 자동 복구(치유), 자동 확장(조정), 로드 밸런싱, 서로 식별하고 통신할 수 있게 서비스 검색 기능을 제공
- 쿠버네티스를 사용하면 도커 컨테이너를 어떻게 관리할지 코드로 정의 가능
- 오케스트레이션 도구의 종류 로는 온-프레미스에서 클러스터를 구축할 수 있는 쿠버네티스, 마라톤/메소스, 도커 스웜, 노마드 등이 있으며 퍼블릭 클라우드에서는 AWS EKS, Azure AKS, GCP GKE 존재
- 구글에서 쿠버네티스를 만듬.
프로비전 도구
- 구성 관리, 서버 템플릿 및 오케스트레이션 도구가 각 서버에서 실행되는 코드를 정의한다면 테라폼, 클라우드포메이션, 오픈스택 히트와 같은 프로비전 도구는 서버 자체를 생성
- 서버 생성만 하는 것이 아니라 사실상 설정도 하고 있어서 인프라에 관한 거의 모든 부분을 프로비저닝
- 각종 플랫폼에서 API를 제공하기 때문에 테라폼이 모든 것을 관리할 수 있었다.
- 구성 관리 도구, 서버 템플릿 도구, 오케스트레이션 도구 겸의 역할을 모두 수행
IaC 장점
- 수동으로 코드를 변환하지 않아도 되므로 소프트웨어를 효율적으로 배포 가능
- 데브옵스의 일종으로 이를 도입한 조직은 배포 횟수 200배 증가 오류를 24배 빠르게 개선, 배포 시간을 2,555 배 감소
- 자급식 배포
'마법의 명령어'를 알고 있는 소수의 관리자만 프로덕션 환경에 접속하여 배포를 진행해왔습니다. 하지만 인프라를 코드로 정의하면 전체 배포 프로세스를 자동화할 수 있으며 개발자도 필요할 때마다 자체적으로 배포를 진행할 수 있습니다.
- 속도와 안정성
배포 프로세스를 자동화하면 사람이 진행하는 것보다 훨씬 빠르게 컴퓨터가 배포를 진행할 수 있습니다. 자동화된 프로세스는 일관되고 반복 가능하며 수동으로 진행했을 때 보다 오류가 적게 발생하기 때문에 더 안전
- 문서화
시스템 관리자뿐만 아니라 누구나 읽을 수 있는 소스 파일로 인프라 상태를 나타낼 수 있습니다. 즉 모든 사람이 인프라 구조를 이해하고 업무를 볼 수 있도록 해줍니다.
- 버전 관리
인프라의 변경 내용이 모두 기록된 코드형 인프라 소스 파일을 저장할 수 있으므로 버전을 쉽게 관리할 수 있습니다. 시스템에 문제가 생겼을 때 문제가 발생한 지점을 찾기가 수월합니다. 문제의 내용을 확인한 다음 문제가 없던 이전 코드로 다시 돌리면 문제가 해결됩니다.
- 유효성 검증
인프라 상태가 코드로 정의도어 있으면 코드가 변경될 때마다 검증을 수행하고 일련의 자동화된 테스트를 실행할 수 있습니다.
- 재사용성
인프라를 재사용 가능한 모듈로 패키징할 수 있으므로 모든 제품을 매번 처음부터 배포하는 대신 문서화되고 검증된 모듈로 일관되게 배포할 수 있습니다.
테라폼이란?
- What is Terraform?
- HashiCorp Terraform은 버전을 지정하고 재사용하고 공유할 수 있는 사람이 읽을 수 있는 구성파일에서 클라우드 및 온프레미스 리소스를 모두 정의할 수 있는 코드형 인프라 도구
- 일관된 워크플로를 사용하여 수명 주기 동안 모든 인프라를 프로비저닝하고 관리 가능
- 컴퓨팅, 스토리지 및 네트워킹 리소스와 같은 하위 수준 구성 요소는 물론 DNS 항목 및 SaaS 기능과 같은 상위 수준 구성 요소 관리 가능
테라폼의 동작방식
- Terraform은 API를 통해 클라우드 플랫폼 및 기타 서비스에서 리소스를 생성하고 관리
- 제공자를 통해 Terraform은 액세스 가능한 API를 통해 거의 모든 플랫폼 또는 서비스와 함께 작동 가능
- Hashi Corp와 Terraform 커뮤니티를 이미 수천가지 유형의 리소스와 서비스를 관리하기 위해 1700개 이상의 공급자를 작성했으며 이 숫자는 계속해서 증가 중
- AWS, Azure, GCP, Kubernetes, Helm, GitHub, Splunk, DataDog 등을 포함하여 Terraform Registry 에서 공개적으로 사용 가능한 모든 공급자를 찾기 가능
테라폼의 핵심 워크플로 3 단계
- 쓰기: 여러 클라우드 공급자 및 서비스에 걸쳐 있을 수 있는 리소스를 정의
- 보안그룹 및 로드 밸런서가 있는 VPC 네트워크 가상 머신에 애플리케이션을 배포하기 위한 구성을 생성
- 계획: 기존 인프라 및 구성을 기반으로 생성, 업데이트 또는 파괴할 인프라를 설명하는 실행 계획을 생성
- 적용: 승인 시 리소스 종속성을 고려하여 제안된 작업을 올바른 순서로 수행
- VPC의 속성을 업데이트하고 해당 VPC의 가상 머신 수를 변경하면 Terraform은 가상 머신을 확장하기 전에 VPC를 다시 생성
참고
앤서블 이해하기
- Ansible 은 여러 개의 서버를 효율적으로 관리할 수 있게 해주는 환경 구성 자동화 도구입니다.
- 2012년에 마이클 데한이라는 개발자가 만들어 소스코드를 공개한 오픈소스 소프트웨어, 오픈소스 업계의 큰 손인 레드헷이 인수
- 플레이북이라는 파일에 실행할 구성을 선언해 놓으면, 필요할 때 마다 자동으로 실행 시킬 수 있는 것이 가장 큰 특징
- 웹 서버의 구성과, DB 서버의 구성을 선언해 놓으면 관리자들은 필요할 때마다 그 구성대로 서버의 설정을 배포할 수 있게 해주는 것
- 기존 리눅스에서 동일한 환경을 구성하기 위해 Bash 쉘 스크립트에 패키지의 설치, 설정파일 수정 등을 나열하여 이를 실행하는 것이 일반적이다.
- IT 기술력이 진보함에 따라 인프라 환경도 기존 Data Center 에서 cloud 환경으로 변화되고 있으며, 한 명의 관리자가 관리해야 하는 서버의 숫자가 ⬆
- 클러스터에 존재하는 많은 서버들에 동시에, 동일한 환경을 배포해야하는 상황이 발생하게 되었고, Bash 쉘 스크립트의 한계점을 갖게 되었으며 이를 위해 고안된 IaC 개념
- 환경의 배포와 구성을 규격화된 코드로 정희해 사용하는 것을 의미
- 가능한 자동화 도구를 이용하여 인프라의 상태를 코드로 작성하고 이를 모든 서버에 배포함으로써 특정 환경을 동일하게 유지할 수 있도록 도움.
앤서블의 3가지 요소
- 인벤토리 : 어디서 수행할 것인가?
- 플레이북 : 무엇을 수행할 것인지?
- 모듈 : 어떻게 수행할 것인지?
인벤토리
플레이북
- 템플릿; 각 서버들을 어떻게 구축할지 정의
- 인벤토리 파일에서 정의한 대상들이 무엇을 수행할지 정의, yaml 포맷으로 설정
- 단독으로 사용되는 것이 아닌 인벤토리와 플레이북의 조합으로 같이 사용
- 예시
---
- name: nginx install
hosts: all
become: true
tasks:
- name: nginx package install
yum:
name: nginx
state: installed
모듈
- 플레이북에서 task가 어떻게 수행될지 정의하는 요소
- 타겟 호스트로 실제 작업을 처리하는 단위로 모듈이라는 개념을 사용
- Python Code 를 호출하여 실행하기 때문에 Python이 필수적으로 필요, 앤서블 설치피 다양한 모듈이 같이 설치됨.
- yum stsctl systemd copy git docker_container ... 등.
- 예를 들어 yum 명령어를 통해 패키지를 설치할 때 yum 모듈을 사용되고 위 플레이북 예시에서 yum 부분이 yum 모듈을 정의하고 이를 사용하겠다는 의미
베이그런트(가상 서버 생성 도구)
- 가상 시스템 환경을 관리하기 위한 도구
- 가상 환경 셋팅 시간을 줄이고 개발성과 생산성을 높일 수 있도록 개발 환경 이나 테스트 환경을 자동으로 설정하도록 도움
- 포터블 가상화 소프트웨어 개발환경의 생성 및 유지보수를 위한 오픈 소스 소프트웨어 제품의 하나
- 개발환경 : 개발 생산성 증가를 위해 가상화의 소프트웨어 구성 관리의 단순화를 시도하는 버추얼 박스, 하이퍼-V, 도커 컨테이너, VM웨어, AWS 등
- 루비 언어로 작성되어 있지만 생태계는 몇 가지 언어로 개발을 지원