194
< 야생의 : 듀랑고 > 지형 관리 완전 자동화 생생한 AWSDocker 체험기 넥슨코리아 변수민

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Embed Size (px)

Citation preview

Page 1: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

<야생의 땅: 듀랑고> 지형 관리 완전 자동화생생한 AWS와 Docker 체험기

넥슨코리아

변수민

Page 2: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

발표자 소개

<야생의 땅: 듀랑고> 서버 프로그래머 @넥슨코리아

Computer Science, MS @University of Arizona

Computer Science, BS @University of Arizona

Research Programmer @University of Arizona

2010

2011

2012

2013

2014

2015

2016

소프트웨어 엔지니어 @스포카

Page 3: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

듀랑고 서버 개발자는 무슨 일을 할까요?

지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터

검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, …

Page 4: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

듀랑고 서버 개발자는 무슨 일을 할까요?

지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터

검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, …

그 중에 제가 맡고 있는건 이정도…?

Page 5: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

듀랑고 지형 통계

• 2차 LBT 참여자 수 = 6,937명

• 테스트 기간동안 발견된 섬의 수 = 836개

• 인구가 가장 많은 섬 = 플레밍 우랄맥 (504명)

Page 6: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 자동 생성

• 이번에 준비한 지형 개수 = 약 300개

• 지형을 수작업으로 만드는 것이 아니라 자동으로 생성하기 때문에 가능한 일

Page 7: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

섬? 지형?

지형

+ =지질, 온도, 습도,

호수, 강, 바다,

식물 배치

섬세부 사항

(섬 생성시 자동 결정)

Page 8: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

섬? 지형?

지형

+ =지질, 온도, 습도,

호수, 강, 바다,

식물 배치

섬세부 사항

(섬 생성시 자동 결정)

Page 9: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

문제점: 지형 관리 병목

• (지형 스냅샷 작업중…)

• “수민님, 지형 배포 해주세요”

Page 10: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

문제점: 지형 관리 병목

• (장터 검색 기능 작업중…)

• “수민님, 무슨무슨 섬에 생태계 시뮬레이션 돌려주세요”

Page 11: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

그러다보니 다른 작업에 집중하기 어려움

Page 12: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

해결책: 자동화를 하자

• 도전 과제는 크게 두 가지

• 지형 배포 - 지형 배포 자동화

• 자연물 관리 - 자연 상태 파악, 생태계 시뮬레이션 자동화

Page 13: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

오늘 이야기 할 내용들

• <야생의 땅: 듀랑고>의 지형 제작과 배포, 생태계 시뮬레이션

• 지형 관리 자동화 과정에서 겪었던 문제들을 아마존 웹 서비스(AWS)와

Docker를 이용해서 해결한 이야기

Page 14: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 제작과 배포 과정<야생의 땅: 듀랑고>의 지형은 어떻게 만들어질까?

Page 15: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 제작 & 배포 개요

• 전용 도구로 지형 파일들을 제작

• 여러가지 후처리를 거친 후

• 지형 파일을 Git 저장소에 올리고

• 서버 코드에서 해당 커밋을 참조하도록 변경

Page 16: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 제작 & 배포 도구

• WorldGen: 지형 파일 제작, C#으로 작성됨

• 지형 관리 도구: 지형 배포 및 관리에 필요한 기능을 제공, Python으로 작성됨

Page 17: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 관리 도구를 따로 만든 이유는

• 서버 코드가 파이썬으로 작성 되어있고

• 지형을 배포할 때 서버 코드를 그대로 이용하는 부분이 있기 때문

• 월드젠은 서버 코드와는 별개로 지형 파일만 제작

Page 18: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

지형 제작 도구 ‘월드젠’을 이용하여 지형을 제작

Page 19: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

청크별 빠른 색인을 위해 여러가지 지형 정보들을 청크별로 나눔

Page 20: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

좌표 시스템

• cm 단위의 좌표: 동물의 위치 등 섬세한 위치 조정에 사용

• 타일(tile): 가로 세로 2m의 정사각형 ➔ 자연물, 건축물 등의 최소 단위

• 청크(chunk): 16x16 타일 ➔ pub-sub 토픽, 분산의 최소 단위

Page 21: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

청크별로 나누는 이유?

(x, y)

(x-1, y)

(x+1, y)

(x+1, y+1)

(x-1, y-1)

(x+1, y-1)

(x, y-1)

(x, y+1)

(x-1, y+1) {군계 정보

강, 바다, 호수 정보

자연물 배치 정보

청크 좌표

플레이어의 시야

Page 22: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자연물?

자연물 = 식물, 광물, 기타 채집 가능한 것

Page 23: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

자동화된 검수 과정을 거침

assert x == yassert z == wassert essential_files_exist()assert terrain_contains_this_and_that()assert validate_chunked_tiles()

Page 24: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

• 지형 색인 파일 업데이트

• 지형 파일들을 지형 파일 저장소(Git)에 커밋 & 푸시

Page 25: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

Git 서브모듈 업데이트

• (서버 코드 저장소)• README• setup.py• lib

• k1terrains.git• tests

• (지형 파일 저장소)• README• terrains

• (아까 만든 지형)• (기존 지형 1)• (기존 지형 2)

• tests

HEAD

Page 26: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 파일 관리에 Git을 쓰는 이유?

버전 1

지형 1

서버 저장소

지형 저장소 지형 2 지형 3

버전 1

지형 1

서버 저장소

지형 저장소 지형 2 지형 3

버전 2

지형 4

서버 코드와 함께 버전 관리를 하기 위함 없어진 지형을 참조하는 것을 방지

Page 27: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 파일 관리에 Git을 쓰는 이유?

• 입사 전에 이미 만들어진 시스템이라 지형 파일을 Git으로 관리하는 것에 대한 별다른 의문을 가지지 않았지만

• 의문을 가져야 했었다

Page 28: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 절차

• 복잡해보이지만 대부분 스크립트로 만들어 놓음

• 하지만 프로그래머가 아닌 사람이 보기엔 여전히 장벽이 높음 이 부분에 대한 고민도 했어야…

Page 29: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

생태계 시뮬레이션나무를 심자

그림 © 강임성, 2015

Page 30: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

플레이어들은 항상 무언가를 채집

벌목당한 숲울창한 나무 숲

Page 31: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

훼손 상태를 파악

섬의 최초 상태와 비교하여 부족한 자연물의 종류와 수량을 파악

Page 32: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자연물 보충

훼손 상태가 임계점을 넘을 경우 필요한 자연물 종류와 개수를 생태계 시뮬레이터에 전달

지형 관리 도구 Ecosystem Simulator

산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3

Manifest

Page 33: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자연물 보충

지형 관리 도구 Ecosystem Simulator

산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3

산딸기 (132, 39), (133, 38), … 깃털나무 (88, 255), … 멀구슬나무 (187, 321), … 백단향 (308, 209), …

Page 34: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

생태계 시뮬레이션

Frontend node 1

Frontend node 2

Frontend node n

서버 클러스터

Ecosystem Simulator

지형 관리 도구

로컬 머신

데이터베이스

Page 35: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 관리 자동화 요구조건

• 고성능 계산 능력이 필요

• 플레이어의 행동에 따라 실행 주기, 작업 규모가 달라질 수 있음

• 여러대의 머신에서 동시에 실행될 수 있고

• 자유로운 스케일 아웃(scale-out)

Page 36: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 관리 시스템에 필요한 것들

Ubuntu Linux

.NET runtime (mono)Python runtime

Python package 1

Python package 2

Python package n

…Libraries

System tools

서버 코드 지형 관리 도구Other utilities

복잡한 지형 관리 시스템 구성

Page 37: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 관리 도구 배포

지형 관리 도구 + 필요한 것들

머신 1 머신 2 머신 3 머신 n…

Page 38: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 관리 도구 배포

배포 스크립트 복잡도

배포할

머신의

실패할

확률

Page 39: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

배포가 쉬워야 함

• 일회용 컴퓨팅 인스턴스, 탄력적 스케일링

• 여러대의 머신에 배포

• 쉽고 신뢰성 있는 배포 방식이 필요

Page 40: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

그렇다면 Docker를 써보자

Page 41: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Got Docker?Docker의 세계에 빠져보자

Page 42: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker?

• 소프트웨어가 구동되는데 필요한 모든 것 - 코드, 런타임 환경, 시스템 도구, 라이브러리 등 - 을 담고 있는 컨테이너를 제공

• 소프트웨어 배포에 관련된 여러가지 문제를 해결

Page 43: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

전통적인 소프트웨어 배포 방식의 문제점

• 배포 환경마다 커널 버전, 설치된 라이브러리 등 런타임 환경이 상이함

• 개발자들의 전통적인 변명 “It works on my machine!”

Page 44: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

문제는 표준 규격의 부재

• 소프트웨어 배포 방식의 표준이라고 할만한 것이 없음배포 스크립트, 가상 머신 이미지, Chef/Puppet, 인스톨러

• 우리가 작성하는 프로그램이 수많은 외부 환경에 의존적인 것도 문제 커널 버전, 라이브러리, 프레임워크, 인터프리터

Page 45: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

컨테이너물류 업계는 ‘컨테이너’라는 통일된 규격을 만들어서 물건의 종류에 상관 없이 전세계 어디로든

배송 가능하도록 문제를 해결했는데 우리는 왜 그렇게 하지 못할까

Page 46: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

그래서 고안된 것이 바로 Docker

• 컨테이너 안에만 들어가면 옥수수든 아이폰이든 물건의 종류의 상관 없이 원하는 목적지까지 보낼 수 있다

• Docker 컨테이너로 패키징 된 소프트웨어는 Docker 실행 환경이 갖추어진 곳에서는 별다른 배포, 설치 절차 없이 바로 실행할 수 있다

Page 47: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 48: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 49: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 50: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 51: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 52: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 53: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

소프트웨어 배포의 일곱가지 죄악• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 54: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker가 해결해줄 수 있는 문제• 나태: 배포 스크립트 미작성

• 탐욕: 싸구려 스테이징 서버

• 식탐: 대규모 변경

• 교만: 코드를 충분히 테스트하지 않음

• 색욕: 검증되지 않았지만 매력적인 도구들

• 시기: 구성원들간 의사소통이 원활하지 않음

• 분노: 현장 디버깅

https://lwn.net/Articles/562333/

Page 55: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

가상머신으로도 그런 문제를 해결할 수 있지 않나요?

• 격리: 하나의 호스트 OS에서 여러개의 게스트 OS를 실행하더라도 개별 게스트 OS 안에서 보기엔 독립된 머신처럼 보임

• 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음

Page 56: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker의 장점

• 격리: 하나의 호스트에서 여러개의 Docker 컨테이너를 실행하더라도 개별 컨테이너 안에서 보기엔 독립된 머신처럼 보임

• 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음

• 자원 효율성: 각 컨테이너마다 커널을 따로 띄울 필요가 없음

Page 57: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker의 장점

Virtual Machines Docker Containers

Images excerpted from https://www.docker.com/what-docker

이렇게 각 게스트 OS를 실행하기 위해서 낭비되는 자원이 없음

Page 58: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker의 장점

• 같은 성능의 호스트 머신이라도 더 많은 컨테이너를 띄울 수 있음

• 실제로 테스트 기간동안 하나의 머신에 수십개의 컨테이너를 띄우기도 했음

Page 59: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker의 비밀

• 가상머신 없이 컨테이너마다 다른 환경을 갖출 수 있다니, 어떻게?

• 그 비밀은 바로 chroot

Page 60: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

• chroot = change root directory

• Chroot is an operation that changes the apparent root directory for the current running process and their children. A program that is run in such a modified environment cannot access files and commands outside that environmental directory tree. This modified environment is called a chroot jail.

(C) Warner Bros., 1999

Page 61: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

//bin/boot/dev/etc/home/lib…

일반적인 리눅스 디렉토리 구조

Page 62: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

임의의 디렉토리 안쪽에리눅스 시스템을 구성하는 파일들을 넣고

//bin/boot/dev/etc/home/home/anotherworld

/bin/boot/dev/etc…

Page 63: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot//bin/boot/dev/etc/home/home/anotherworld

/bin/boot/dev/etc…

chroot /home/anotherworld 명령어를 실행하면 - 레드썬! 마치 다른 OS로 부팅한 것 같은 느낌 (커널은 바뀌지 않음)

Page 64: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

chroot /home/anotherworld /home/anotherworld/bin/bash

Page 65: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

chroot /home/anotherworld /home/anotherworld/bin/bash

새로운 루트 디렉토리

Page 66: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

chroot

chroot /home/anotherworld /home/anotherworld/bin/bash

새로운 루트 디렉토리루트 디렉토리가 변경될 때실행될 명령어(생략 하면 현재 쉘)

Page 67: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker 프로세스 안의 또 다른 세상

786 ? Ssl 1:12 /usr/bin/docker -d 1534 ? Ss 0:00 \_ /bin/bash /entrypoint 1601 ? Sl 1:19 | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -- -root /opt/couchbase/lib/er 1705 ? Ssl 633:23 | | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -sbt u -P 327680 -K true - 1733 ? Ss 0:01 | | | \_ sh -s disksup 1734 ? Ss 0:08 | | | \_ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/memsup 1735 ? Ss 0:00 | | | \_ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/cpu_sup 1738 ? Ss 0:09 | | | \_ inet_gethost 4 1739 ? S 0:05 | | | | \_ inet_gethost 4 1757 ? Ssl 84:42 | | | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -P 327680 -K true -- -root /

Page 68: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker 프로세스 안의 또 다른 세상

786 ? Ssl 1:12 /usr/bin/docker -d 1534 ? Ss 0:00 \_ /bin/bash /entrypoint 1601 ? Sl 1:19 | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -- -root /opt/couchbase/lib/er 1705 ? Ssl 633:23 | | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -sbt u -P 327680 -K true - 1733 ? Ss 0:01 | | | \_ sh -s disksup 1734 ? Ss 0:08 | | | \_ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/memsup 1735 ? Ss 0:00 | | | \_ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/cpu_sup 1738 ? Ss 0:09 | | | \_ inet_gethost 4 1739 ? S 0:05 | | | | \_ inet_gethost 4 1757 ? Ssl 84:42 | | | \_ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -P 327680 -K true -- -root /

Docker process

Page 69: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

진짜 천재같은 발상이다

Page 70: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

그럼 Docker 컨테이너는 어떻게 만드나요?

Page 71: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile

• Docker 이미지를 빌드하는 절차를 명시한 파일

• 명령어 하나당 레이어 하나

• 레이어를 쌓아 올리는 방식 - 재사용성

• 재현성 보장 (guaranteed repeatability)

Page 72: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

Page 73: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

베이스 이미지 지정

Page 74: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

관리자 지정

Page 75: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

환경변수 설정

Page 76: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

소프트웨어 패키지 업데이트 & 설치

Page 77: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

작업 디렉토리 변경

Page 78: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

명령어 수행

Page 79: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh

로컬 파일 복사

Page 80: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerfile 예제FROM ubuntu:14.04MAINTAINER Sumin Byeon <[email protected]>

ENV SOME_FLAG=1

RUN apt-get update && apt-get install -y (some packages)

WORKDIR /opt/k1ecoRUN pip install -e .

COPY startup.sh ./

CMD ./startup.sh 진입점 명령어 지정 (오버라이드 가능)

Page 81: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Building a Docker Image

Page 82: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Building a Docker Image

• docker build /opt/docker-image

Dockerfile이 있는 디렉토리

Page 83: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Building a Docker Image

• docker build /opt/docker-image• docker build -t ${저장소 주소}/k1eco-complete .

Dockerfile이 있는 디렉토리

이미지 태그

Page 84: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Image

28b3321d1682 124.3 MB

7e0641b95986 294.7 KB

e16121a2089f 7.831 KB

876fc4769c5a 1,894 KB

k1eco-complete:latest

577f02323aaf 1.052 KB

Page 85: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Image

28b3321d1682 124.3 MB

7e0641b95986 294.7 KB

e16121a2089f 7.831 KB

876fc4769c5a 1,894 KB

k1eco-complete:latest

RUN apt-get install

RUN pip install -e .

COPY startup.sh ./

CMD startup.sh

577f02323aaf 1.052 KB

MAINTAINER Sumin Byeon

Page 86: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash

Page 87: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash

이미지 이름만으로 실행, 암시적으로 최신 버전

Page 88: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash

이미지 이름과 버전을 명시해서 실행

Page 89: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash

데몬으로 (백그라운드에서) 실행

Page 90: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash

포트 매핑 & 환경 변수

Page 91: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Running a Docker Image

• docker run postgres• docker run postgres:9.4• docker run -d postgres• docker run -d -p 5432:5432 -e ENV=value postgres• docker run -i -t postgres /bin/bash 인터랙티브 모드로 실행

Page 92: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Container

f028ae8823c8 2.432 KB

e16121a2089f 7.831 KB

876fc4769c5a 1,894 KB

k1eco-complete:latest

577f02323aaf 1.052 KB

Thin R/W layer Container layer

Image layers(read only)

Page 93: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Container

f028ae8823c8 2.432 KB

e16121a2089f 7.831 KB

876fc4769c5a 1,894 KB

k1eco-complete:latest

577f02323aaf 1.052 KB

Thin R/W layer Container layer

Image layers(read only)이미지 빌드가

끝나면 이 상태

Page 94: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Container

f028ae8823c8 2.432 KB

e16121a2089f 7.831 KB

876fc4769c5a 1,894 KB

k1eco-complete:latest

577f02323aaf 1.052 KB

Thin R/W layer Container layer

Image layers(read only)

이미지를 실행하면레이어가 추가됨

Page 95: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker Container

> Containers that write a lot of data will consume more space than containers that do not. This is because most write operations consume new space in the container’s thin writable top layer. If your container needs to write a lot of data, you should consider using a data volume.[^1]

[^1]: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/

Page 96: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Storage Drivers

Docker는 다양항 종류의 스토리지 드라이버를 제공

잘 모르겠으면 그냥 기본값으로 되어있는걸 쓰자

Page 97: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Content Addressability

876fc4769c5a 1,894 KB

File contents

Cryptographic hash function

Page 98: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Content Addressability

8b9022a8dfe4 696.9 KB

876fc4769c5a 1,894 KB

27f381189a32 87.49 KB

1a86c4c9077a 353.1 KB

39387babad77 1.327 MB

876fc4769c5a 1,894 KB

32132a7c82e9 1,994 KB

6467734fa93c 2.403 MB

이미지 1 이미지 2

서로 다르게 빌드된 이미지라도 같은 내용을 가진 레이어가 있다면 상호간 공유 가능

Page 99: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dockerizing

• 애플리케이션이 Docker 환경에서 실행될 수 있도록 하는 일

• 입력은 환경 변수로 받고, 출력은 표준 출력으로(필수는 아니지만 이렇게 하면 일이 여러가지로 쉬워짐)

• 포트 매핑

Page 100: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

우리가 빌드한 Docker 이미지들

런타임 환경

k1eco-base

런타임 환경

지형 관리 도구

k1eco-complete

Page 101: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

우리가 빌드한 Docker 이미지들

런타임 환경

k1eco-base

런타임 환경

지형 관리 도구

k1eco-complete

CI

Page 102: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

우리가 빌드한 Docker 이미지들

지형 관리 도구

런타임 환경

k1eco-base

런타임 환경

지형 관리 도구

k1eco-complete

CI

Page 103: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

우리가 빌드한 Docker 이미지들

지형 관리 도구

런타임 환경

k1eco-base

런타임 환경

지형 관리 도구

k1eco-complete

CI

Page 104: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

로컬 개발 환경

• 로컬 개발 환경은 갖추어졌다

• 프로덕션 런타임 환경은?

• Docker 이미지는 어디에 저장하지?

Page 105: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

EC2 Container ServiceLife was much simpler when Amazon was just a forest

CC Shawn O’Neil, 2013 <https://www.flickr.com/photos/oneilsh/14601920735>

Page 106: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

EC2 Container Service (ECS)

• Docker 컨테이너들을 실행하고 관리할 수 있는 환경과 도구를 제공

• 컨테이너를 실행하기 위해서는 EC2 인스턴스가 필요

• Docker 이미지를 저장할 수 있는 레지스트리 서비스인 ECR을 제공

Page 107: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Container Instance

• Docker 이미지가 실행되는 가상머신

• Docker 실행 환경 + ECS 데몬

• 개별 컨테이너 인스턴스에 신경쓰지 않고 Docker 컨테이너만 실행할 수 있는 서비스였으면 좋았겠지만… Docker 엔진의 일부 동작이 루트 권한을 요구하기 때문에 보안상의 이유로 그렇게 하기 어렵지 않았을까 하는 추측

Page 108: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Cluster

• EC2 컨테이너 인스턴스를 묶는 논리적 그룹

• 한 개 이상의 EC2 인스턴스로 구성

• 각 지역마다 고유함(region-specific)

Page 109: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Task Definition

• Docker 컨테이너의 속성을 정의하는 JSON 문서

• CPU, 메모리 요구 사항, 포트 매핑, 저장소 마운트, 환경 변수 정의, 컨테이너

이름 지정, 다른 컨테이너와 연결 등

• 많은 경우에 Docker 이미지 ≠ 수행하고자 하는 일

Page 110: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Task Definition

ECS

Override • Env. variables • Port mappings • Command

Task Definition

Image excerpted from http://plainicon.com/download-icon/50348/docker

Container

Page 111: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Task Definition

ECS

Override • Env. variables • Port mappings • Command

Task Definition

Image excerpted from http://plainicon.com/download-icon/50348/docker

Container

X

Page 112: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Task Definition

ECS

Override • Env. variables • Port mappings • Command

Task Definition

Image excerpted from http://plainicon.com/download-icon/50348/docker

Container

X

Page 113: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Task Definition

ECS

Override • Env. variables • Port mappings • Command

Task Definition

Image excerpted from http://plainicon.com/download-icon/50348/docker

Container

X

Page 114: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Docker 이미지를 어디에 저장하지? ➔ ECR

• EC2 Container Registry

• 아마존에 의해서 관리되는(fully-managed) Docker 이미지 저장소 서비스

• 인증 절차를 제외하고는 도커 허브(Docker Hub)와 동일한 방법으로 이용

• (2016년 4월) 현재는 버지니아 지역(us-east-1)에서만 이용 가능

Page 115: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

ECS 클러스터와 ECR이 같은 지역에 있어야 하는 줄 알았어…

그래서 도쿄-버지니아 VPC간을 연결하는 VPN 망 구성하지만 ECS 클러스터가 버지니아 이외의 지역에 있어도 된다는 것을 나중에 깨달음

VPN

Tokyo VA

Page 116: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

다소 먼 길을 돌아왔지만

• 미래에는 다른 지역에도 <야생의 땅: 듀랑고>를 런칭할 계획도 있으니, 지역간 VPN 구축 작업이 시간 낭비는 아니었음

Page 117: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

어부지리로 비용 절감

• c4.xlarge, 온-디맨드 인스턴스 기준

• 도쿄: $0.265/hr

• 버지니아: $0.209/hr

• 27% 차이

Page 118: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

어부지리로 비용 절감

• 일주일간의 베타 테스트 기간동안 다양한 타입의 인스턴스를 켜놓았는데

• c4.xlarge 기준으로 인스턴스당 $9.408 절약 (1년이면 $491)

Page 119: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

AWS 비용 구조

> >Networking Computations Storage

Page 120: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Resource Utilizations

Networking Computations Storage

생태계 시뮬레이션을 담당하는 ECS 클러스터의 경우

Page 121: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화환경이 갖추어졌으니 이제 진짜 일을 시작해볼까

Page 122: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 Recap

• 지형 데이터 생성

• 지형 파일 후처리

• 지형 파일을 Git 저장소에 커밋 & 푸시

• 서버 코드 저장소에도 반영

Page 123: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 Recap

• 지형 데이터 생성

• 지형 파일 후처리

• 지형 파일을 Git 저장소에 커밋 & 푸시

• 서버 코드 저장소에도 반영

이 부분을 좀 개선할 수는 없을까

Page 124: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

We’ve been abusing Git

• Git은 바이너리 파일을 다루기에 적합하지 않음

• 지형을 추가, 수정할수록 히스토리가 걷잡을 수 없이 커지는 문제

• 지형 파일 저장소를 서버 코드 저장소의 서브모듈 형태로 관리, 사용하지 않는 지형까지 모두 체크아웃

• Docker 이미지를 빌드할 때에도 모든 지형이 다 들어가기 때문에 자원 낭비 지형 관리 도구가 서버 코드를 포함하고, 서버 코드 저장소가 지형 저장소를 포함하고 있기 때문에…

Page 125: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Dropping Git

• 지형 관리 프로세스에서 Git을 완전히 빼기로 결정함

Page 126: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 시스템 개편

• 지형 파일을 Git 저장소에 저장

• 서버 코드 저장소에서 서브모듈로 지형 저장

소를 참조

• 서버 노드마다 모든 지형 파일을 다 가지고

있음

2세대1세대

• 지형 파일을 AWS S3에 저장

• 서버 설정 파일에 저장된 지형 ID를 참조

• 실제로 사용하는 지형만 그때그때 받아옴

Page 127: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 2세대

• 지형 데이터 생성

• 지형 파일 후처리

• 지형 파일을 지형 저장소(S3)에 올리기

• 서버 코드 저장소에도 반영

Page 128: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 2세대

• 지형 데이터 생성

• 지형 파일 후처리

• 지형 파일을 지형 저장소(S3)에 올리기

• 서버 코드 저장소에도 반영

이 과정을 자동화

Page 129: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

지형 파일

Page 130: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

S3

지형 파일

Page 131: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

S3Lambda

SQS

지형 파일

Page 132: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 133: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 134: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

CloudWatch

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 135: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

잠깐!

• S3?

• Lambda?

• SQS?

• CloudWatch?

Page 136: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

CloudWatch

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 137: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Simple Storage Service (S3)• 오브젝트 스토리지

• 주로 파일을 저장하는데 사용

• 상당수의 POSIX 파일시스템 시맨틱을 제공하지는 않지만, 높은 확장성(scalability)을 제공

• Object versioning

• Multi-regional replications ➔ high-availability

Page 138: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Simple Storage Service (S3)

.whl

S3

지형 파일

에셋 파일

.zip

로그 파일

Page 139: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

CloudWatch

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 140: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Lambda

• (사용자가 따로 서버를 마련하지 않고) AWS의 기반 시설에서 코드를 수행할 수 있는 서비스

• Java 8, Node.js 0.10, Node.js 4.3, Python 2.7

Page 141: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Lambda• 명시적으로 호출할 수도 있고

• AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거

• S3에 파일이 올라오거나

• DynamoDB의 레코드가 업데이트 되거나

• Kinesis 스트림에 데이터가 들어오거나

• CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나

Page 142: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Lambda• 명시적으로 호출할 수도 있고

• AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거

• S3에 파일이 올라오거나

• DynamoDB의 레코드가 업데이트 되거나

• Kinesis 스트림에 데이터가 들어오거나

• CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나

우리는 이것을 이용

Page 143: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Lambda• 여러가지 제한들

• 최대 수행 시간: 300초 (5분)

• 코드 패키지 최대 크기: 250MB

• 사용할 수 있는 디스크 공간: 512MB

• (다른 제한들도 많지만, 공간이 협소하니 자세한 내용은 AWS 문서를 참고)

• 메모리 사용량, ms 단위로 측정된 수행 시간을 기준으로 과금

Page 144: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Lambda

• 오래 걸리거나 자원 사용량이 많은 코드 (X)

• Lambda에서 직접 처리하는 대신 ECS 태스크를 띄우기 (O)

Page 145: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

CloudWatch

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 146: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Simple Queue Service (SQS)

• 분산 메세지 큐 서비스

• 신뢰성 있는 메세지 전달 보장

• 높은 확장성(scalability), 높은 가용성(availability)

Page 147: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Simple Queue Service (SQS)

Producer ConsumerB U F F E R \0

Producer

Producer

Consumer

Consumer

Page 148: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 배포 자동화 시스템

CloudWatch

ECSS3

Lambda

SQS

지형 파일

지형 배포

Page 149: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

CloudWatch

• AWS의 여러가지 자원을 모니터링 할 수 있는 서비스

• 각 서비스에 대한 여러가지 지표(metrics)들을 제공,사용자 정의 지표도 가능

• 로그 수집, 알람 기능

Page 150: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자동화 된 지형 파일 배포

• 로컬 가상머신에 지형 파일을 준비

• 지형 배포 명령어를 수동으로 수행

• 서버 코드 저장소에 변경사항 반영

• 프로그래머의 개입이 필요

자동화 시스템기존 시스템

• 지형 파일을 S3에 업로드

• S3이벤트 트리거에 의해서 자동으로 지형

배포 태스크 실행

• 처리된 지형 파일들을 S3에 저장

• 프로그래머가 필요 없음우리의 일자리가 위험…읍읍

Page 151: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자동화 된 지형 파일 배포

지형 파일 올리기 지형 파일 후처리 지형 저장소에 커밋 서버 저장소 업데이트

지형 파일 올리기

지형 제작자 프로그래머 프로그래머 프로그래머

지형 제작자

지형 파일 후처리 지형 저장소에 업로드

자동화 전

자동화 후

Page 152: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

그러던 어느날

• CI 머신에서 디스크 용량 부족 오류 메세지가 뜨기 시작

• 디스크 사용량은 50% 미만이라 당황(!)

• 알고보니 파일 개수가 많아서 사용 가능한 inode를 모두 소진

• 몇년마다 한 번씩 겪는 문제라 매번 낚임. 오류 메세지를 수정해서 리눅스 커널

패치를 보내볼까…

Page 153: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

너무 많은 파일 개수

• 지형 개수 = 약 1,000개 (미사용 지형 포함; 베타테스트 시작 전 갑자기 많아짐)

• 지형별 파일 개수 = 지형의 크기에 따라서 1,000-400,000개

• 총 파일 개수 = 약 1,300,000

• CI가 다섯번만 돌면 inode 모두 소진

Page 154: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

해결책: .zip으로 압축하자

• 하나의 지형당 파일 하나

• 지형 배포 코드, 서버 코드에서 지형 파일 읽어오는 부분만 재빠르게 수정

• 더이상 안 쓰는 지형 파일도 지우자

Page 155: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

또다른 문제점: .zip 파일 성능 병목

• 파일 개수가 많다보니 .zip 파일을 열기 위해서 많은 메모리를 사용

• 파일 색인을 위한 트리 구조를 메모리에 가지고 있기 때문

Page 156: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

해결책: 전용 포맷을 만들자

• 지형 속성별(군계, 강, 호수, 바다, 온도, 습도, 랜드마크 등) 파일 한 개

• 청크 좌표만 가지고 바로 읽어올 수 있는 고정 크기 파일

• Sparse data일때 용량 낭비가 있지만, 스토리지는 싸니까 괜찮아!

Page 157: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 파일 성능 문제는 일단 해결이 되었도다

Page 158: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

생태계 시뮬레이션 자동화플레이어들이 나무를 마구 베어도 걱정 없어요

Image excerpted from https://en.wikipedia.org/wiki/Computer_simulation#/media/File:Typhoon_Mawar_2005_computer_simulation_thumbnail.gif

Page 159: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

생태계 시뮬레이션 Recap

• 자연 상태 파악

• 부족한 자연물 보충

Page 160: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자연 상태 파악

(0, 0): ♣(5, 0): ♦(3, 1): ♣(4, 1): ♤(2, 2): ♣(3, 2): ♤(4, 2): ♣

♣ ♦

♣ ♤

♣ ♤ ♣

♡ ♦

♠ ♦ ♤

♡ ♠ ♦

Page 161: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

자연 상태 파악

디버깅 도구에서 본 가든 스냅샷

Page 162: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

주기적으로 자연 상태 파악

• 모든 섬을 돌아다니며 자연 상태를 전수 조사

• 간단하게 구현할 수 있지만 비효율적인 방법

Page 163: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

CloudWatch Events

Page 164: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

LambdaCloudWatch Events

Page 165: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

ECSLambdaCloudWatch Events

Parkranger

Page 166: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

ECSLambda

SQS

CloudWatch Events

Parkranger

Page 167: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

ECSLambda

SQS

CloudWatch Events

CloudWatch Events Lambda ECS

Parkranger

Gardener

Gardener

Gardener

Gardener

Page 168: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 주기적으로 자연 상태 파악

ECSLambda

SQS

CloudWatch Events

CloudWatch Events Lambda ECS

Parkranger

Gardener

Gardener

Gardener

Gardener

Page 169: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Parkranger, Gardener

지형 관리 도구

Parkranger(task definition)

지형 관리 도구

Gardener(task definition)

• Parkranger

• 섬의 자연 상태를 조사

• 일정 수준 이상 훼손되었을 경우 생태계 시뮬레이션 작업 요청

• 정원사

• 큐에서 시뮬레이션 작업 요청 받아옴

• 작업 요청대로 시뮬레이션 실행

+

+

Page 170: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

선택적으로 자연 상태 파악

• 사람의 손이 닿지 않은 곳이라면 굳이 조사할 필요 없음

• 채집 활동이 활발한 섬 위주로 자연 상태 파악

Page 171: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

Page 172: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

자연물 채집

Page 173: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

SQS자연물 채집

Page 174: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

SQS자연물 채집 ECS

Aggregator

Page 175: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

SQS자연물 채집 ECS

Aggregator

Page 176: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

SQS자연물 채집

CloudWatch Events Lambda ECS

Gardener

Gardener

Gardener

Gardener

ECS

Aggregator

Page 177: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

시스템 구조 - 선택적으로 자연 상태 파악

SQS자연물 채집

CloudWatch Events Lambda ECS

Gardener

Gardener

Gardener

Gardener

ECS

Aggregator

Page 178: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

이제야 마음 놓고 다른 일을 할 수 있겠군!

Page 179: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Summary

• 코드 배포 단순화 ➔ Docker

• Docker 실행 환경 ➔ ECS

• 지형 배포 자동화

• 생태계 시뮬레이션 자동화

Page 180: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Future Works이번에 해결하진 못했지만 앞으로 해결할 문제들

Image excerpted from https://commons.wikimedia.org/wiki/File:XOR_from_NOR.svg

Page 181: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Supply & Demand Mismatches

시간

채집 활동 처리 용량

Page 182: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Supply & Demand Mismatches

시간

채집 활동 처리 용량

잉여 처리 용량➔ 비용 낭비

Page 183: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Supply & Demand Mismatches

시간

채집 활동 처리 용량

잉여 처리 용량➔ 비용 낭비

부족한 처리 용량➔ 부정적 사용자 경험

Page 184: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Supply & Demand Mismatches

시간

채집 활동 처리 용량

잉여 처리 용량➔ 비용 낭비

부족한 처리 용량➔ 부정적 사용자 경험

넥슨은 어서 갈대를 뿌려라!

Page 185: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

ECS 클러스터 오토 스케일링

• CPU, 메모리 사용량 등 다양한 지표

• 지표에 따라 EC2 인스턴스의 수를 조절

하여 수요 변화에 탄력적으로 대응

• 동시 접속자, 채집된 자연물의 수와 같

은 게임 내 지표를 참조할수도…

Page 186: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Amazon Simple Workflow Service (SWF)

• Amazon SWF helps developers build, run, and scale background jobs that have parallel or sequential steps. You can think of Amazon SWF as a fully-managed state tracker and task coordinator in the cloud.[^1]

• If your app's steps take more than 500 milliseconds to complete, you need to track the state of processing, and you need to recover or retry if a task fails, Amazon SWF can help you.

[^1]: https://aws.amazon.com/swf/

Page 187: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

스팟 인스턴스를 이용한 비용 절감

• 아마존에서 미사용(unused) 컴퓨팅 자원을 싸게 파는 일종의 경매 시스템

• 수요와 공급에 따라서 가격이 실시간으로 변화

Page 188: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

스팟 인스턴스를 이용한 비용 절감

수요와 공급에 따라서 가격이 실시간으로 변화

Page 189: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

스팟 인스턴스를 이용한 비용 절감

• 일주일간의 테스트 기간동안 고성능 인스턴스들을 원래 가격의 15-20% 수준에 사용

• 특정 인스턴스 타입에 지불하고자 하는 최대 가격을 제출하고 그 가격이 시장가보다 높거나 같으면 인스턴스 사용, 시장 가격보다 낮아지면 인스턴스가 꺼짐

• 인스턴스가 꺼졌을 때 적절히 대응할 수 있는 소프트웨어 아키텍처가 필요

Page 190: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 런타임 공급

• 지형을 미리 제작하고 배포하는 것은 과도기적 해결책

• 우리의 꿈은 빌드 타임에 지형을 공급하는 것이 아니라 런타임에 공급하는 것

Page 191: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

지형 런타임 공급

지형 1

지형 2

지형 n

서버 1

서버 2

서버 3

서버 n

오늘 새로운 지형을 만들어볼까?

지형 제작 도구

지형 배포 도구

지형 풀(pool) 서버 코드 업데이트 없이필요할때마다 지형 꺼내 쓰기

Page 192: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Page 193: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

오늘 못다한 이야기는

@suminb

https://linkedin.com/in/suminb

[email protected]

Page 194: [야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

감사합니다다음에 또 만나요