PART 1 기초
PART 2 패턴
PART 3 관례
평소에 인프라에 대한 생각이 별로 없었지만, IT개발자로서 다양한 책을 읽어보자는 목표와 더불어 좋은 기회가 되어서 읽게 된 책.
일단 서론 부분이 마음에 들었다.
독자 대상, 현재 관리의 문제점, 정의, 목표, 구성.
앞쪽에서 분류가 잘 되어 있으니, 당연히 읽기 쉬울거라 생각했는데 이게 왠걸.
갈 수록 어렵다.
어려운데, 쉬운것 같기도 하고,
개발자에게 필요없을 것 같은데, 필요하는 느낌이 들었다.
기본적으로 구성이 잘 되어 있어서 한번 쓱~ 읽고 아~ 이게 인프라구나, 이렇게 관리를 했었고, 코드로서는 이렇게 관리할 수 있구나를 알 수 있었다.
나름 입문하려는 사람에게는 도움이 될 것 같은데, 현재 협업에서 일하는 사람들에게는 적용하기 조금 어렵지 않을까라는 생각이 든다.
아무래도 클라우드와 관련이 되다보니, 회사 전반적으로 지원해주지 않으면 적용하기 어렵다는 점과 혼자서는 절대로 할 수 없을 것 같다.
그래도 읽어보기에는 좋은 책인 것 같다.
#독자대상 IT 인프라 운영현장에서 일하는 사람, 시스템 관리자, 인프라 엔지니어, 프로젝트 리더, 아키텍트 등 IT 인프라를 관리, 개발, 운영하는 사람들을 대상으로 효율적으로 협업하는 방법을 제시하는 책이다.
저자는 여러팀이 사용하고 있는 기법 및 패턴을 소개하고,
IT인프라를 관리하는 방법을 현실적인 시각에서 제공했으면 해서 책을 출판하게 되었다고 한다.
책은 시스템 관리자가 자동으로 플랫폼을 통제하는 ‘코드로서의 인프라’를 세 부분으로 나눠어 구성되었다.
1부에서는 인프라 요소를 만들고 구성하는 데 필요한 플랫폼과 도구 설명,
2부에서는 플랫폼과 도구를 사용하는 4가지 패턴을 소개 및 설명.
3부에서는 실제로 코드로 인프라를 관리할 수 있도록 인프라를 구성하는 방법 에 대해서 작성되어 있다.
현재 관리의 문제점
#클라우드와 #자동화도구를 채택하기만 해도 장벽을 낮출 수 있지만,
도구들을 시스템, 관습, 절차에 적용할 수 있을까를 고민하게 된다.
낡은 관리 절차를 준수하기를 강요하는 조직은 경쟁자들에게 뒤쳐지는 모습을 보게 된다.
그래서 클라우드와 자동화 도구등 변화하는 시스템에 맞춰 대처해야 한다.
그것이 코드로서 인프라를 관리하는 것이다.
정의
코드로서의 인프라는 소프트웨어 개발 관례에 기반을 둔 인프라 자동화 방법으로 시스템 구성을 하고 변경하기 위한 일관되고 반복 가능한 절차에 중점을 두고, 변경은 철저한 검증을 포함한 무인 절차를 통해서 시스템에 적용된다.
목표
- IT 인프라가 변경의 장애물이 되는 것이 아니라, 변경을 지원하고 가능하게 하는것.
- 사용자나 IT담당자에게 고통과 스트레스를 주지 않는 일상적인 작업
- 담당자는 지루하고 반복적인 작업보다는 능력을 필요로 하는 일에 사용
- 사용자는 IT담당자의 지원없이도 원하는 자원을 정의하고 프로비저닝하고 관리할 수 있다.
- 문제의 해결책은 회의나 문서가 아니라 구현,시험,측정을 통해 검증
#IT 인프라의 문제점
- 서버의 수가 폭증하면, 전체 서버에 패치나 업데이트를 적용하기 쉽지 않다.
- 서버의 구성이나 버전에 따라 소프트웨어나 스크립트가 동작하지 않을 수 있는 구성 편차의 문제
-네트워크상과 다르게 구성된 눈송이서버
- 취약한 인프라
- 자동화의 공포(서버의 비일관성 -> 자동화 도구 실행시 불안감 -> 자동화 도구를 사용하지 않는 구성 변경)
- 인프라의 노후화
1장 동적 인프라 플랫폼
인프라 자원을 프로비저닝하고 관리하기 위한 동적 플랫폼의 다양한 유형과 플랫폼이 제공하는 기능과 서비스 모형, 요구사항에 대한 설명을 한다.
동적 인프라 플랫폼은 기본적인 인프라 자원, 컴퓨트(서버), 스토리지, 네트워크를 제공하고 관리하는 시스템으로 공용 및 사설 클라우드 인프라 서비스, 가상화, 물리 장치의 자동 구성된다.
요구사항
- 프로그래밍의 용이성
- 온디맨드(on-demand): 자원을 즉각적으로 생성하고 삭제할 수 있는 기능
- 셀프서비스(self-service): 온디맨드의 요구사항을 좀 더 발전시킨 것으로 필요에 따라 변경 할 수 있는 것.
제공하는 인프라 자원
- 컴퓨트 자원: 서버 인스턴스로 가상 서버를 생성하고 삭제하는 방법뿐만 아니라 서버관리를 더 쉽고 강력하게 해주는 여러 서비스와 기능이 있다.
- 스토리지 자원: 컴퓨트 자원에 스토리지 제공하는 것외에도 서비스나 애플리케이션에도 스토리지를 제공(블록 스토리지, 오브젝트 스토리지, 네트워크 파일 시스템)
- 네트워크 자원: 내부 요소간의 연결뿐 아니라 외부 네트워크와의 연결도 관리(서버가 추가나 삭제 시 네트워크 라우팅, 부하 분산 풀, 방화벽 규칙을 업데이트 해야한다.)
인프라 정의 도구
인프라의 원칙에 따라 자원을 관리하는데 사용 할 수 있는 도구를 소개.
도구선정
- 스크립트로 작업 가능한 인터페이스
- 무인 방식의 명령줄 도구
- 무인 실행의 지원
- 외부화된 구성
서버 구성 도구
서버 자체의 세부 내용으로, 소프트웨어 패키지, 사용자 계정, 다양한 유형의 구성이 포함.(CF엔진, 퍼핏, 세프, 앤서블)
인프라 서비스
인프라와 애플리케이션 서비스를 관리하는데 도움을 주는 도구와 서비스에 대한 설명
코드로서 인프라의 기본 원칙
- 시스템은 쉽게 다시 만들 수 있다.
- 시스템은 일회용이다.
- 시스템은 일관성이 있다.
- 절차는 반복 가능하다
- 설계는 항상 변한다.
코드로서 인프라의 일반적인 관례
- 정의 파일을 사용(인프라 요소의 인스턴스를 프로비저닝 하고 구성하는 도구에 건넬 입력으로 사용하기 위해 텍스트 파일로 관리)
- 시스템 절차의 자체 문서화(실행하는 단계들은 실제 구현한 스크립트, 정의 파일에 설명된 것들이 포함되므로 사용자에게 일일히 알려주지 않아도 된다.)
- 모든 것의 버전을 관리(VCS)
- 지속성을 위한 시스템과 절차를 계속 시험
- 반취약성을 갖는 IT 시스템은 시스템으르 설계하는 사람 중심으로 설계하는 것
2장 패턴
도구들을 사용하는 패턴과 여러 인프라 요소와 환경을 관리하는 방법에 대해서 설명한다.
효과적인 프로비저닝 절차의 특성
- 기존의 어떤 인프라의 요소든 필요에 따라 쉽게 다시 만들 수 있다.
- 새로운 요소는 한 번만 정의하면 배포하고 복제할 수 있다.
- 모든 요소의 정의와 프로비저닝 절차는 투명한 방식으로 수정할 수 있다.
서버를 프로비저닝하는 패턴
서버 템플릿을 패키징 -> 새 서버를 생성 -> 서버 업데이트하기
-> 서버 교체하기
-> 서버 삭제하기
서버에 있는 유형
- 소프트웨어: 애플리케이션, 라이브러리, 실행 가능한 파일 등 모든 시스템에 있는 동일한 정적 파일. ex)리눅스 시스템의 표준 시간대 데이터 파일
- 구성: 시스템과 애플리케이션이 동작하는 방식을 제어하는데 사용하는 파일.
- 데이터: 시스템이나 애플리케이션이 생성하고 업데이트한 파일. ex) 데이터베이스의 데이터 파일과 로
그 파일
서버를 생성하는 패턴
새 서버를 만드는 가장 간단한 방법은 대화식 UI나 명령줄 도구를 사용해 지정하는 것으로
새로운 클라우드나 가상화 플랫폼을 사용하는 방법.
- 서버생성 옵션을 스크립트에 넣기
- 안티 패턴: 무중단 복제한 서버
- 패턴: 서버 템플릿 사용
- 안티 패턴: 눈송이 공장(사용자마다 요구사항을 다르게 표현하는 것도 좋지만, 업데이트하는 절차를 자동화 하기 더 어려워질 수 있다.
새 서버를 부트스트랩하는 패턴
새 서버를 시작 후 서버에 변경을 적용해야 한다.
이때 구성 도구를 실행하려면 해당 도구를 실행할 수 있도록 부트스트랩해야 한다.
- 밀어넣기 방식의 부트스트랩
- 끌어오기 방식의 부트스트랩
서버 템플릿을 관리하는 패턴
템플릿을 관리하는 방법을 논의하는 장으로,
템플릿 자체는 반복적이고, 투명하고 스스로 문서화하고 스스로 시험하는 절차를 통해 만들어야 한다.
스톡 템플릿
누군가 대신할 수 있도록 만들기.
템플릿을 사용해 서버 프로비저닝하기
- 생성시점에 프로비저닝하기
- 템플릿에 프로비저닝하기
서버 템플릿을 만드는 절차
- 원본 이미지 선택
- 이미지를 맞춤형으로 수정하기
- 이미지를 서버 템플릿 이미지로 패키징하기
역할별 템플릿 생성하기
- 패턴: 계층적 템플릿
- 템플릿을 만드는 기반 스크립트 공유하기
서버를 업데이트하고 변경하는 패턴
인프라를 잘 관리하려면 서버 변경을 관리하는 절차 수립이 필수.
서버 변경은 자동 절차를 통해서만 허용
3장 관례
인프라를 위한 소프트웨어 엔지니어링 관례
목적: 시스템의 품질을 높이는 것.
품질은 개발과 분리된 것이 아니라, 개발자가 시스템을 계획하고 설계하고 구현하고, 전달하는 과정에서 필수 부분이여야 한다.
품질을 보장하는 몇가지 원칙
- 잘 동작하는 코드 일찍 전달
- 작고 유용한 증분을 계속 전달
- 그 순간 필요한 것만을 만들기
- 단순하게
- 모든 변경을 잘 설계하여 구현
- 수정 후 빠른 피드백
인프라 변경 시험하기
- 애자일 시험 방법
- 시험 구조화(시험 피라미드)
- 균형잡힌 시험 체계의 구현
- 시험 코드 관리하기
인프라의 변경 관리 파이프라인 기본설계
빌드& 단위 시험-> 자동 서비스 인프라 시험 -> 자동 종단 간 시험 -> 수동 시험단계 -> 수동 시험단계 -> 사용자 인수 시험단계 -> 상용화 단계
인프라 팀의 작업 흐름의 목표
- 동작하는 모든 것은 자동화
- 로컬 샌드박스 사용하기
- 코드 구조화 패턴
코드로서의 인프라 준비하기 원칙
- 서비스의 설계, 구현, 개선을 지속해서 추구한다
- 팀에게 서비스를 지속해서 제공하고 개선할 권한을 부여한다.
- 서비스를 신속하고 지속적으로 제공하면서도 높은 수준의 품질을 유지하고 관련 규정을 준수한다.