Data Engineering

Terraform Up & Running Ch 1

나무가 2020. 12. 27. 18:21

IaC : Infrastructure as Code

 

5가지 IaC의 큰 줄기 

1. Ad hoc scripts

2. Configuration management tools

3. Server templating tools

4. Orchestration tools

5. Provisioning tools

 

1. Ad hoc Scripts

Ad hoc : "이것을 위해" 또는 "특별한 목적을 위해서" 라는 뜻의 라틴어 ( Reference : Wikipedia  )

 

즉, 해당 작업만을 위해 생성된 스크립트를 뜻한다.

 

예로 들어, 물리 서버에 아파치를 설치하고 서비스 실행하는 코드를 bash 스크립트로 작성을 하면 해당 스크립트는 webserver.sh로 웹서버 설치 및 실행을 위한 ad-hoc 스크립트가 된다.

# webserver.sh
sudo apt-get update
sudo apt-get install -y php apache2
sudo service apache2 start

장점 : 자신에게 편한 언어로, 자신에게 편한 스타일로 작성 가능하다. ( 단점이기도 하다 ; 2. Configuration man. 참고)

단점 : 당연하게, 모든 task마다 새로운 스크립트를 작성해야 한다. 

 

2. Configuration Managment Tools

용어 자체에서 알 수 있듯이, 사용하고자 하는 소프트웨어/패키지 등을 설치 및 관리하기 위해 만들어진 툴들이다.

 

위의 webserver.sh의 예를 Ansible 로 작성한다면,

# web-server.yml
- name : Update apt-get cache
  apt :
  	update_cache : yes

- name : Install PHP
  apt :
  	name : php

- name : Install Apache
  apt :
  	name : apache2
    
- name : Start Apache
  service : name=apache2 state=started enabled=yes

와 같이 작성할 수 있다.

 

bash script와 매우 유사하지만, 차이점을 서술하자면 아래와 같다 :

 

Coding Conventions

 

    Ansible와 같은 툴들은 consistent, predictavle struccture 와 같이 특정 구조/스타일을 강요한다. 이는 결국 지속적이고 읽기 쉽고 모든 사람에게 동일하게 적용이 되므로 공유하기 용이하다.

 

Idempotence

 

    위의 bash 스크립트는 단 한 번의 실행을 위해서 작성된 스크립트이다. 만약, 이 스크립트를 여러 번 실행하면 어떻게 될까? 당연히 오류가 나올 수 있고 심하면 system failure까지 나올 수 있다. 하지만, Ansible와 같은 툴을 사용하면 몇 번을 재실행해도 상관이 없다. 알고 있겠지만, Idempotence는 여러번 동일한 작업을 반복해도 동일한 결과를 보장하는 지에 대한 용어이다.

 

Distribution

 

    Ansible을 사용하면, multiple server을 한 번에 관리(배포) 할 수 있다. 

# hosts
[webservers]
11.11.11.11
11.11.11.12
11.11.11.13
...

# playbook.yml
- hosts : webservers
  roles :
  - webserver

위의 코드/텍스트를 작성한 뒤에

ansible-playbook playbook.yml

를 적용시키면 커맨드 하나로, 여러 서버에 한 번에 배포할 수 있다.

 

ex. Chef, Puppet, Ansible, SaltStack

 

3. Sever Templating Tools

핵심 아이디어는, 필요한 정보들을(OS, software, files, relevant details, ...) 모두 포함하는 self-contained snapshot를 capture한 서버의 image를 생성하여 사용하는 것이다.

(Packer로 template를 작성하고 난 뒤에 Ansible과 같은 툴로 여러 대의 서버에 배포하는 형식으로 사용을 하기도 한다 )

 

Image를 생성하는 방식에는 크게 2가지가 존재한다.

 

1. Virtual Machine (VM)

 

    여러 많은 곳에서 찾아볼 수 있겠지만, 주어진 환경에서 "hypervisor"라는 소프트웨어를(ex. VMWare, VirtualBox, ... ) 사용하여 하드웨어를 포함한 모든 시스템을 emulate하는 방식이다.

 

장점 : host machine 및 다른 VM image들과 완전하게 독립되어(isolated) 있다 ; 보안도 보장이 된다.

단점 : 완전하게 독립적인 OS를 구성하는 것이기 때문에, CPU usage, startup time와 같은 overhead가 매우 크다.

 

2. Container

 

 

ex. Docker, Packer, Vagrant