├── LICENSE ├── PREFACE.md ├── Quest00 └── README.md ├── Quest01 └── README.md ├── Quest02 └── README.md ├── Quest03 └── README.md ├── Quest04 └── README.md ├── Quest05 └── README.md ├── Quest06 └── README.md ├── Quest07 └── README.md ├── Quest08 └── README.md ├── Quest09 └── README.md ├── Quest10 └── README.md ├── Quest11 └── README.md ├── Quest12 └── README.md ├── Quest13 └── README.md ├── Quest14 └── README.md ├── Quest15 └── README.md ├── Quest16 └── README.md ├── Quest17 └── README.md ├── Quest18 └── README.md ├── Quest19 └── README.md ├── Quest20 └── README.md └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 KnowRe <[http://about.knowre.com](http://www.knowre.com)> 4 | Copyright (c) 2021 SeungYun Cho <[http://kivol.net](http://kivol.net)> 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /PREFACE.md: -------------------------------------------------------------------------------- 1 | # Knowre 데브옵스 커리큘럼 - 1st Edition, 2021 머리말 2 | 3 | 대 양적완화의 시대입니다. 시중에 돈이 넘쳐나고, 많은 테크기업들이 막대한 투자금으로 좋은 개발자들을 사냥하고 있습니다. 프로 엔지니어를 꿈꾸는 취업준비생들 사이에서는 한국의 IT회사들의 서열을 가리키는 단어도 유행하고 있고, 은근히 그것을 부추기며 그 서열 한켠에 본인의 회사를 끼워넣는 여론을 만들어 내는 사람들도 있습니다. 4 | 5 | 구인 현장에서 한 해에도 세 자리수의 소프트웨어 엔지니어들을 면접하고 팀을 이끌어가는 입장에서, 창업 이후에 올해처럼 어렵고 치열했던 시기가 없었던 것 같습니다. 이런 시장에서 스타트업은 어떤 식으로 살아남아야 할까요? 6 | 7 | 옛날 어떤 농구 감독이 했다는, 전설처럼 내려오는 이야기가 있습니다. '너희들은 공격과 수비 딱 두 가지가 안돼'.. 테크 회사의 엔지니어링 조직 역시 저는 마찬가지라고 생각합니다. 좋은 사람을 뽑고, 좋은 팀을 만들면 됩니다. 문제는 그것을 실행하는 방법이겠지요. 8 | 9 | 좋은 사람을 뽑으려면 무엇보다 좋은 팀이 되어야 합니다. 하지만 좋은 팀이 되려면 좋은 사람들이 필요하죠. 이런 상황을 전산학에서는 데드락Deadlock 이라고 부릅니다. 이러한 데드락을 피하기 위해서는 무언가 다른 전략이 필요할 것입니다. 10 | 11 | 이 커리큘럼은 그러한 질문에 대한 고민의 결과이기도 합니다. 이런 상황에서 스타트업이 취할 수 있는 전략 중 하나는, 좋은 사람들을 직접 키워내는 것입니다. 인력시장에는 포텐셜이 충만하지만 아직 더 완성될 부분이 남아있는 꿈나무 엔지니어들이 많습니다. 저는 이런 엔지니어들에게 좋은 엔지니어로 성장할 수 있는 계기를 제공하고 싶고, 그것은 본인에게도 팀에게도 아주 유익한 일일 것입니다. 12 | 13 | 그렇기 때문에 저는 팀이 커지고 회사가 인수된 지금까지도 10년째 쉬지 않고 그러한 작업을 하고 있습니다. 정확히 세어보진 않았으나 40명 내외의 엔지니어가 저와 웹 개발 커리큘럼을 진행했습니다. 그 중에는 아직 저의 팀 동료로 남아있는 사람도 있고 다른 회사로 떠난 사람도 있지만 대부분이 훌륭한 엔지니어로 성장했고, 미국의 가장 큰 테크회사에서부터 스타트업의 키 엔지니어에 이르기까지 다양한 곳에서 활약하고 있습니다. 14 | 15 | 이후 데브옵스라는 전문적인 분야에서도 신입 엔지니어를 잘 키워낼 수 있겠다는 생각이 들어 데브옵스 커리큘럼 역시 제작해 보았고, 몇 명의 엔지니어가 내부적으로 이 커리큘럼을 통해 공부하며 알파테스트를 진행했고, 회사 밖의 데브옵스에 관심 있는 많은 엔지니어분들께 권유할 수 있을 정도의 완성도가 나왔다는 판단에 공개하기로 결정했습니다. 16 | 17 | ## 이 커리큘럼을 진행하시는 신규 입사자 분들께 18 | 19 | - 여러분들도 이 과정을 통해 프로페셔널 커리어를 설계할 수 있다면 더할나위 없이 좋겠습니다. 이 커리큘럼에서 다루는 지식들도 물론 중요하지만, 그 보다 더 중요한 것은 이 커리큘럼이 이야기하는 소프트웨어 엔지니어로서의 덕목Virtue입니다. 20 | - 이 커리큘럼을 통해 얻은 지식들 중 어떤 것은 자주 쓰지 않아 잊거나 또 언젠가 다시 기억을 되살리게 될 때가 있을 것입니다. 하지만 이 커리큘럼을 통해 얻은 "공부하는 방법"을 잊지 않는다면 틀림없이 몇 년 후에 매력적인 엔지니어로 성장해 있을 것입니다. 21 | - 현업 프로젝트의 일정에 압박받지 않고 기술의 깊은 부분을 공부할 수 있는 기회는 앞으로도 쉽게 오는 것이 아닐 것입니다. 아무쪼록 이번 과정을 통해 커리어를 바꿀만한 좋은 경험을 할 수 있기를 기원합니다. 22 | 23 | ## 이 커리큘럼을 접하신 회사 밖의 분들께 24 | 25 | - 이 커리큘럼을 통해 스터디를 진행하는 경우도 있고, 회사에서 신입의 온보딩을 돕는 경우도 있는 것으로 알고 있습니다. 어떤 경우에도 피드백은 아주 중요합니다. 피드백이 없다면 얻을 수 있는 부분이 제한적이기 때문입니다. 26 | - 퀘스트의 결과물에 대한 피드백은 '이 결과물이 정말 최선인지, 더 개선한다면 어떤 부분을 개선할 수 있을지, 퀘스트를 수행하는 동안 의문스럽거나 꺼림칙한 부분이 있지는 않았는지'를 중심으로 진행하면 좋습니다. 27 | - 체크리스트의 이론적인 부분에 대한 피드백은 여기에 소개된 링크 이외에도 웹의 방대한 자료를 참조하시면 좋으나, 너무 많은 자료가 오히려 갈피를 잡기 어렵게 만들 수도 있을 것입니다. 또한 '어디까지 파고들어야 하나'를 알 수 없어 막막하기도 할 것입니다. 28 | - 그런 경우에는 너무 고민하기보다는 커리큘럼의 총 수행기간을 정해 놓고 진행하는 것도 한 가지 방법일 수 있습니다. Knowre의 경우 이 커리큘럼의 총 수행기간은 풀타임(주 40시간 할애) 기준 2~3개월 정도로 잡고 있으니, 그 정도의 시간을 들인다고 생각하시면 참고가 될 수 있을 것 같습니다. 29 | - 정말 막막하신 경우 저에게 [이메일](mailto:kivoloid@gmail.com)을 보내주셔도 좋습니다. 시간이 닿는 범위에서 최대한 자세히 답변드리도록 하겠습니다. 30 | 31 | 자매품으로 웹개발 신입 엔지니어를 위한 [웹 개발 커리큘럼](https://github.com/Knowre-Dev/WebDevCurriculum)도 있으니 참고하시면 좋을 것 같습니다. 32 | -------------------------------------------------------------------------------- /Quest00/README.md: -------------------------------------------------------------------------------- 1 | # Quest 00. 데브옵스란 무엇인가 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 데브옵스가 무엇인지, 이러한 개념이 왜 나오게 되었는지 등에 대해 다룰 예정입니다. 5 | 6 | ## Resources 7 | * [DevOps란 무엇입니까?](https://aws.amazon.com/ko/devops/what-is-devops/) 8 | * [DevOps란?](https://azure.microsoft.com/ko-kr/overview/what-is-devops/) 9 | * [DevOps](https://cloud.google.com/devops/?hl=ko) 10 | * [DevOps](https://en.wikipedia.org/wiki/DevOps) 11 | 12 | ## Checklist 13 | * 만약 비개발자에게 데브옵스가 무엇인지 설명하게 된다면 어떻게 설명할 수 있을까요? 14 | * 데브옵스라는 개념 이전의 소프트웨어 개발은 어땠을까요? 어떤 요구사항을 충족하기 위해 데브옵스라는 개념이 생겼을까요? 15 | * 데브옵스 엔지니어가 따로 존재하는 조직과 따로 존재하지 않는 조직은 각각 어떤 장단점을 가지고 있을까요? 16 | 17 | ## Quest 18 | * 발급받은 AWS 계정에 접속해 봅니다. 19 | * 본인의 루트 AWS 엑세스 키 ID와 비밀 엑세스 키를 생성하고, 본인의 로컬 머신에 저장해 놓습니다. 20 | * 새로운 무언가를 생성하지는 않은 상태에서, 어떤 것들이 있는지 둘러봅니다! 21 | * 과제 리뷰용 IAM 계정을 하나 만들어서 저에게 알려 주세요. 22 | * 콘솔의 IAM 메뉴에 들어가서, 왼쪽의 `엑세스 관리` -> `사용자`에 들어가서 `사용자 추가`를 클릭합니다. 23 | * 사용자 이름에 `kcho@knowre.com`을 입력하고, 엑세스 유형에 `프로그래밍 방식 엑세스`와 `AWS Management Console 액세스`를 모두 클릭합니다. 24 | * `자동 생성된 비밀번호`와 `비밀번호 재설정 필요`를 체크합니다. 25 | * `권한 설정`에서 `기존 정책 직접 연결`을 선택한 뒤, `AdministratorAccess`를 체크하고, 하단의 `다음:태그`와 `다음:검토`를 계속해서 누른 뒤, 사용자를 만듭니다. 26 | * `액세스 키 ID`와 `비밀 액세스 키`, `비밀번호`, 그리고 위의 안내에 써 있는 접속을 위한 `https://[12자리숫자].signin.aws.amazon.com/console` URL을 저에게 보내 주시면 됩니다! 27 | 28 | ## Advanced 29 | * SRE(Site Reliability Engineering)는 어떤 개념일까요? 30 | * 미래의 데브옵스 직무는 어떻게 변화할까요? 여러 가지 미래를 상상해 봅시다! 31 | -------------------------------------------------------------------------------- /Quest01/README.md: -------------------------------------------------------------------------------- 1 | # Quest 01. 리눅스와 친해지기 2 | 3 | ## Introduction 4 | * 이번 퀘스트를 통해 리눅스의 기본적인 구조와 기능에 대해 공부할 수 있습니다. 5 | 6 | ## Topics 7 | * 리눅스의 기본 커맨드 8 | * `cd`, `pwd`, `ls`, `cp`, `mv`, `mkdir`, `rm`, `touch`, `ln`, `echo`, `cat`, `tail`, `find`, `ps`, `kill`, `grep`, `wc`, `df`, `du` 9 | * 파이프(`|`) 문자 10 | * 리눅스의 기본적인 디렉토리 구성 11 | * `/bin`, `/usr/bin`, `/boot`, `/dev`, `/etc`, `/home`, `/lib`, `/mnt`, `/proc`, `/root`, `/sbin`, `/usr/sbin`, `/tmp`, `/usr`, `/var` 12 | * 쉘과 환경변수와 퍼미션 13 | * sh, bash, zsh 14 | * `.bash_profile`, `.bashrc`, `.zshrc` 15 | * `env`, `set`, `unset`, `export` 16 | * `chmod`, `chown`, `chgrp` 17 | * setuid, Sticky bit 18 | * 운영체제의 기초 19 | * 프로세스와 쓰레드 20 | * 파일 시스템 21 | * 리눅스의 배포판 22 | * Ubuntu, Debian, Redhat Enterprise, CentOS, Gentoo, Amazon Linux 23 | * 패키지 시스템: `apt`(.deb), `yum`(.rpm) 24 | * vi 25 | * `i`, `w`, `q`, `u`, `d`, `p` 명령 26 | 27 | ## Resources 28 | * [The Linux command line for beginners](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) 29 | * [The Linux Directory Structure, Explained](https://www.howtogeek.com/117435/htg-explains-the-linux-directory-structure-explained/) 30 | * [Unix / Linux - What is Shells?](https://www.tutorialspoint.com/unix/unix-what-is-shell.htm) 31 | * [zsh](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH) 32 | * [About systemd](https://www.infoworld.com/article/2832405/what-is-systemd-and-why-does-it-matter-to-linux-users.html) 33 | * [About linux distributions](https://thebloggingpot.com/2018/05/23/different-linux-distributions-explained/) 34 | * [RPM and YUM package management](https://developer.ibm.com/technologies/linux/tutorials/l-lpic1-102-5/) 35 | * [File editing with vi](https://developer.ibm.com/technologies/linux/tutorials/l-lpic1-103-8/) 36 | 37 | ## Checklist 38 | * 리눅스의 파이프 문자는 어떤 역할을 하나요? 39 | * 리눅스의 셸은 어떤 역할을 하나요? bash와 zsh는 어떻게 다른가요? 40 | * 리눅스의 권한 체계는 어떻게 이루어져 있나요? 41 | * 프로세스와 쓰레드는 무엇인가요? 42 | * 현재 실행되고 있는 프로세스들 중 PID가 1인 프로세스는 어떤 역할을 할까요? init과 systemd는 무엇이고 어떻게 다른가요? 43 | * 파일시스템이란 무엇일까요? 어떤 것이 있을까요? 지금 다루는 운영체제는 어떤 파일시스템을 쓰고 있나요? 44 | * 리눅스의 배포판이란 무엇일까요? 여러 가지 배포판들은 어떻게 생겨났을까요? 45 | * 리눅스의 패키지 시스템이란 무엇일까요? 이러한 시스템이 생긴 이유는 무엇일까요? deb과 rpm은 어떤 차이가 있을까요? RPM이 있는데 yum과 같은 시스템이 나온 이유는 무엇일까요? 46 | * vi는 어떤 에디터인가요? vi와 vim은 어떻게 다를까요? vi는 왜 모든 리눅스의 기본 에디터가 되었을까요? 47 | 48 | ## Quest 49 | * 인스턴스 생성 50 | * t3.nano 등급으로 EC2 인스턴스를 생성해 봅시다! Amazon Linux 2, Ubuntu 두 가지를 각각 생성해 봅니다. 51 | * EC2 생성 과정에서 .pem 파일이 하나 생기는데, 이는 저에게 슬랙을 통해 공유해 주시면 됩니다. 52 | * 세 배포판은 어떻게 다른가요? 53 | * 리눅스 연습 54 | * Amazon Linux 2 인스턴스에서 위의 Topics의 기본 커맨드를 연습해 봅니다. 55 | * 리눅스의 기본 디렉토리들에 어떤 정보들이 있는지 둘러 봅니다. 56 | * zsh를 설치하고 `.zshrc` 파일을 포함해 여러 가지 설정을 해 봅니다. 57 | * Topics의 환경변수나 퍼미션 관련 커맨드를 연습해 봅니다. 58 | * 현재 실행되고 있는 프로세스들과 마운트 된 파일시스템들을 확인해 봅니다. 59 | * vi를 열어 여러 가지 기본 명령과 간단한 편집 방법을 연습해 봅니다. 60 | * 생성한 인스턴스 중 Ubuntu는 완전히 종료(Terminate)하고, Amazon Linux 2는 일단 꺼둡니다. 61 | 62 | ## Advanced 63 | * 리눅스 외의 POSIX 호환 운영체제에는 어떤 것들이 있을까요? 그러한 운영체제들은 어떤 용도로 쓰일까요? 64 | * 윈도우를 제외하고, 최근에 발표된 운영체제들 중 POSIX에 호환되지 않는 운영체제도 있을까요? 65 | -------------------------------------------------------------------------------- /Quest02/README.md: -------------------------------------------------------------------------------- 1 | # Quest 02. 프로그래밍의 기초 2 | 3 | ## Introduction 4 | * 이번 퀘스트를 통해 가장 기초적인 프로그래밍과 그를 둘러싼 개념을 익힙니다. 5 | 6 | ## Topics 7 | * node.js 8 | * 컴파일러, 인터프리터, JIT 컴파일, 가상머신, 런타임 9 | * `let`, `const`, `if`, `for`, `function` 10 | 11 | ## Resources 12 | * [패키지 매니저로 Node.js 설치하기](https://nodejs.org/ko/download/package-manager/) 13 | * [node.js](https://nodejs.org/ko/) 14 | 15 | ## Checklist 16 | * node.js란 무엇일까요? 17 | * `node.js는 V8 엔진 위에 만들어진 자바스크립트 런타임이다`라는 문장을 뜯어 보면 어떤 의미일까요? 18 | * 사람의 언어에 가까운 프로그램 코드를 어떻게 컴퓨터가 실행시킬까요? 그 과정은 무엇일까요? 19 | * node.js가 자바스크립트 코드를 리눅스, 윈도우, 맥OS 어느 곳에서든 똑같이 실행할 수 있는 이유는 무엇일까요? 20 | 21 | ## Quest 22 | * node.js 최신 LTS 버전을 설치합니다. 23 | * 다음과 같이 입력에 따라 별의 산을 출력하는 프로그램을 작성합니다. 24 | ``` 25 | $ node quest02.js 5 26 | * 27 | *** 28 | ***** 29 | ******* 30 | ********* 31 | ``` 32 | 33 | ## Advanced 34 | * 퀘스트의 코드를 더 구조화하고, 중복을 제거하고, 각각의 코드 블록이 한 가지 일을 전문적으로 잘하게 하려면 어떻게 해야 할까요? 35 | * 함수형 프로그래밍이란 어떤 컨셉일까요? 어떤 특징들을 가지고 있을까요? 36 | -------------------------------------------------------------------------------- /Quest03/README.md: -------------------------------------------------------------------------------- 1 | # Quest 03. 네트워크의 기초 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 인터넷이 어떻게 동작하며, 서버와 클라이언트, 웹 브라우저 등의 역할은 무엇인지 알아보겠습니다. 5 | 6 | ## Topics 7 | * 서버와 클라이언트, 그리고 웹 브라우저 8 | * 인터넷을 구성하는 여러 가지 프로토콜 9 | * IP 10 | * TCP 11 | * HTTP 12 | * DNS 13 | 14 | ## Resources 15 | * [OSI 모형](https://ko.wikipedia.org/wiki/OSI_%EB%AA%A8%ED%98%95) 16 | * [인터넷 프로토콜](https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C) 17 | * [traceroute](https://ping.eu/traceroute/) 18 | * [TCP](https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C) 19 | * [Wireshark](https://www.wireshark.org/download.html) 20 | * [HTTP](https://ko.wikipedia.org/wiki/HTTP) 21 | * [DNS](https://ko.wikipedia.org/wiki/%EB%8F%84%EB%A9%94%EC%9D%B8_%EB%84%A4%EC%9E%84_%EC%8B%9C%EC%8A%A4%ED%85%9C) 22 | * [Web-Based Dig](https://networking.ringofsaturn.com/Tools/dig.php) 23 | 24 | ## Checklist 25 | * 인터넷은 어떻게 동작하나요? OSI 7 Layer에 입각하여 설명해 보세요. 26 | * 우리가 브라우저의 주소 창에 `www.knowre.com` 을 쳤을 때, 어떤 과정을 통해 노리의 서버 주소를 알게 되나요? 27 | 28 | ## Quest 29 | * tracert(Windows가 아닌 경우 traceroute) 명령을 통해 `www.google.com` 까지 가는 경로를 찾아 보세요. 30 | * 어떤 IP주소들이 있나요? 31 | * 그 IP주소들은 어디에 위치해 있나요? 32 | * Wireshark를 통해 `www.google.com` 으로 요청을 날렸을 떄 어떤 TCP 패킷이 오가는지 확인해 보세요 33 | * TCP 패킷을 주고받는 과정은 어떻게 되나요? 34 | * 각각의 패킷의 헤더에 어떤 정보들이 담겨 있나요? 35 | * telnet 명령을 통해 `http://www.google.com/` URL에 HTTP 요청을 날려 보세요. 36 | * 어떤 헤더들이 있나요? 37 | * 그 헤더들은 어떤 역할을 하나요? 38 | 39 | ## Advanced 40 | * HTTP의 최신 버전인 HTTP/3는 어떤 식으로 구성되어 있을까요? 41 | * TCP/IP 외에 전세계적인 네트워크를 구성하기 위한 다른 방식도 제안된 바 있을까요? 42 | -------------------------------------------------------------------------------- /Quest04/README.md: -------------------------------------------------------------------------------- 1 | # Quest 04. 나의 첫 웹 서비스 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 웹 서비스를 만드는 기초적인 방법과 구성에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * 데몬 8 | * 포트와 소켓 9 | * 프록시(리버스 프록시, 포워드 프록시) 10 | 11 | ## Resources 12 | * [Daemon Process](https://www.quora.com/What-is-a-daemon-process-in-Linux) 13 | * [Reverse Proxy](https://www.nginx.com/resources/glossary/reverse-proxy-server/) 14 | 15 | ## Checklist 16 | * 서버 환경에서 데몬이란 무엇일까요? node.js 서버를 데몬으로 만들려면 어떻게 해야 할까요? 17 | * nginx와 같은 리버스 프록시 서버를 사용하는 이유는 무엇일까요? 18 | 19 | ## Quest 20 | * vi를 이용하여, node.js의 3000번 포트로 기본적인 웹서버를 만든 후 띄워 보세요. 21 | * 로컬 머신을 통해 띄운 웹서버의 3000번 포트에 접속해 보세요. AWS 콘솔에서 보안 그룹을 조정하려면 어떻게 해야 할까요? 22 | * 서버의 앞쪽에 nginx를 설치하여 80포트를 통해 외부로 서비스 해 보세요. 23 | * 서버에 터미널 접속을 종료해도 서버가 뜰 수 있게 해 보세요. 24 | 25 | ## Advanced 26 | * 리눅스 시스템의 PID 1번 프로세스는 무엇일까요? systemd와 init.d는 어떤 시스템이고 어떤 차이가 있을까요? 27 | * AWS의 보안 그룹 시스템은 어떻게 구성되어 있을까요? 일반적인 방화벽 시스템은 어떤 설정들이 가능할까요? 28 | -------------------------------------------------------------------------------- /Quest05/README.md: -------------------------------------------------------------------------------- 1 | # Quest 05. 형상관리툴 2 | 3 | ## Introduction 4 | * git은 2021년 현재 개발 생태계에서 가장 각광받고 있는 버전 관리 시스템입니다. 이번 퀘스트를 통해 git의 기초적인 사용법을 알아볼 예정입니다. 5 | 6 | ## Topics 7 | * git 8 | * `git clone`, `git add`, `git commit`, `git push`, `git pull`, `git branch`, `git stash` 명령 9 | * git 시스템이 프로젝트의 히스토리를 저장하는 방법 10 | * `.git` 폴더의 내용 11 | * GitHub 12 | 13 | ## Resources 14 | * [Set up Git](https://try.github.io) 15 | * [깃 브랜칭을 배워봅시다](https://learngitbranching.js.org/?locale=ko) 16 | * [.Git directory](https://githowto.com/git_internals_git_directory) 17 | 18 | ## Checklist 19 | * 형상관리 시스템은 왜 나오게 되었을까요? 20 | * git은 어떤 형상관리 시스템이고 어떤 특징을 가지고 있을까요? 분산형 형상관리 시스템이란 무엇일까요? git과 같은 분산형 시스템의 장점은 무엇일까요? 21 | * git과 GitHub은 어떻게 다를까요? 22 | * git의 clone/add/commit/push/pull/branch/stash 명령은 무엇이며 어떨 때 이용하나요? 그리고 어떻게 사용하나요? 23 | * git의 Object, Commit, Head, Branch, Tag는 어떤 개념일까요? git 시스템은 프로젝트의 히스토리를 어떻게 저장할까요? 24 | * 리모트 git 저장소에 원하지 않는 파일이 올라갔을 때 이를 되돌리려면 어떻게 해야 할까요? 25 | 26 | ## Quest 27 | * GitHub의 개인 계정에 이번 퀘스트를 위한 리포를 만들어 보세요. 28 | * Quest 04에서 vi로 입력한 웹 서비스 대신 GitHub의 저장소를 clone하여 같은 일을 하는 서버를 띄워 보세요. 29 | * 리포지토리에 민감한 정보(개인정보, 패스워드 등)가 들어가지 않도록 주의합니다. 30 | 31 | ## Advanced 32 | * Mercurial은 어떤 형상관리 시스템일까요? 어떤 장점이 있을까요? 33 | * 실리콘밸리의 테크 대기업들은 어떤 형상관리 시스템을 쓰고 있을까요? 34 | -------------------------------------------------------------------------------- /Quest06/README.md: -------------------------------------------------------------------------------- 1 | # Quest 06. 컨테이너 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 컨테이너 기술과 그 활용에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * 컨테이너 기술 8 | * Docker 9 | * docker-compose 10 | 11 | ## Resources 12 | * [Docker 101 Tutorial](https://www.docker.com/101-tutorial) 13 | * [Docker for beginners](https://docker-curriculum.com/) 14 | * [docker-compose](https://docs.docker.com/compose/) 15 | 16 | ## Checklist 17 | * 컨테이너는 어떻게 동작하나요? 다른 배포판을 사용할 수 있게 하는 원리가 무엇일까요? 18 | * 도커 컨테이너에 호스트의 파일시스템이나 네트워크 포트를 연결하려면 어떻게 해야 할까요? 19 | * 도커 컨테이너에서 런타임에 환경변수를 주입하려면 어떻게 해야 할까요? 20 | * 도커 컨테이너의 stdout 로그를 보려면 어떻게 해야 할까요? 21 | * 실행중인 도커 컨테이너에 들어가 bash 등의 쉘을 실행하고 로그 등을 보려면 어떻게 해야 할까요? 22 | 23 | ## Quest 24 | * 도커를 설치하고 그 사용법을 익혀 보세요. 25 | * Quest 05에서 작업한 서버를 컨테이너 기반으로 띄울 수 있게 수정해 보세요. (docker-compose는 사용하지 않습니다) 26 | * 컨테이너를 Docker Hub에 올리고, EC2에서 해당 컨테이너를 띄워서 서비스 해 보세요. 27 | * docker-compose를 사용하여, 빌드와 서버 업/다운을 쉽게 할 수 있도록 고쳐 보세요. 28 | 29 | ## Advanced 30 | * 도커 외의 컨테이너 기술의 대안은 어떤 것이 있을까요? 31 | * 맥이나 윈도우에서도 컨테이너 기술을 사용할 수 있는 원리는 무엇일까요? 32 | -------------------------------------------------------------------------------- /Quest07/README.md: -------------------------------------------------------------------------------- 1 | # Quest 07. 여러 대의 서버로 서비스 하기 2 | 3 | ## Introduction 4 | * 이번 퀘스트는 여러 대의 서버를 통해 안정적인 서비스를 만드는 방법을 다룹니다. 5 | 6 | ## Topics 7 | * Switch 8 | * L2 Switch 9 | * L3 Switch 10 | * L4 Switch 11 | * L7 Switch 12 | * Load Balancer 13 | * 리스너 14 | * 대상그룹 15 | * 상태 검사 16 | 17 | ## Resources 18 | * [ELB](https://aws.amazon.com/ko/elasticloadbalancing) 19 | * [Single point of failure](https://en.wikipedia.org/wiki/Single_point_of_failure) 20 | 21 | ## Checklist 22 | * Single Point of Failure는 어떤 개념일까요? 23 | * 여러 대의 서버로 서비스할 때의 장점은 무엇일까요? 또 주의해야 할 점은 무엇일까요? 24 | * AWS에서 제공하는 로드밸런서에는 어떤 종류가 있나요? 각각의 용도는 무엇일까요? 25 | * AWS 로드밸런서의 리스너 규칙을 이용해 어떤 일들을 할 수 있을까요? 26 | * AWS의 여러 리전(서울, 도쿄 등)으로 로드밸런싱을 하는 것도 가능할까요? 27 | 28 | ## Quest 29 | * EC2 인스턴스를 한 대 더 늘리고, 앞단에 ELB를 사용하여 두 대를 로드밸런싱 해 보세요. 직전 퀘스트에서 만들었던 컨테이너를 이용하시면 됩니다. 30 | * 두 대의 서버 모두에 번갈아 요청이 들어오는지 확인해 보세요. 31 | * 만약 한 대의 서버의 컨테이너를 내렸을 때, 자동으로 나머지 한 대의 서버로만 요청이 가게 되도록 설정해 보세요. Application Load Balancer를 이용해서 구현해 봅시다! 32 | 33 | ## Advanced 34 | * Sticky Session이란 어떤 개념일까요? 35 | -------------------------------------------------------------------------------- /Quest08/README.md: -------------------------------------------------------------------------------- 1 | # Quest 08. 배포 자동화 하기 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 여러 대의 서버에 자동 배포를 구현하는 방법에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * Systems Manager 8 | * Fargate 9 | * Blue/Green Deployment 10 | 11 | ## Resources 12 | * [Systems manager](https://aws.amazon.com/ko/systems-manager/) 13 | * [AWS Fargate](https://aws.amazon.com/ko/fargate) 14 | * [Blue-Green Deployment](https://www.redhat.com/ko/topics/devops/what-is-blue-green-deployment) 15 | 16 | ## Checklist 17 | * AWS의 Systems Manager는 어떤 서비스인가요? 18 | * AWS의 Fargate는 어떤 서비스인가요? 어떤 장점을 가지고 있나요? 19 | * Blue/Green Deployment라는 것은 어떤 개념일까요? 20 | 21 | ## Quest 22 | * AWS의 Systems Manager를 이용하여, 로컬 CLI에서 컨테이너 이미지를 배포하고 리모트 서버에서 그 이미지를 교체하여 띄울 수 있게 해 보세요. 쉘 스크립트 한 개로 이 모든 것이 이루어질 수 있게 하면 가장 좋습니다! 23 | * 이번에는 EC2 대신 Fargate를 이용하여 같은 서비스를 구현해 보세요. 수동으로 배포하려면 어떻게 해야 할까요? 24 | * Fargate에도 처음에 EC2에 한 배포 자동화를 구현해 보세요. 이 역시 쉘 스크립트 한 개로 이 모든 것이 이루어질 수 있게 하면 가장 좋습니다! 25 | 26 | ## Advanced 27 | * 컨테이너 오케스트레이션이란 무엇일까요? 이를 달성하기 위한 방법으로 Fargate 외에 어떤 수단들이 있을까요? 28 | -------------------------------------------------------------------------------- /Quest09/README.md: -------------------------------------------------------------------------------- 1 | # Quest 09. 정적인 컨텐츠 서비스 하기 2 | 3 | ## Introduction 4 | * 이번 퀘스트를 통해 정적인 컨텐츠의 서비스와 CDN의 개념, 그리고 HTTP 캐싱에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * S3 8 | * Cloudfront 9 | * HTTP Cache 10 | * CORS 11 | * Invalidation(Purging) 12 | 13 | ## Resources 14 | * [Amazon S3](https://aws.amazon.com/ko/s3/) 15 | * [콘텐츠 전송 네트워크(CDN)](https://www.akamai.com/ko/our-thinking/cdn/what-is-a-cdn) 16 | * [Amazon Cloudfront](https://aws.amazon.com/ko/cloudfront/) 17 | * [HTTP caching](https://developer.mozilla.org/ko/docs/Web/HTTP/Caching) 18 | * [교차 출처 리소스 공유 (CORS)](https://developer.mozilla.org/ko/docs/Web/HTTP/CORS) 19 | 20 | 21 | ## Checklist 22 | * AWS의 S3는 어떤 서비스일까요? 23 | * AWS의 Cloudfront는 어떤 서비스일까요? 24 | * HTTP의 캐싱은 어떤 식으로 이루어질까요? 25 | * CORS는 무엇인가요? 어떤 헤더를 통해 구현되나요? EC2 서버나 S3에 구현하려면 어떻게 해야 할까요? 26 | 27 | ## Quest 28 | * 만들어 둔 서버 API로부터 특정 정보를 받아 웹 서비스로 뿌려주는 클라이언트를 개발해 봅시다. 웹 브라우저의 fetch API를 이용하면 됩니다! (HTTPS는 사용하지 않아도 무방합니다) 29 | * 이를 S3에 배포하고, Cloudfront를 통해 서비스하는 인프라를 구성해 봅시다. 30 | * 클라이언트를 수정 배포했을 때, 수정사항이 Cloudfront를 통해 최대한 빨리 반영되게 하려면 어떻게 해야 할까요? 31 | 32 | ## Advanced 33 | * CDN은 어떤 기술일까요? 어떤 장점이 있을까요? 어떻게 구현되는 기술일까요? 34 | * S3의 스토리지 클래스는 어떤 것이 있을까요? 이를 통해 어떤 응용을 할 수 있을까요? 35 | -------------------------------------------------------------------------------- /Quest10/README.md: -------------------------------------------------------------------------------- 1 | # Quest 10. 자동화된 테스트 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 자동화된 테스트에 어떤 장점이 있는지, 어떤 식으로 구축할 수 있는지에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * 유닛 테스트 8 | * Mock과 Stub 9 | * 통합 테스트 10 | * E2E 테스트 11 | * Jest, Puppeteer 12 | 13 | ## Resources 14 | * [Unit Test (단위 테스트) 도입하기](https://www.popit.kr/unit-test-%EB%8B%A8%EC%9C%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8F%84%EC%9E%85%ED%95%98%EA%B8%B0-1%ED%8E%B8/) 15 | * [End-to-End testing with Puppeteer and Jest](https://medium.com/touch4it/end-to-end-testing-with-puppeteer-and-jest-ec8198145321) 16 | * [Mock & Stub difference](https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub) 17 | * [소프트웨어 테스트 안티 패턴](https://velog.io/@leejh3224/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%95%88%ED%8B%B0-%ED%8C%A8%ED%84%B4) 18 | 19 | ## Checklist 20 | * 자동화된 테스트를 작성하는 것은 왜 중요할까요? 21 | * 유닛 테스트와 통합 테스트 중 한 가지 종류만 작업하는 경우에는 어떤 단점이 있을까요? 22 | * Mock과 Stub은 무엇일까요? 이들을 사용할 때 주의해야 할 점은 무엇일까요? 23 | 24 | ## Quest 25 | * Jest를 이용해, 클라이언트의 테스트, 서버의 테스트, 그리고 클라이언트와 서버의 통합(E2E) 테스트를 만들어 보세요. 26 | 27 | ## Advanced 28 | * 테스트의 코드 커버리지는 어떠한 개념일까요? 이 지표를 관리하는 행위의 장단점은 어떤 것이 있을까요? 좀 더 유용한 테스트 체계를 구축하려면 어떻게 해야 할까요? 29 | -------------------------------------------------------------------------------- /Quest11/README.md: -------------------------------------------------------------------------------- 1 | # Quest 11. 보안의 기초 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 네트워크와 보안에 관한 아주 기초적인 것을 다룹니다. 5 | 6 | ## Topics 7 | * VPC, 서브넷, 방화벽 8 | * IAM 9 | * Secrets Manager 10 | 11 | ## Resources 12 | * [AWS VPC의 이해](https://www.44bits.io/ko/post/understanding_aws_vpc) 13 | * [IAM](https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html) 14 | * [Secrets Manager](https://aws.amazon.com/ko/secrets-manager/) 15 | * [Web security 101](https://blog.logrocket.com/web-security-101/) 16 | 17 | ## Checklist 18 | * AWS의 VPC는 어떤 서비스일까요? 19 | * 인프라의 네트워크를 가상으로 구축하는 것은 어떤 장점이 있을까요? 20 | * 네트워크 레벨에서의 보안 전략에는 어떤 것들이 있을까요? 21 | * IAM은 어떤 서비스일까요? 어떤 식으로 계정에 권한을 부여할까요? 22 | * DB 패스워드와 같이 민감한 정보를 어떤 식으로 관리하는 것이 좋을까요? 23 | * Secrets Manager는 어떤 서비스일까요? AWS 외에 비슷한 역할을 하는 서비스로는 어떤 것이 있을까요? 24 | * 어플리케이션 레벨에서의 보안 전략에는 어떤 것들이 있을까요? 25 | 26 | ## Quest 27 | * VPC를 구축하고, 적절한 서브넷 설정, 보안 그룹과 방화벽을 설정해 보세요. 각각의 단계와 구성요소들이 어떤 의미인지 이해해야 합니다. VPC의 보안을 위해서는 서브넷을 어떤 식으로 구현하는 것이 좋을까요? 28 | * 지금까지 구현한 웹 어플리케이션을 VPC 안에서 서비스 해 보세요. 29 | 30 | ## Advanced 31 | * VPN이란 무엇인가요? 회사에서 VPN을 구축했을 때의 장점에는 어떤 것이 있을까요? 32 | * 구축한 VPN을 AWS의 VPC에 연결하려면 어떤 방법이 있을까요? 33 | -------------------------------------------------------------------------------- /Quest12/README.md: -------------------------------------------------------------------------------- 1 | # Quest 12. DNS와 HTTPS 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 DNS에 대한 더 깊은 이해와 함께, HTTPS와 TLS에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * DNS 8 | * Route53 9 | * HTTPS 10 | * TLS 11 | * Certificate Manager 12 | * HTTP/3 13 | 14 | ## Resources 15 | * [DNS Servers](https://www.redhat.com/sysadmin/dns-domain-name-servers) 16 | * [What is DNS](https://aws.amazon.com/ko/route53/what-is-dns/) 17 | * [Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html) 18 | * [HTTPS protocol explained](https://anushadasari.medium.com/the-https-protocol-explained-under-the-hood-c7bd9f9aaa7b) 19 | * [TLS](https://www.internetsociety.org/deploy360/tls/basics/) 20 | * [AWS Certificate Manager](https://docs.aws.amazon.com/ko_kr/acm/latest/userguide/acm-overview.html) 21 | * [HTTP3 explained](https://http3-explained.haxx.se/ko) 22 | 23 | ## Checklist 24 | * DNS의 레코드에는 어떤 종류들이 있나요? 이 종류들은 어떤 용도로 쓰일까요? 25 | * Route53의 Alias 기능이란 무엇인가요? 26 | * 대부분의 최신 브라우저에서는 HTTP 대신 HTTPS가 권장됩니다. 이유가 무엇일까요? 27 | * HTTPS와 TLS는 어떤 식으로 동작하나요? HTTPS는 어떤 역사를 가지고 있나요? 28 | * HTTPS의 서비스 과정에서 인증서는 어떤 역할을 할까요? 인증서는 어떤 체계로 되어 있을까요? 29 | * HTTP/3은 기존 버전과 어떻게 다를까요? HTTP의 버전 3이 나오게 된 이유는 무엇일까요? 30 | 31 | ## Quest 32 | * `xxx.knowre.com`에 해당하는 커스텀 도메인을 하나 부여해 드리겠습니다. Route53을 활용하여 이 도메인의 자체 네임서버를 구축해 보세요. 33 | * Cloudfront에 연결된 정적인 웹사이트와 ECS에서 서비스 되는 API 서버가 위 도메인으로 서비스 되도록 설정과 연결해 보세요. 34 | * Certificate Manager를 통해 인증서를 만들어 보세요. 그리고 위 두 서비스가 HTTPS로 서비스될 수 있도록 바꿔 보세요. 35 | * HTTP로 접속했을 때 HTTPS로 리다이렉트 되도록 설정해 보세요. 36 | 37 | ## Advanced 38 | * DNS의 TTL은 무엇인가요? 실제 리얼 월드에서는 이 DNS의 TTL이 어떻게 동작하고 있을까요? 39 | * 사용중인 OS에서 인정하는 Root CA에는 어떤 기관들이 있을까요? 만약 이 기관중 하나의 인증서 키가 유출된다면 어떤 일이 일어날까요? 40 | -------------------------------------------------------------------------------- /Quest13/README.md: -------------------------------------------------------------------------------- 1 | # Quest 13. 마이크로서비스와 람다 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 마이크로서비스의 개념과 람다 서비스에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * 마이크로서비스 8 | * Lambda 9 | * API Gateway 10 | 11 | ## Resources 12 | * [제프 베조스의 메일](https://news.hada.io/topic?id=638) 13 | * [Microservices](https://www.redhat.com/ko/topics/microservices/what-are-microservices) 14 | * [AWS Lambda](https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/welcome.html) 15 | * [API Gateway](https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/welcome.html) 16 | 17 | ## Checklist 18 | * 마이크로서비스가 무엇인가요? 이러한 구조의 장점은 무엇일까요? 19 | * AWS Lambda는 어떤 서비스일까요? 이러한 서비스는 어떤 특징을 가지고, 어디에 쓰일 수 있을까요? 20 | * AWS Lambda의 Cold start와 Warm start는 어떤 개념일까요? Lambda의 동시성이란 무엇일까요? 21 | * AWS Lambda의 Layer는 어떤 개념일까요? 22 | * API Gateway는 어떤 서비스인가요? 어떤 설정을 할 수 있을까요? 23 | 24 | ## Quest 25 | * AWS Lambda와 API Gateway를 이용해 새로운 웹서비스를 하나 구축해 보세요. (기존 컨테이너 기반의 서비스는 그대로 둡니다!) 26 | * 만들어 둔 정적인 웹사이트에서, 기존 컨테이너 기반의 API에 더해 Lambda 기반의 API 역시 활용할 수 있도록 수정해 보세요. 27 | * API Gateway를 통해 서비스 되고 있는 API가 우리만의 도메인을 가지고 HTTPS로 서비스될 수 있도록 하려면 어떻게 해야 할까요? 28 | 29 | ## Advanced 30 | * 마이크로서비스 아키텍쳐의 단점은 무엇일까요? 이를 해결하기 위해 어떤 방법론들이 제시되고 있을까요? 31 | * 카오스 엔지니어링이란 무엇일까요? 32 | -------------------------------------------------------------------------------- /Quest14/README.md: -------------------------------------------------------------------------------- 1 | # Quest 14. 코드로 인프라 관리하기 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 인프라를 코드로 관리하는 법에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * IaC 8 | * Terraform 9 | * State 10 | * Import 11 | * AWS Provider 12 | 13 | ## Resources 14 | * [Infrastructure as Code](https://en.wikipedia.org/wiki/Infrastructure_as_code) 15 | * [Terraform](https://www.terraform.io/intro/index.html) 16 | * [Introducing Terraform](https://www.44bits.io/ko/post/terraform_introduction_infrastrucute_as_code) 17 | * [Terraform state](https://www.terraform.io/docs/state/index.html) 18 | * [Terraform Provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) 19 | 20 | ## Checklist 21 | * IaC(Infra as Code)는 어떤 개념인가요? 이러한 개념이 왜 생기게 되었을까요? 22 | * 테라폼은 어떤 소프트웨어인가요? 다른 IaC와 비교하여 어떤 장점을 가지고 있을까요? 23 | * 테라폼의 State는 무엇일까요? 기존에 AWS 콘솔을 통해 정의된 리소스를 테라폼의 State에 가져오려면 어떻게 해야 할까요? 24 | 25 | ## Quest 26 | * 지금까지 구축했던 다음의 인프라를 모두 삭제하고 테라폼 코드로 재구축해 보세요. 27 | * VPC 28 | * Fargate 기반의 API 서비스 29 | * 람다 기반의 서비스 30 | * S3와 Cloudfront 기반의 정적 웹사이트 31 | 32 | ## Advanced 33 | * 테라폼 외의 IaC 툴에는 어떤 것이 있을까요? 테라폼에 비해 어떤 장점들을 가지고 있을까요? 34 | -------------------------------------------------------------------------------- /Quest15/README.md: -------------------------------------------------------------------------------- 1 | # Quest 15. 모노리포와 린팅 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 모노리포의 개념, 그리고 코드 파이프라인의 단계 중 하나인 린팅에 대해 다루겠습니다. 5 | 6 | ## Topics 7 | * Monorepo 8 | * Lerna 9 | * Lint (eslint) 10 | 11 | ## Resources 12 | * [Monorepo의 장점과 단점](https://medium.com/better-programming/the-pros-and-cons-monorepos-explained-f86c998392e1) 13 | * [Lerna](https://github.com/lerna/lerna) 14 | * [Lint](https://en.wikipedia.org/wiki/Lint) 15 | * [ESLint](https://eslint.org/) 16 | 17 | ## Checklist 18 | * 모노리포는 어떤 개념인가요? 모노리포를 적용할 때의 장단점은 무엇일까요? 19 | * Lerna는 어떤 역할을 하는 소프트웨어인가요? 20 | * 린팅은 어떤 개념인가요? 린팅을 할 때의 장점은 무엇일까요? 자바스크립트의 경우 어떻게 구현하는 것이 좋을까요? 21 | 22 | ## Quest 23 | * 지금까지 만든 세 개의 자바스크립트 코드베이스(컨테이너 기반 API, 람다 기반 API, 정적 웹사이트)를 Lerna를 이용해 하나의 리포로 합쳐 보세요. 24 | * eslint의 기본 설정을 이용해 이 코드들을 린팅해 보세요. 모든 패키지를 명령 하나로 한 번에 린팅하려면 어떻게 해야 할까요? 25 | 26 | ## Advanced 27 | * Lerna 외의 모노리포 툴에는 어떤 것들이 있을까요? Lerna와는 어떤 점이 다를까요? 28 | * ESLint는 내부적으로 어떤 원리로 코드를 분석할까요? 정적 분석이란 무엇일까요? 29 | -------------------------------------------------------------------------------- /Quest16/README.md: -------------------------------------------------------------------------------- 1 | # Quest 16. 배포 파이프라인 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 CI/CD 파이프라인이 왜 필요한지, 어떻게 구축할 수 있는지 등에 대해 다룹니다. 5 | 6 | ## Topics 7 | * Continuous Integration 8 | * Continuous Delivery 9 | * AWS Codebuild 10 | 11 | ## Resources 12 | * [Continuous Integration](https://aws.amazon.com/ko/devops/continuous-integration/) 13 | * [Continuous Delivery](https://aws.amazon.com/ko/devops/continuous-delivery/) 14 | * [AWS Codebuild](https://aws.amazon.com/ko/codebuild/getting-started/) 15 | 16 | ## Checklist 17 | * CI/CD는 무엇일까요? CI/CD 시스템을 구축하면 어떤 장점이 있을까요? 18 | * CI 시스템인 Travis CI, Jenkins, Circle CI, Github Actions, AWS Codebuild 의 차이점과 장단점은 무엇일까요? 19 | 20 | ## Quest 21 | * AWS Codebuild를 이용하여, 특정 브랜치에 푸시를 하면 테스트를 한 뒤 모노리포에 있는 모든 패키지가 한 번에 배포되는 시스템을 만들어 보세요. 22 | * 이 시스템의 CI/CD를 더 효율적으로 할 수 있는 아이디어에는 어떤 것들이 있을까요? 다섯 가지 이상의 아이디어를 제시해 보세요. 23 | 24 | ## Advanced 25 | * 빅테크 회사들이 코드를 빌드하고 배포하는 시스템은 어떻게 설계되고 운영되고 있을까요? 26 | -------------------------------------------------------------------------------- /Quest17/README.md: -------------------------------------------------------------------------------- 1 | # Quest 17. 서비스의 운영 (1): 서버 들여다 보기 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 서비스 운영을 위한 리눅스 커맨드와 모니터링에 대해 다루겠습니다. 5 | 6 | ## Topics 7 | * 리눅스의 커맨드들: `lsof`, `df`, `top`, `free`, `nmon`, `iostat`, `ifconfig`, `crontab` 8 | * Cloudwatch 9 | * Grafana 10 | 11 | ## Resources 12 | * [20 Command Line Tools to Monitor Linux Performance](https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/) 13 | * [Amazon CloudWatch 지표 사용](https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/working_with_metrics.html) 14 | * [Getting started with Grafana](https://grafana.com/docs/grafana/latest/getting-started/getting-started/) 15 | 16 | ## Checklist 17 | * 위 Topics의 리눅스 커맨드들은 어떤 커맨드인가요? 운영 중 어떤 상황에 쓸 수 있을까요? 18 | * Cloudwatch는 어떤 서비스인가요? 우리가 구축한 시스템 관련하여, Cloudwatch에서 제공하는 메트릭들 중 유용한 것은 어떤 것이 있을까요? 19 | * Grafana는 어떤 역할을 하는 툴인가요? Grafana 외에 비슷한 일을 하는 툴은 무엇이 있을까요? 20 | 21 | ## Quest 22 | * 리눅스 시스템의 모니터링이나 상태 파악을 위한 커맨드를 연습해 보세요. 23 | * Grafana를 통해 지금까지 구축한 전체 시스템에 대한 모니터링 페이지를 구축해 보세요. 24 | * 서버가 비정상 상태일 때, 혹은 서버의 대수에 변화가 있을 때 운영자가 알 수 있도록 슬랙을 통해 Alert을 설정해 보세요. 25 | 26 | ## Advanced 27 | * 리눅스 시스템을 웹 서버 용도로 사용할 때, 서비스하는 트래픽의 특성에 따라 CPU, 메모리, 파일 I/O 중 어떤 것들이 중요하게 될까요? 28 | -------------------------------------------------------------------------------- /Quest18/README.md: -------------------------------------------------------------------------------- 1 | # Quest 18. 서비스의 운영 (2): 로깅과 Elasticsearch 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 서비스의 운영을 위해 로그를 스트리밍하는 법에 대해 다루겠습니다. 5 | 6 | ## Topics 7 | * ElasticSearch 8 | * AWS ElasticSearch Service 9 | * Grafana 10 | 11 | ## Resources 12 | * [ElasticSearch](https://www.elastic.co/kr/what-is/elasticsearch) 13 | * [ElasticSearch 101](https://www.elastic.co/kr/webinars/getting-started-elasticsearch) 14 | * [Grafana Panels](https://grafana.com/docs/grafana/latest/panels/) 15 | 16 | ## Checklist 17 | * ElasticSearch는 어떤 DB인가요? 기존의 RDB와 어떻게 다르고 어떤 장단점을 가지고 있나요? 18 | * AWS의 ElasticSearch Service는 어떤 서비스인가요? ElasticSearch를 직접 설치하거나 elastic.co에서 직접 제공하는 클라우드 서비스와 비교하여 어떤 장단점이 있을까요? 19 | * Grafana의 Panel 형식에는 어떤 것이 있을까요? 로그를 보기에 적합한 판넬은 어떤 형태일까요? 20 | 21 | ## Quest 22 | * 우리의 웹 서버, S3, Cloudfront, VPC, ELB 등이 로그를 남기도록 해 보세요. 23 | * ElasticSearch Service 클러스터를 작은 사양으로 하나 만들고, 이 로그가 ElasticSearch로 들어가도록 해 보세요. 24 | * Grafana를 이용해 ElasticSearch의 로그를 실시간으로 볼 수 있는 페이지를 만들어 보세요. 25 | 26 | ## Advanced 27 | * ElasticSearch와 Grafana는 어떤 라이센스로 배포되고 있을까요? AWS와 같은 클라우드 제공자들이 이러한 오픈소스를 서비스화 하는 것을 둘러싼 논란은 어떤 논점일까요? 28 | -------------------------------------------------------------------------------- /Quest19/README.md: -------------------------------------------------------------------------------- 1 | # Quest 19. 스트레스 테스트 2 | 3 | ## Introduction 4 | * 이번 퀘스트에서는 스트레스 테스트와 오토 스케일링에 대해 알아보겠습니다. 5 | 6 | ## Topics 7 | * Stress Test 8 | * Artillery 9 | * AWS Auto Scaling 10 | * Fargate Auto Scaling 11 | * Lambda Concurrency 12 | 13 | ## Resources 14 | * [Stress testing tutorial](https://www.guru99.com/stress-testing-tutorial.html) 15 | * [Artillery](https://artillery.io/) 16 | * [AWS AutoScaling](https://aws.amazon.com/ko/about-aws/whats-new/2018/01/introducing-aws-auto-scaling/) 17 | * [Auto Scaling](https://aws.amazon.com/ko/blogs/korea/category/compute/auto-scaling/) 18 | * [ECS Auto Scaling](https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/service-auto-scaling.html) 19 | * [Lambda Concurrency](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) 20 | 21 | ## Checklist 22 | * 스트레스 테스트는 왜 하는 것일까요? 23 | * 스트레스 테스트의 진행에는 어떤 방법론들이 있을까요? 24 | * AWS의 Auto Scaling은 어떤 서비스일까요? Fargate에서는 어떻게 적용할 수 있을까요? 25 | * Lambda의 동시 실행은 어떠한 개념일까요? 부하가 많은 서비스에서 이 지표를 어떻게 모니터링 해야 할까요? 26 | 27 | ## Quest 28 | * 우리의 컨테이너 기반 서버를 일부러 약간 무겁게 만들어 봅시다. 일부러 서버의 부하를 주려면 어떤 방법이 있을까요? 29 | * Artillery를 이용하여 스트레스 테스트 시나리오를 작성하고, 부하를 가해 보세요. 30 | * Fargate의 Auto Scaling 기능을 설정하여, 초당 일정 이상의 부하가 걸리면 자동으로 컨테이너를 늘리고, 부하가 줄면 자동으로 컨테이너의 수를 줄이게 만들어 보세요. 31 | 32 | ## Advanced 33 | * 실제 세상에서 자주 업데이트 되는 서비스가 있다고 할 때, 이런 서비스를 스트레스 테스트 하는 데에는 어떤 전략들이 있을까요? 각각의 전략들은 어떤 상황에서 사용될 수 있을까요? 34 | -------------------------------------------------------------------------------- /Quest20/README.md: -------------------------------------------------------------------------------- 1 | # Quest 20. 세상 밖으로 2 | 3 | ## Introduction 4 | * 이제는 세상 밖으로 나갈 때입니다! 그 동안 퀘스트 수행하시느라 고생 많으셨습니다. 5 | 6 | ## Checklist 7 | * 그 동안 데브옵스 커리큘럼을 진행하면서 어떤 것을 느끼고 배웠나요? 8 | * 데브옵스 커리큘럼을 진행하면서 더 개선되거나 추가되었으면 하는 점에는 어떤 것이 있었나요? 9 | 10 | ## Quest 11 | * 그 동안 퀘스트를 진행하면서 AWS에 생성했던 모든 리소스를 삭제해 보세요. 12 | * 권한을 부여받아 우리 회사의 모노리포와 테라폼 리포를 로컬에 클론하고, 개발환경을 세팅해 보세요. 13 | * 이제 동료들과 함께 일할 시간입니다! 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Knowre 데브옵스 커리큘럼 - 1st Edition, 2021 2 | 3 | ## 소개 4 | 5 | * Knowre의 신입 데브옵스 엔지니어 교육을 위한 데브옵스 교육 커리큘럼의 2021년 버전입니다. 6 | * 이 커리큘럼을 통해 신입 엔지니어들은 데브옵스의 기본 개념, 리눅스, 네트워크, 형상관리, 컨테이너, 로드밸런싱, CI/CD, AWS, CDN, 자동화 된 테스트, 보안, 마이크로서비스, 모노리포, 로깅과 모니터링, 스트레스 테스트 등의 주제에 관하여 익히게 됩니다. 7 | 8 | 9 | ### 광고 10 | 11 | * Knowre에서 수시로 신입/경력 엔지니어를 모시고 있습니다. [이 링크](https://www.wanted.co.kr/company/96) 를 참고해 주십시오! 12 | 13 | 14 | ## 머리말 15 | 16 | * [머리말](./PREFACE.md) 17 | 18 | 19 | ## 목차 20 | 21 |
펼치기 22 |

23 | 24 | * [Quest 00. 데브옵스란 무엇인가](./Quest00) 25 | * [Quest 01. 리눅스와 친해지기](./Quest01) 26 | * [Quest 02. 프로그래밍의 기초](./Quest02) 27 | * [Quest 03. 네트워크의 기초](./Quest03) 28 | * [Quest 04. 나의 첫 웹 서비스](./Quest04) 29 | * [Quest 05. 형상관리툴](./Quest05) 30 | * [Quest 06. 컨테이너](./Quest06) 31 | * [Quest 07. 여러 대의 서버로 서비스 하기](./Quest07) 32 | * [Quest 08. 배포 자동화 하기](./Quest08) 33 | * [Quest 09. 정적인 컨텐츠 서비스 하기](./Quest09) 34 | * [Quest 10. 자동화된 테스트](./Quest10) 35 | * [Quest 11. 보안의 기초](./Quest11) 36 | * [Quest 12. DNS와 HTTPS](./Quest12) 37 | * [Quest 13. 마이크로서비스와 람다](./Quest13) 38 | * [Quest 14. 코드로 인프라 관리하기](./Quest14) 39 | * [Quest 15. 모노리포와 린팅](./Quest15) 40 | * [Quest 16. 배포 파이프라인](./Quest16) 41 | * [Quest 17. 서비스의 운영 (1): 서버 들여다 보기](./Quest17) 42 | * [Quest 18. 서비스의 운영 (2): 로깅과 모니터링](./Quest18) 43 | * [Quest 19. 스트레스 테스트](./Quest19) 44 | * [Quest 20. 세상 밖으로](./Quest20) 45 | 46 |

47 |
48 | 49 | 50 | ## 커리큘럼을 진행하실 때... 51 | 52 | * 커리큘럼을 수행하시다 보면 이미 익숙한 주제도 있을 수 있고, 익숙하지 않은 주제도 있을 것입니다. 퀘스트가 익숙한 주제를 다루고 있더라도 본인이 정확히 알지 못하고 있는 부분이 분명히 있을 것입니다. 53 | * Checklist의 질문들을 무시하지 마십시오! 본인이 좋은 개발자로 성장하기 위한 밑거름이 될 수 있고, 본격적으로 바쁜 업무를 시작한 이후에는 이 밑거름을 잘 채우는 것은 생각보다 어려운 일입니다. 54 | * 되도록 여러 개의 퀘스트를 동시에 진행하지 않는 것을 권장합니다. 진도를 빠르게 나가는 것도 중요하지만, 한 개의 주제를 깊고 정확히 아는 것이 더 중요합니다. 여건이 닿는 한 번에 한 개의 퀘스트씩만 수행하고, 완성한 다음에 꼭 바로 피드백을 받아 놓친 부분이 무엇인지 점검하도록 합시다. 55 | * 생소한 주제의 퀘스트를 수행하는 경우, 본인이 새로운 개념을 공부해 나가는 방식을 정립하는 기회로 생각하시면 좋습니다. 그런 공부의 과정은 앞으로 개발자의 커리어를 걸어가는 동안 계속해서 겪게 될 것입니다! 56 | * 이 커리큘럼에서 다루는 기술 뿐 아니라 모든 기술은 어떤 특정한 문제를 풀기 위해 개발되었습니다. 커리큘럼을 진행하시면서, 또 이후에 개발자의 길을 걸을 때 언제나 다음의 세 가지 질문을 끊임없이 스스로에게 던지면 유용할 것입니다: 57 | * 이 기술이 왜 나오게 되었을까? 어떤 문제를 풀기 위해 어떤 배경에서 나왔을까? 58 | * 이 기술은 기존의 문제를 푸는 해답을 어떻게 제시했을까? 이 기술은 어떻게 사용하는 것일까? 59 | * 이 기술은 어떤 장점과 단점을 가지고 있을까? 이 기술의 단점을 보완하려면 어떻게 해야 할까? 기존의 문제를 푸는 다른 방법으로 제시된 것은 무엇이 있을까? 60 | 61 | 62 | ## 설명 63 | 64 | * Quest 0부터 순서대로 각각의 주제들에 관한 퀘스트를 수행하시면 됩니다. 65 | * Knowre의 신입 엔지니어인 경우에는 퀘스트 수행에 필요한 격리된 AWS 계정을 제공합니다. 해당 계정을 자유롭게 쓰되, 부주의로 과도한 비용이 청구되지 않도록 주의하세요! 66 | * 퀘스트를 수행하면서 독립된 리포지토리가 필요해 질때는 각자의 리포지토리를 사용하시면 됩니다. 67 | * 비밀번호나 토큰 스트링 등의 민감한 정보를 공개된 저장소에 커밋하지 않도록 주의하시기 바랍니다. 68 | * 퀘스트는 다음과 같이 구성되어 있습니다(그러나 모든 퀘스트가 다음의 구성요소들을 모두 가지고 있는 것은 아닙니다). 69 | * Introduction: 소개 페이지입니다. 70 | * Topics: 이번 퀘스트를 통해 익힐 수 있는 기술이 무엇인지를 나타냅니다. 71 | * Resources: 토픽을 익히기 위해 참고하면 좋을 링크들입니다. 72 | * Checklist: Topic들을 제대로 공부했는지를 자문자답 할 수 있는 문항들로 이루어져 있습니다. 73 | * Quest: 퀘스트를 통해 만들어내야 하는 결과물들을 담고 있습니다. 74 | * Skeleton: 퀘스트 수행을 위한 스켈레톤 코드입니다. 75 | * Advanced: 더 공부하고 싶은 분들을 위한 화두입니다. 76 | 77 | ## 제출 78 | 79 | * 제출은 크게 Checklist의 질문에 대한 대답과 Quest의 수행으로 나누어 집니다. 80 | * Checklist의 질문에 대한 대답은 이 저장소를 fork하여 자신의 저장소를 만들고, 그 저장소에 해당 내용을 푸시합니다. 81 | * Checklist의 대답은 마치 면접 질문에 대답하듯 최대한 정확하지만 간결한 답을 준비하는 것이 좋습니다. 82 | * 혹시 답변에 있어 포맷팅이 필요할 경우 [Markdown 포맷](https://guides.github.com/features/mastering-markdown/)을 이용하시는 것을 권장해 드립니다. 83 | * 이 커리큘럼의 많은 문서들도 Markdown으로 되어 있기 때문에 Markdown 포맷에 익숙해지시는 것 역시 권장드립니다. 84 | * Checklist의 내용을 채워넣기 위해 구글링해서 나온 결과물을 그대로 붙여넣기보다는, 본인이 내용을 이해한 후 되도록 면접장에서 대답한다는 마음가짐으로 자신의 언어로 다시 작성하기를 권장합니다. 85 | * Quest에서 요구하는 결과물이 86 | 1. 코드인 경우: 개인 계정에 다른 저장소를 만들어 제출합니다 87 | 1. AWS상의 인프라인 경우: 해당 인프라의 위치와 설명을 슬랙으로 제출합니다 88 | * Checklist와 Quest의 질문과 답을 완벽히 이해했다고 생각하신다면, Advanced에 있는 화두를 스스로 공부해 보고 필요한 경우 질문거리를 생각해 봅니다. 89 | 90 | 91 | ### 막혔다면... 92 | 93 | * 되도록 검색 등을 통해 스스로 해결해 나가는 것을 권장합니다. 국내 검색엔진의 검색 보다는 구글 검색을 권장합니다. 94 | * 어떠한 알 수 없는 현상이 있어 막혔을 경우 그 현상이 일어나는 최소단위의 코드를 만들다 보면 해결되는 경우가 많습니다. 95 | * 만일 만 하루 이상의 시행착오로 인해 진행이 멈췄을 경우, 제 자리로 찾아 오시면 해결을 보장해 드립니다. 96 | 97 | 98 | ### 라이센스 99 | 100 | * 이 커리큘럼은 [MIT 라이센스](./LICENSE)를 따릅니다. 원하시는대로 쓰시고 개작하실 수 있습니다. 다만 이 커리큘럼의 내용이 마음에 드셨을 경우, 만약 원하신다면 `[Knowre DevOps Curriculum](https://github.com/Knowre-Dev/DevOpsCurriculum)에서 영감을 받았다` 라는 언급을 해 주시면 감사하겠습니다. 101 | --------------------------------------------------------------------------------