서비스 규모에 따른 인프라 결정

개요

경험이 없는 팀은 서비스 초반에 인프라 결정장애를 겪는다

하나하나 만들어 쓰면 싸고? 좋아 보이는데
좋은 유료 서비스를 쓰면 시간이 절약된다

  • aws
    • k8s
    • ecs
    • elastic beanstalk
    • rds
  • sentry
  • github + action
  • quay
  • bintray
  • heroku

k8s가 좋다고 하지만 숙련된 개발자가 없으면 안쓰니만 못하고
간단한 서비스의 경우 heroku 정도를 쓰는게 나을 수 있다

rabbitmq, kafka 매니지드는 비싸서 소규모일 때는 설치해서 쓰고싶은 유혹이..

인프라 결정 기준

  • 개발인원에 따라 1~5인, 10인, 100인…
  • 서비스 사용자 규모 100명, 1000명
  • 인프라 비용
  • 무정전 서비스가 필요

다양한 요건이 있는데 인프라 비용에 따라 결정하는게 속편하고 빠르다.

할 줄 안다고 하나하나 직접 하다보면 그것만 하다가 본업을 할 수 없게 되니까
기준을 넘어서는 경우 다음 단계로 올라가기 위한 작업을 하면 된다

결정이고 뭐고 필수사항

  • Container – 보통 Docker
  • IaC – 인프라 코드화
  • Git – github을 많이 쓰는데 gitlab.com은 무료에 빠르다
  • 로깅 – Sentry

인프라 월비용에 따른 결정

간단한 웹서비스의 경우

무료 ~ 30만원

모놀리스로 프로토타입 개발하는 시간
또는 잘 설계된 애플리케이션 초반 개발

헤로쿠 heroku.com
AWS 최소인프라로 사용

30만원 ~ 100만원

서서히 기술욕심이 생기는 단계
매니지드 k8s를 사용해볼만하다
헤로쿠는 국내서버 제공이 안되고 느리기도 하니까

GCP, AWS, AZURE, DigitalOcean 매니지드 k8s

금지항목

  • EB(ElasticBeanstalk)
  • ECS
  • GoogleAppEngine

위 항목은 속터지는 것에 비해 편리하지 않다

CloudFunctions, Lambda 등은 생각보다 설계 자체가 어렵고 디버깅도 어렵고 관리도 힘들다
연습용 으로 한두개 추가하기는 괜찮느데 초기 서비스에는 오히려 적합하지 않다

100만원 ~ 1000만원

서버 비용을 걱정하기 시작해야 할 단계

중소 클라우드 업체랑 계약 잘 하면
몇달정도 공짜로 쓰게 해준다
다 쓰고나서 눌러앉아도 되고 옮겨도 된다
어차피 k8s는 다 있으니까 상관없다

네이버 클라우드같은 경우는 IaC가 잘 안되는 문제가 있다.
많이 쓰는 TerraForm 지원이 거의 없다.

서버 API는 잘 돼 있긴한가 모르겠다

1000만원 ~

멀티클라우드

바이든 대통령님 초거대기업 MS의 자회사 Github의 횡포를 막아주세요.

바이든 대통령님, 안녕하십니까.

저는 빌드배포산업 협회원이며 해당 산업에 종사하고 있는 영세 자영업자입니다.

근래 거대기업 MS가 막대한 자본력을 바탕으로 개발자의 성지인 Github서비스를 인수하는 사태가 발생하였읍니다. 오픈소스 정신으로 무장한 개발자들의 공동체가 거대 자본의 발밑에 들어가 버린 사건으로 저와 저희 협회 그리고 전세계 개발자들이 많은 걱정을 하였읍니다. 하지만 한동안 MS는 별다른 행보를 취하지 않은 상태로 Github를 기존처럼 운영하는 척을 하였읍니다. 하지만 Github Action이라는 기능이 추가되면서 사건은 급전직하 되어 버리고 말았읍니다.

Github Action이라는 기능은 기존에 기술자들이 배쉬 쉘스크립트를 활용해 한줄한줄씩 한달에 거쳐 만들던 빌드배포 기능을 와이엠엘 형태로 선언적으로 쉽게 만들수 있게 해 버리면서 많은 빌드배포 개발자들의 일자리를 빼앗아 가고 있읍니다. 이는 AI보다 더욱 목전에 닥친 일자리 위협으로 저희 빌드배포 개발자들은 생명의 위기를 느끼고 있는 상태입니다.
 또한 비슷한 혁신을 꿈꾸며 사업을 키워나가던 Travis, CircleCI 등의 회사는 꿈을 펴기도 전에 위기에 빠져 버렸습니다. Github Action은 기존 Travis, CircleCI가 개발한 와이엠엘형태 선언방식을 그대로 따라한 아류작이지만 MS의 초거대자본을 등에업은 Github의 독점력을 바탕으로 급격하게 시장을 탈취 해 가고 있읍니다. 기존 서비스를 모방했지만 선언방식을 조금 더 쉽게 개선하고 다양한 샘플과 풍부한 도큐먼트를 제공하여 기존 업체들은 경쟁이 불가능하도록 전방위 압박을 받고 있습니다. 고사위기에 처한 영세 스타트업과 영구적 실업위기에 빠진 빌드배포개발자들은 한숨속에 잠을 못 이루고 있읍니다.

 빌드배포산업은 소프트웨어 뿌리산업으로 웹개발 업계를 지탱하고 있읍니다. 저희가 무너지는 것은 괜찮지만 저희 업계가 무너지는 것은 소프트웨어 업계의 몰락을 뜻합니다. 저희 협회원 뿐 아니라 인접산업군 그리고 그 가족들과 그 친척들과 그 친구들까지 10억명의 생계와 친목이 걸려 있는 중대한 사아님을 말씀 드립니다.

빌드배포산업 종사자의 한 명으로써
저희 산업협회의 입장을 전달 드리겠읍니다.

첫째, 빌드배포산업협회는 해당 산업을 중소기업 적합업종으로 지정하여 자본금 1000억원 이상의 업체들이 진출하지 못하게 막아 줄 것을 요구하는 바입니다. 이는 저희 협회뿐만 아니라 인접산업에도 해당되는 문제로 MS는 운영체제와 클라우드 이외의 산업에 진출하는 것을 영구적으로 막는 규정을 미국 연방의 재수정헌법에 명시해 주실 것을 요청 드립니다.
둘째, 저희 빌드배포산업협회는 MS 윈도우즈엑스피의 소스공개를 요청하는 바입니다. MS는 해당 오에스의 업데이트를 임의로 중지시키고 업데이트를 해 주지 않아 사용자들의 오에스 선택권을 심각하게 침해하고 있는 상태입니다. 윈도우즈10을 강매하는 것과 동일한 행위로 엠에스의 독점적 영향력을 통한 시장 교란행위에 해당합니다. 윈도우즈 엑스피의 소스코드를 공개하여 사용자들이 스스로 보안문제를 해결하면서 사용할 수 있게 만들어 주실 것을 요청 드립니다.

해당 요구사항이 받아들여 지지 않을 경우 저희는 협회 차원에서 MS불매운동과 더불어 바이든 대통령 탄핵 평화촛불 네트워크를 가동시키기로 내부적으로 협의된 바 있읍니다.

실력행사를 할 일이 없길 바라며

서울에서 빌드배포협회 배상

2020 DevOps 기술 트렌드

CI/CD

메이저

CircleCI, TravisCI, GithubAciton, GitlabAction, AWS Code Build
tekton.dev, drone.io
argo(https://github.com/argoproj/argo)

애매한

GoCD

밀려난

Jenkins

Provisioning

메이저

Ansible, python fabric

애매한

SaltStack

밀려난

Chef

Container

메이저

k8s, helm,

애매한

keel(https://github.com/keel-hq/keel), quay.io, docker swarm, flynn

밀려난

….

Cloud

메이저

Terraform, Python boto
AWS – MSK, RDS, EC2, ElasticCache, EKS, Route53
GCP, DigitalOcean

애매한

밀려난

AWSCloudFormation, AWS ElasticBeanstalk, ECS

Tmux – 환경저장 도우미툴 – teamocil, tmuxinator

tmux

요즘엔 터미널이 좋아져서 tmux를 쓸 일이 잘 없는데

아래 툴을 사용하면
대여섯개 로그를 같이 보거나 자주쓰는 환경을 반복적으로 입력하는 경우에
자주쓰는 환경을 저장 해 놨다가 사용할 수 있다.
ex)

  1. Docker – db, web, gw, …등등 실행 후 로그보기
  2. ssh 접속 – 서버1,2,3,4,5 로그보기

tmux 보조툴

  • teamocil : https://github.com/remi/teamocil (개발중단)
  • tmuxinator : https://github.com/tmuxinator/tmuxinator

사용법 (은 자세히 보려면 깃헙으로 이동)

app.ym을 미리 만들어서 ~/.teamocil/app.yml에 넣고
teamocil app
이라고 치면 미리 정의한 환경이 실행된다

오류 발생

여태까지 teamocil을 잘 쓰고 있었는데 tmux가 버전업되면서 오류가 난다고 한다.

no server running on /private/tmp/tmux-501/default

이런 에러메시지가 나오는데
따지고 보면 tmux 문제다. tmux 서버를 미리 실행시켜놓고 하면 되긴된다.

tmux list-setssion을 쳤을 때 서버가 실행중이 아니라면 서버가 실행중이 아니라는 메시지가 떠야지 그지같은 소리 나오는건 tmux문제지
tmux start-server - tmux list-sesstion 해도 마찬가지로 위의 메시지가 뜬다.

tmux가 이상하지만
tmux가 갑이다.
보조툴이 알아서 기어야한다.

teamocil은 개발자가 혼자 관리하는 것 같은데
개발중단되고 pull request나 issue도 확인이 안된지 몇년이 됐다.
업데이트가 되는 tmuxinator를 쓰자.

아직까지는 tmuxinato도 같은 오류가 발생하고 있지만
고쳐지지 않을까

tmuxinator도 설정파일은 유사해서 기존 환경 변경하는게 어렵진 않겠다.

DevOps 환경별 구분

개발 및 배포 단계

  • Dev,Devel,Development – 개발자 개발중
  • QA,Alpha – QA자 QA중
  • PreProduction,Staging – 라이브자 라이브전
  • Live,Real,Production – 라이브자 라이브중

서버의 성격/위치

  • 개발자 본인 장비 – 개인용
  • 공동 관리하는 서버 – 사무실 서버,IDC,Cloud
  • 서비스 서버 – IDC,Cloud

세분화된 개발환경 구분

  • Dev Local Mock – 한개 서비스에서 연동서비스는 Mock 데이터
  • Dev Local/Remote Integration – 개발용 인프라에 연동서비스 함께
  • Test Remote Feature – 특정 기능 요소별로 테스트가능한 환경
  • Test Remote QA – QA 및 업무담당자 테스트환경 (수동 및 자동)
  • Live Remote Pre-Production – Production의 데이터까지 복제해서 만든 환경에 배포 결제 등 외부서비스 Real 연동
  • Live Remote Production – 실제 서비스 환경

테스트 종류

  • Manual Test
  • Unit Test
    • Mock API
    • Mock Data
  • Dev Integration Test
    • Real API
    • Seed Data
  • Live Integration Test
    • Real API
    • Real Data
  • Health Check

테스트 방법

  • Manual
  • Script

단계 구분

  1. Dev
    1. Local Dev Unit Test(Automatic)
    2. Local Dev Integration Test(Automatic)
    3. Git push – dev
    4. CI Build Unit Test
    5. Remote Dev Integration Test(Manual)
  2. Test
    1. Feature Test
    2. QA Test
    3. Success/Fail
  3. Live
    1. Pre-Production Test
    2. Production

현재까지의 순서

Terraform – AWS 사용 후기

사용법은 매우 간단해서 몇 시간 삽질해보면 금방 익힐 수 있는 수준

그래도 tutorial은 필요해 보인다

  • install terraform
  • provider
  • terraform init
  • vpc, subnet, ec2, rds 작성
  • terraform plan
  • terraform apply
  • terraform destroy

세부적인 부분은 도큐먼트가 잘 나와있어서 검색하면서 추가하면 될 것 같다
https://www.terraform.io/docs/providers/aws

웹 콘솔을 켜놓고 확인하면서 돌려봤는데 의도한 대로 잘 만들어지는 편이다.

좀 힘들다 싶으면 기존 웹콘솔로 설정을 한 다음에 떠다가 써도 될 것 같다
https://github.com/dtan4/terraforming
cloud formation도 복잡한 설정은 이런식으로 하는게 편했는데

cloud formation을 사용하지 않고 로컬에 .tfstate파일에 서버 상태를 저장한다

이걸 git에 저장 해 놓고 관리해야 하는데

.tfstate를 ignore 하라고 돼 있다. 어째야하는거지?

상태값은 git에 올리지 말고 별도로 관리하라는건가?

서버에 상태값이 명확히 관리되지 않는다면 그리고 aws 콘솔에서 인프라를 수정해서 state파일과 값이 맞지 않게 되는경우 문제가 발생할 가능성이 있어 보인다.
이건 cloud formation에서도 마찬가지였지만

코드화를 하려면 격리수준을 잘 잡아놔야 할 것 같다.

vpc단계, 태그, organization 등등 여러 방법이 있겠지만…

Organization을 아예 서비스별로 분리해서관리하면 문제가 발생할 여지가 작아질 것 같다.
terraform destroy가 company destroy가 되지 않도록 하는 안전장치도 별도로 마련해야 할 것 같고

~~

CloudFormation은 Provider에 따라
* Mailgun
* AWS
* Docker
* Github
* Yandex
* Helm
* Trello
* Tumblr

별 쓸데없는것까지 다 할 수 있는 것 같다.
요즘엔 클라우드 엔지니어도 아닌데 인프라만 너무 만지는거 아닌가

윈도우 작업용 Windows Workstation

오픈쏘쓰

한방설치 스크립트. 툴까지 설치는 아니고 라이브러리류만인듯 중복되는 부분 확인 못해서 아직 사용안함
https://github.com/microsoft/windows-dev-box-setup-scripts

설치

WSL

https://aka.ms/wslinstall
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

윈도우 앱스토어

여긴 자동화가 되나 모르겠다 수동으로 클릭

OneNote
Slack
Arduino IDE
Ubuntu
Ubuntu 18.04 LTS
WIndowsTerminal (Preview)
Terminus – SSH client
DBeaver CE
NuGet Package Explorer
Microsoft Edge DevTools Preview
MQTTBox

Ubuntu 실행하면 설치 진행

Scoop ( https://scoop.sh )

윈도우+x - a 
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
scoop install -g `
7zip `
git `
gzip `
less `
nano `
sed `
curl `
grep
scoop bucket add java
scoop install openjdk11
scoop install `
adb `
eksctl `
aws-iam-authenticator `
aws `
aws-vault `
terraform `
go `
ghostwriter `
github `
gradle `
grails `
graphviz `
groovy `
haskell stack `
kotlin `
lua-for-windows `
maven `
mono `
nvm `
perl `
putty `
r `
sbt `
scala

scoop install `
erlang `
flyway ` 

scoop bucket add extras
scoop install `
gcloud

#scoop install -g  wireshark nmap

scoop install  `
jetbrains-toolbox `
winscp `
postman `
foobar2000 `
rufus

# 그냥 수동설치
# android-sdk
# flutter

oh-my-posh

scoop install conemu
scoop install conemu-color-themes
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
# Start the default settings
Set-Prompt
# Alternatively set the desired theme:
Set-Theme Agnoster
# https://github.com/gluons/powershell-git-aliases
Install-Module git-aliases -Scope CurrentUser -AllowClobber

Chocolatey ( https://chocolatey.org/ )

윈도우+x - a
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install -y anaconda3

choco install -y `
googlechrome `
firefox `
ccleaner `
notion `
filezilla `
hostsman `
bandizip `
notepadplusplus `
vscode `
atom `
gimp `
inkscape `
packer `
googledrive `
dropbox `
synologydrive `
dolphin `
ninja `
openoffice `
mysql.workbench `
pgadmin3 `
gow `
cygwin `
cyg-get `
wsltty `
msys2 `
sourcetree

choco install -y bitwarden 1password keepassx

choco install -y ruby
choco install -y wireshark

choco install -y `
microsoft-windows-terminal `
visualstudio2019community

# autohotkey.portable \ # scoop
# teamviewer \ # 안써서
# virtualbox \ # hyperv
# virtualbox-guest-additions-guest.install # hyperv

# nuget.commandline \ # scoop???
# slack \ # marketplace

Babun ( http://babun.github.io/ )

개발중단..

pact install tmux

Babun에서는 안쓰는게 좋을것같고 윈도우+x – i

강화 PowerShell (oh-my-posh)

https://github.com/JanDeDobbeleer/oh-my-posh

# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-6
# All Users, All Hosts
 $PSHOME\Profile.ps1
# All Users, Current Host
 $PSHOME\Microsoft.PowerShell_profile.ps1
# Current User, All Hosts
 $Home\[My ]Documents\PowerShell\Profile.ps1
# Current user, Current Host
 $Home\[My ]Documents\PowerShell\
Microsoft.PowerShell_profile.ps1

# 위에거 다 안되고 아래걸로. 원드라이브 Documents가 따로 잡혀있으면 거기로
# $Home\[My ]Documents\WindowsPowerShell\
Profile.ps1 
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox
Import-Module git-aliases -DisableNameChecking

미확인

noobs-term ( https://noobs-term.com/ )

가상환경

virtualbox는 같은 vagrant 소스로 리눅스 맥에서도 사용가능
그래도 윈도우에서는 hyperv쓰는게 편하긴한데
https://stefanscherer.github.io/how-to-install-docker-the-chocolatey-way/

VirtualBox

choco install -y `
virtualbox `
docker-toolbox

Hyper-V

https://docs.microsoft.com/ko-kr/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
choco install -y docker-desktop docker-kitematic

추가설치

scoop install `
vagrant minikube kubectl`
# docker docker-compose

https://github.com/hashicorp/vagrant/wiki/Available-Vagrant-Plugins

vagrant plugin install `
sahara `
vagrant-aws-dns `
rubber

Docker Volume 중첩해서 셋팅하는 경우 발생하는 문제 확인

초기 디렉토리 구조 생성

➜  $ tree
 .
 ├── test1
 │   ├── test1
 └── test2
     └── test2
$ cat test1/test1
test1 file
$ cat test2/test2
test2 file

도커에서 볼륨을 셋팅하고 실행

$ docker run --rm -it \
-v $(pwd)/test1:/test \
-v $(pwd)/test2:/test/kkk \
-v $(pwd)/test2/test2:/test/test2file \
-v $(pwd)/test1/test1:/test/test1file \
-v $(pwd)/test2:/test/kkk1 \
alpine sh

도커 실행 후 HOST에서 봤을 때 변경된 파일구조

$ tree
 .
 ├── test1
 │   ├── kkk
 │   ├── kkk1
 │   ├── test1
 │   ├── test1file
 │   └── test2file
 └── test2
     └── test2

도커 실행 후 Container 내부에서 변경된 파일구조

# tree
 .
 ├── kkk
 │   └── test2
 ├── kkk1
 │   └── test2
 ├── test1
 ├── test1file
 └── test2file

volume 마운트 시켰는데 파일이 복사돼버림

중복된 마운트를 할 경우 생각과 다르게 동작할 가능성

Vagrant box 추천

vagrant 박스 – 공식 박스가 배포되는 경우

debian/stretch64
ubuntu/bionic64
centos/7

공식은 아니지만 여기도 종종 사용하고
bento/ubuntu-18.04이렇게 공식박스를 제공하는 곳도 있지만…

문제는.. 
openbsd, fedora 등 오픈소스진영은 배포자가 관리 주체가 불확실한 경우가 많다
대부분 virtualbox 버전만 제공된다.

parallels, hyperv는 개인이 만든걸 쓰거나 직접 만들어야된다.

그래서 윈도우에 virtualbox를 깔고 쓰게 되는데…

그러다가 발견한 이 계정.

https://app.vagrantup.com/generic

1) hyperv
2) libvirt
3) parallels
4) virtualbox
5) vmware_desktop

다있음.