System Compleat.

Deploy your application to every cloud - Azure

Techs


(younjin.jeong@gmail.com, 정윤진)


제목과 같은 내용의 설명을 원하는 경우라면 섹션 4로 바로 점프. 



1. 멀티 클라우드, 그리고 인프라? 


클라우드에 관심이 있다면 멀티 클라우드 라는 말을 한번쯤은 들어 보았을 것이다. AWS에 오토 스케일링 이라는 기능조차 없던 시절, RightScale 이라는 회사가 있었다. 이 회사는 인프라 레벨에서 템플릿의 구성과 배포를 멀티 클라우드에 할 수 있도록 해 주었던 기업이다. 물론 대부분의 인스턴스 consume 은 AWS에서 발생했다고 알고 있고, 그리고 전술했듯 AWS의 오토스케일링이 없던 시절 AWS의 API를 와 별도의 모니터링 에이전트를 사용해 부하를 측정, 특정 시점에 정밀한 오토스케일링의 구현이 이 회사가 가졌던 장점이었다. 사실 생각해 보면 매력적인 제안인데, 단 하나의 클라우드 서비스 공급자를 사용하는 것이 아닌 다양한 클라우드 공급자를 탄력적으로 사용함으로서 부하 및 장애에 대해 효율적으로 분산할 수 있다는 개념은 지금도 구성만 잘 할 수 있다면 뛰어난 운영 전략이 될 수 있다. 



http://www.rightscale.com/


다만 현재 이 회사가 오늘날 그다지 성공적(?) 이라고 말하기 힘든 이유는, 당시의 이 회사의 주요 자금원이었던 오토스케일링 기능이 AWS의 EC2에 기본 기능으로 제공이 되면서 부터였고, 또한 당시의 다른 클라우드 서비스 공급자들의 서비스가 AWS에 비해 매력적이다 라고 말하기는 다소 힘든 상황이었기 때문이다. 사실 말이야 바른말이지 몇년 전 까지만 해도 Virtual Machine 의 구동 및 관리 자체가 힘든 서비스들은 널리고 널렸었다. 따라서 이 오토스케일링의 매력 저하와 멀티 클라우드라는 컨셉 두개가 모두 잘 동작하지 않으면서 전략적으로 힘든 위기 상황을 맞이 하지 않았나 싶기도 하고 말이다. 물론 이 외에도 다양한 요인이 있었겠지만, 가장 핵심적인 사안은 이것 두가지가 아니었을까 한다. 


시대는 이제 가상화를 넘어 컨테이너를 향하고 있다. 그것이 팬시하건 좋건 나쁘건 그리고 현 상태에서 그 사용의 방법과 범위를 오인하는 사람들이 많건 적건 어쨌든 컨테이너는 Docker를 중심으로 빠르게 발전하고 있다. 이 말인 즉 인프라 레벨에서의 멀티 클라우드 사용에 장점이 있었던 RightScale은 앞으로 조금 더 힘들어 지지 않을까 하는 개인적 견해와 맞물려, '인프라'만으로서의 장점은 이제 원한다면 바로 어디에나 배포할 수 있는 컨테이너가 있기 때문이다. 


인프라 레벨에서의 접근에는 사실 다양한 선택지가 있을 수 있다. 하지만 그 모든 선택지에는 각 클라우드 서비스에 대해 아주 잘 알아야 실제 서비스에 도입 할 수 있다는 이면이 숨어있기도 하다. Docker 를 사용하면 물론 이론적으로는, 그리고 실제적으로도 다양한 클라우드 서비스 공급자 또는 심지어 데이터센터에 구축 가능한 환경에도 애플리케이션을 배포할 수 있다. 하지만 이 애플리케이션의 배포 주기가 매우 자주 발생한다면, 그리고 이걸 다양한 클라우드 위에서 동작시켜야 한다면 추가적으로 처리해야 할 일이 보통 많은것이 아니다. 이 '보통 많은 것이 아닌' 부분을 처리하기 위해 Docker 는 다양한 eco를 지속적으로 개발 및 개선하고 있지만, 프로덕션 레벨에서 사용하고 있다는 엔지니어링 블로그를 본 적이 별로 없다. 


정리해 보면, 컨테이너의 장점은 분명 '플랫폼과 상관없이'에 있지만 그 프로덕션 레벨에서의 구현이 기술력 높은 회사라고 하더라도 아직 많지 않다 라고 할 수 있는 것이다. 각 클라우드 서비스 공급자에서 docker 를 지원하잖아요 라고 말은 할 수 있겠지만, 그래서 그 docker image 를 각 클라우드에 직접 배포하고 동작하는 환경을 만들겠다는것은, 완전히 다른 이야기라는 점이다. 아, 물론 하지 말라는 말 아니다. 시간과 기술과 환경이 허락하는 한 하고 싶으면 할 수 있다. 대한민국은 기술 스택 선택의 자유가 있는 나라니까. 



2. 컨테이너가 필요한거야 docker가 필요한거야? 


먼저 이 블로그 포스팅에서의 컨테이너 사용의 언급 범위는 '애플리케이션이 동작하는' 부분만을 포함한다. 무슨 말인고 하니, '서비스를 동작하기 위한 용도'로서의 컨테이너 기술은 제외한다. MySQL이나 카산드라, PgSQL, 하둡 스파크 기타 등등의 수많은 서비스들을 컨테이너에 동작시키고자 하는 시도가 많이 있는줄로 안다. 하지만 여기서는 애플리케이션을 동작시키기 위한, 이를테면 NodeJS, Spring, Java, PHP, Python, Go, Ruby, Linux binary, .NET 과 같은 도구로 제작된 것들 말이다. 





특정 버전의 애플리케이션의 라이프사이클을 살펴보면, 먼저 프로덕트 매니저를 통해 해당 기능의 구현 및 추가가 요구된다. 이는 이슈 트래커를 통해 등록되고, 각자 조직의 입맞에 맞게 구성되어 일감으로 엔지니어에게 할당된다. 이렇게 할당된 일감은 코드로 구현되고, 그것이 다른 사람으로 이루어진 팀이건 자동화 된 도구건 어쨌든 테스트를 거쳐 다음번 릴리즈 배포를 위해 준비된다. 릴리즈 타이밍이 오면, 그 동안 차곡 차곡 모아온 기능들의 커밋을 주워담아 프로덕션에 배포한다. 그렇게 배포된 버전은 다음번 릴리즈가 오기 전까지 열심히 동작하다가, 때가 오면 다음 버전에 그 자리를 물려주고 은퇴한다. 


컨테이너의 사용은 먼저 개발자의 랩탑에서 시작될 수 있다. 개발자는 구현 시점에서 컨테이너를 사용한다. 이것이 잘 동작하려면 지난 버전의 애플리케이션 코드를 바탕으로 내가 개발하고자 하는 기능을 지속적으로 구현 및 테스트를 시도한다. 따라서 랩탑에 컨테이너 구동의 환경이 필요하다. 개발자 스스로 테스트도 하지 않고 배포할 수야 없지 않은가 말이다. 두번째로, 만약 테스트를 자동화 구성했다면 신규로 코드 저장소에 반영된 코드를 가져다가 지정한 테스트 작업을 돌릴 것이다. 아니면 별도의 빌드 작업이 여기서 처리 될 수도 있겠다. 새로 업데이트 된 기능이 반영된 커밋을 가져다가 지지고 볶고 테스트 하는 것을 VM으로 하면 그거 제법 돈 낭비일 수 있다. 개발팀이 하나 있거나 하루에 두세개 코드가 신규로 생성되고 테스트 된다고 하면야 그것이 무슨 상관이겠냐마는, 하루에 십수개, 또는 수십개의 팀이 지속적으로 코드를 생성해 내고 이렇게 생성된 코드가 지속적으로 빌드 되고 테스트 되는 환경이라면 VM은 분명히 낭비다. 특정 클라우드 공급자를 사용하는 경우라면 시간당 리소스 사용 비용을 지불해야 할 것인데, 이것이 매 테스트마다 새로 켜지고 테스트 하고 꺼지고 한다면 돈이 쏠쏠하게 요구된다. 그래서 컨테이너를 쓰면 좋다. 테스트 및 빌드에서 컨테이너를 사용하는 것은 사실 좀 쿨한 아이디어라고 할 수 있다. 따라서 테스트 환경을 어떻게 컨테이너로 구성해야 하는지에 대한 아이디어와 또, 구현이 필요하다. 마지막으로는 서비스의 배포인데, 당연한 말이지만 원하는 클라우드 사업자 환경에 컨테이너 기반의 배포 환경을 구성해야 한다. 물론 그것이 꼭 컨테이너가 되어야 하는가에 대한 이의가 있을 수 있겠지만, 만약 멀티 클라우드 라는 꼭지를 생각했다면 반드시 docker를 함께 생각하고 있을 것이라고 예상 되므로, 그렇다고 할 수 있다. 그래서 다시 프로덕션 환경에 어쨌든 docker를 준비한다. 



https://bitcontainer.wordpress.com/2015/09/18/scaling-microservices-with-docker-compose-interlock-and-haproxynginx/

코드를 쓸 것인가 인프라 놀이를 할 것인가. 그것이 문제로다. 10초만 봐도 질문이 10개는 생김. 



한문단이 매우 길었다. 어쨌든, 이 글을 읽고 계신 분이 docker 를 매우 사랑한다면 위에 말한 문단의 사이클과 각 단계에서 필요한 구현에 대해 매핑이 금방 이루어질 것이라고 믿어 의심치 않는다. 이 의심치 않는 부분에 있어, 몇가지의 질문에 대해 생각해 보면 어떨까 싶다. 그것은 첫째로, 만약 전체 서비스 시스템 수준의 라이브러리 업데이트가 필요한 상황은 어떻게 대처해야 할 것인가, 이를테면 CVE와 같은 것들 말이다. 두번째로, 지속적으로 발생하는 수많은 애플리케이션의 커밋 별로 이미지를 제작할 것인가. 그렇지 않다면 그 이미지와 애플리케이션 업데이트의 상관 관계는 어떻게 되는가. 셋째로, 애플리케이션이 녹아있는 docker 이미지가 신규로 배포되거나 서비스에서 삭제 되었을때, 서비스-인, 서비스-아웃 처리는 어떻게 할 것인가. 만약 HAproxy 를 사용할 것이라고 답한다면, 매번 오토스케일링 트리거로 인해 이벤트가 발생했을때 마다 설정을 변경하고, 서비스를 리로드 할 것인가. 넷째, docker 이미지 원본이 변경되어야 할 필요가 있을 경우, 기존 배포된 컨테이너들은 어떻게 처리할 것인가. 이를테면 Go_lang의 alpine 버전을 사용하다가 의존성, 보안, 기타 등등의 문제로 업데이트가 필요한 경우에는 어떻게 대처할 것인가. 다섯째, 실제로 docker를 AWS, OpenStack, Azure 등 다양한 환경에 프로덕션에 올릴 것이라면 앞서 말한 네가지를 역시 다양한 프로덕션에 준비해야 할텐데 실제 구현까지 얼마나 걸리겠는가. 


이의가 있을 수 있다. 처리하는 기술이 있을 것이라고 말하고 싶을 것이라는 것도 잘 안다. 그리고 필드에서 실제로 내가 듣는 답변은, 어쨌든 우리의 to be는 거기에 있기 때문에 가야 한다고 말한다. 그래서 when 의 질문과 함께, how 를 함께 던지면 그 답변이 요원한 것도 항상 자주 목도하는 것이기도 하다. 



3. Tracker - Github - Concourse - Cloud Foundry 의 링크 


본 블로그에서 여러번 소개하긴 했지만, 위의 체인이 Pivotal Labs 에서 사용하고 있는 방법이다. 이들 중 Concourse 와 Cloud Foundry 는 Docker 를 지원한다. 그리고 Cloud Foundry 는, docker 가 시장에 풀리기 이전부터 lxc 를 사용한 컨테이너를 사용해 왔으며, docker 가 없더라도 컨테이너 사용성을 제공한다. 뭔말이냐면, 개발자는 코드 저장소에 commit 만 하면 클라우드에서 컨테이너로 알아서 돌려준다는 말이다. 테스트 및 빌드 도구로 사용할 수 있는 Concourse 는 docker 를 이미 지원한다. 다양한 스크립트를 제작하고, 빌드, 테스트, 배포 파이프라인을 만들어 자동화 테스트를 구현하는데 이미 docker 를 사용할 수 있도록 제공 한다는 말이다. 어쨌든 이 체인에 대한 연동은 지난번 포스트에서 설명 했으므로 더 깊이 가지는 않기로 한다. 


위에서 제시한 다양한 질문에 대한 답으로, 아래와 같은 환경을 상상해 보기로 한다. 이슈 트래커인 피보탈 트래커에서 일감이 생성된다. 생성된 일감을 코드로 만든다. 만들어진 코드는 코드 저장소에 업로드 된다. 업로드 된 코드는 Concourse 도구를 통해 docker 기반의 빌드 테스트, 배포 작업을 한다. 테스트 환경에 배포까지 완료가 되면, 일감을 할당한 사람이 해당 기능이 잘 동작하는지 리뷰한다. 잘 돌아가면 승인하고, 승인된 코드는 다음번 릴리즈에 반영되도록 추가된다. 그리고 다음번 릴리즈의 배포는 특정 시점에 역시 Concourse 에 구성된 '프로덕션 배포 파이프라인' 을 통해 Cloud Foundry 에 배포된다. 





개발자는 랩탑에 컨테이너 구동을 위한 환경을 구성할 이유가 없다. 안그래도 설치할 거 많은데 docker 건 lxc 건 그런 구성환경 docker 개발자가 아니라면 설치할 필요가 애초에 없다. 그냥 스프링이건 노드건 루비건 파이썬이건 원하는 개발 환경을 준비하면 된다. 그렇게 커밋된 코드는 데이터센터나 클라우드 환경에서 테스트 된다. 그리고 테스트 된 코드는 데이터 센터건 AWS, Azure, OpenStack 어디든 배포된다. 각 환경에 수많은 개발자들이 한꺼번에 커밋하더라도 별 문제 없이 업데이트 된 코드는 각각 가져다가 테스트 된다. 공장의 라인이 돌아가듯, 일단 커밋되면 나머지는 빙글빙글 돌아간다는 말이다. 그것이 가능하도록 하는 것이 바로 이 체인이다. 


구성과 배포에는 얼마나 시간이 걸리나. Cloud Foundry OSS 버전이라면 아마도 공부도 좀 하고, 복잡한 bosh 도 공부하고, 몇번 설치 실패도 경험하고 하면 보통 한달 정도면 구현 하는 것 같다. 물론 그 한달은 보통 하나의 클라우드 서비스 공급자에 제한된다. 이를테면 AWS에 배포 방법을 알게 되었다고 해서 Azure에 당장 똑같이 할 수 있는 것은 아닐 것이다. 완전 다르지는 않지만 별도의 설정이 필요하고, 관리 방법에 대해 학습할 필요가 있다. 만약 Pivotal Cloud Foundry 의 상용 버전이라면, OpenStack, AWS, Azure 등의 환경 배포에 1일-3일 정도면 끝난다. 필요한 다른 다양한 데이터 서비스, 이를테면 MySQL이라던가, PgSQL, Redis, RabbitMQ 등등등의 도구와 함께. 



https://ritazh.com/deploy-and-run-concourse-ci-on-azure-2fc9fec1f8a8#.zc3cnssdj



Concourse 를 사용한 테스트 파이프 라인의 구현 역시 어렵다고 보기는 힘들다. 오히려 어려운것은 테스트 자동화 그 자체라고 볼 수 있는데, 이것은 조직의 DevOps들이 지속적인 경험을 통해 테스트 방법을 개선해 갈 수 있다. 그리고 이런 테스트들은 보통 해당 서비스의 유지 기간과 함께 지속적으로 증가하기 때문에, 시간이 지날수록 견고한 테스트 파이프라인을 구성할 수 있다는 장점이 있다. 자주 받는 질문이 꼭 사람이 테스트 해야 하는것은 어떻게 해요 인데, Pivotal Labs 에서는 이것이 코딩을 통한 구현 단계에서 확인 된다. 두사람이 앉아 개발하고 새로운 코드에는 반드시 테스트를 위한 코드가 따라 붙는다. 여기에는 현장에서 사용되는 다양한 방법과 룰이 있는데, 이런 것들이 바로 조직이 세월이 지나며 쌓아야 하는 기술 노하우라고 볼 수 있다. 아울러 각 서비스 별로, 각 회사별로 테스트 항목이 같은 것도 있지만 다른 부분도 많기 때문에, 어쨌든 시간을 들여 견고하게 만들어야 한다고 볼 수 있다. 뭐 썰이 길었지만, 정리하면 이 컨테이너 기반 파이프라인 환경을 사용하기 위한 준비 역시 1일-1주일 정도면 구성한다. 나머지는 코드의 영역이다. 


'언제까지' 는 아마 지겹도록 듣는 말일 것이다. 특정 클라우드 서비스 공급자에 종속을 받고 싶지 않다는 것은 그 나름대로 타당한 이유라고 볼 수 있다. 현재로서는 거대한 여당 하나가 있는데, 그 여당이 매우 참 잘하고 있다. 운영도, 개발도, 그리고 심지어 고객 응대 방법과 규모 및 가격 요소까지 두루 훌륭한 여당이다. 반대로 다수의 야당이 존재하는데, 처음 시작할때도 언급 했지만 지난 세월 동안 많은 발전을 이룩하여 이제 많은 서비스들이 사용에 불편함이 없는 정도로 제공되고 있는 것으로 보인다. 이 말에 주의해야 할 필요가 있는데, 클라우드 서비스 공급자의 선택이 단일화 되어야 하는 경우와 다수의 클라우드 서비스 공급자를 선택해야 하는 경우는 다르다. 단일 서비스 공급자 선택시에도 중요하지만, 다수 서비스 공급자를 함께 사용할때의 전체 아키텍처는 도메인 부터 스토리지 레벨까지 준비해야 할 것이 많다. 즉, 멀티가 훨씬 복잡한 작업이 될 수 있지만, 그것을 잘 준비할 수 있다면 - 바로 이부 부분이 PCF/CF의 매력 - 좀 아름 다울걸. 


Concourse 를 Azure 에서 사용하고 싶다면 여기 링크를. - https://ritazh.com/deploy-and-run-concourse-ci-on-azure-2fc9fec1f8a8#.zc3cnssdj  AWS나 OpenStack 등에서 사용하고 싶은 경우에도 검색을 쌔우면 금방 나옴. 



4. Pivotal Cloud Foundry on Microsoft Azure 


사실은 이 부분을 간단하게 포스팅 하고 자려고 했는데 망했다. 사설이 매우 길었다. 내 손꾸락도 노동을 많이... 


Amazon Web Services 에서 Cloud Foundry 를 동작하는 것은 사실 쉬운일이다. 그것이 오픈소스건, 상용 버전이건간에 관계없이 다양한 경험들이 있고, 조금 찾아보면 - 물론 날짜가 지나 유효성이 떨어지는 답변도 많지만 - 어쨌든 레퍼런스나 해답에 대한 아이디어를 얻을곳은 많다. 그리고 특히 상용 버전은 https://network.pivotal.io 에서 가입후 그냥 다운로드 받아서 문서대로 따라해 보면 쉽다. 문서 링크는 여기. https://docs.pivotal.io/pivotalcf/customizing/cloudform.html 


최근 Pivotal 과 Microsoft 는 Pivotal Cloud Foundry 를 Azure 의 Marketplace 에 배치하고, PoC 를 위한 용도로 편리하게 사용할 수 있도록 제공하고 있다. 따라서 Azure 의 고객이라면 누구나 쉽게 PCF 를 준비하고, 함께 제공되는 몇가지 데이터서비스와 함께 파일럿으로 사용해 볼 수 있겠다. 그리고 이 부분에서는 어떻게 하면 설치가 가능한지, 물론 영문 문서가 있기는 하지만 단계별로 좀 쉽게 설명 하고자 한다. 원하는 분들은 위의 1~3 섹션에서 언급되었던 '컨테이너 기반의 오케스트레이션', '코드를 커밋하면 클라우드위에서 컨테이너로 동작하는', 및 기타 등등 로깅 등의 다양한 기능을 Azure 위에서 활용할 수 있는데 테스트로 사용해 볼 수 있겠다. 


Pivotal 이 제공하는 다양한 서비스들은 PCF를 포함하여 bosh 라는 설치 도구를 사용하게 되어 있다. bosh 에는 CPI 라는 부분이 존재하는데, 이는 Cloud Provider Interface 의 약자로 보면 된다. 그리고 이 bosh 자체는 오픈소스 프로젝트이며, Pivotal 이 주도하기는 하지만 CPI 와 같은 인터페이스 부분은 각 클라우드 서비스 공급자들이 참여한다. 이는 Microsoft Azure 의 경우에도 마찬가지며, 아래의 github 그래프를 보면 AdelHu 씨와 Bin Xia 씨가 수고해 주고 있음을 확인 가능하다. https://github.com/cloudfoundry-incubator/bosh-azure-cpi-release/graphs/contributors 그래서 뭔말이냐고? Microsoft 가 Cloud Foundry 발전에 이바지하고 있다는 것. 


다시한번 언급하지만, 상용에서의 멀티 클라우드 사용을 위해 PCF를 AWS, Azure, OpenStack 과 같은 환경에 준비하는 경우에는 도메인부터 스토리지까지 저와 함께 이야기 하시면 됩니다. (쿨럭..) 



아무튼 고고씡. 



a. 사전 준비 사항. 

- Microsoft Azure account : 가입해야 한다. 당삼 빠따루. 카드 정보 필요하다. 으헝 

- Subscription : 가입 후에는 프리로 사용할건지, msdn 플랜을 사용할 것인지, 아니면 사용한 만큼 지불할 것인지 등의 옵션을 선택해야 한다. 본인의 경우 마이크로소프트의 신현석 차장님께서 지원을 해 주셨다. 소주 사야 함. 

- https://network.pivotal.io 의 계정. 없다면 그냥 가입하면 된다. 

- 매뉴얼 :  https://docs.pivotal.io/pivotalcf/customizing/pcf_azure.html 

- Core 리밋 해제 요청 : https://portal.azure.com 에 로그인 하면 대시보드가 나타나는데, 여기서 도움말 + 지원을 클릭하면 아래와 같은 화면을 볼 수 있다. 



AWS와는 다르게 화면이 좀 이쁘다. 리소스 사용의 컨셉이 약간 다르기 때문에 AWS web console 이 편리한 분들께는 아마 처음에 매우 낮설지도 모르겠다. 어쨌든 새 지원 요청을 누르면 오른쪽에 기본 사항이 나타나고, 만약 한글이라면 '할당량' 을 선택하고, 할당량 유형에서 '구독당 코어' 를 선택한다. 




Azure 를 전문으로 하시는 분들은 알겠지만, 본 PCF의 Azure 배포는 Marketplace 를 사용한다. 이 경우 리소스 그룹으로 배포되므로 배포 모델에서 '리소스 관리자'를 선택하였다. 심각도의 경우 각 지원 요청이 비지니스에 미치는 영향을 기준으로 등록하는데, 보통 AWS에서는 Serverity 로 표기되고 구매한 서포트의 등위에 따라 선택 가능한 범위가 정해지는데 Azure 도 그런지는 잘 모르겠다. 어쨌든 중요한 것은, 어느 위치에 반영할 것인가 라는 문제다. Azure Marketplace 에 등록된 기본 템플릿에 정의된 VM size 는 Standard D2 타입이다. 궁금하신 분들은 Azure 홈페이지 참조. 아무튼 이 VM size 가 일본 서부에 없기 때문에, 본 설치에서는 East Asia 를 선택했다. 배포 템플릿은 AWS 의 CloudFormation 과 유사한 사용성을 지니는 것으로 보이는데, 역시 JSON 타입으로 되어 있어 일부 수정을 하면 일본 서부에서도 배포가 가능할지 모르겠다. 


아무튼 East Asia 를 선택하고, 기본 20인 할당량을 100 정도로 늘려 달라고 요청한다. 요청의 처리는 보통 업무일 기준으로 2-3일 정도 걸린다고 나오는데, 본인의 경우 아래의 채팅 창을 사용해서 조금 징징댔더니 빨리 처리해 주었다. 


이렇게 준비가 끝나면, 이제 본격 설치 단계로 진입하자. 별로 안어렵다. 



b. Azure CLI 의 설치. 


되게 당연한건데, CLI 가 존재한다는 사실에 살짝 놀랐다. 왜 놀랐을까는 나도 모르겠다. 아무튼 아래의 링크 내용을 참조하여 CLI 를 설치하자. 역시 AWS CLI 와 마찬가지로, 쉽게 설치가 가능하고 사용성도 좀 유사하다. 뭐 CLI 가 다 그렇지... 


https://azure.microsoft.com/en-us/documentation/articles/xplat-cli-install/



c. 아래의 Github 에 있는 쉘 스크립트를 로컬에 준비한다. 


https://github.com/cf-platform-eng/bosh-azure-template/blob/master/create_azure_principal.sh 


이 스크립트는 Azure 에 PCF 를 배포하기 위해 필요한 기본 정보를 생성해 주는 역할을 한다. 스크립트의 구동은 간단한데, ARGV1 으로 구독 형태를 넣어주면 된다. 본 경우에는 msdn 구독이므로, 뒤에 msdn 을 써 주었다. 그렇게 스크립트를 실행하면 지혼자 일을 알아서 하지 않고 뭔가를 기다리는 것처럼 뱅글뱅글 돈다. 멍잡고 있으면 안되고, 잘 읽어보면 https://aka.ms/devicelogin 이라는 페이지에 가서 인증 코드를 넣어주란다. 그렇다. CLI 가 계정 정보 접근을 위해 웹을 통해 OAuth 인증하고 있는거라고 보면 된다. 


스크립트 실행. 인증을 위한 URL과 코드가 주어진다. 



위의 화면에서 콘솔에 제공되는 코드를 입력하도록 한다. 코드를 입력하면 어떤 계정과 연결할 것인지 묻고, 만약 사용중인 메인 브라우저가 다르다면 다시 한번 로그인 해야 할 것이다. 어쨌든 브라우저 창을 닫아도 좋다는 메세지를 확인하면, 스크립트가 다음 단계로 진입하는 것을 확인할 수 있을 것이다. 



개인정보 보호를 위해 사방팔방 빵구가 보이는데, 아무튼 중요한 정보는 제일 아래 나오는 tanantID, clientID, CLIENTSECRET 의 세 부분이다. Azure CLI 사용에 관심이 많다면 역시 해당 홈페이지를 살펴보면 되겠다. 사전에 서비스 이해는 필수~ 



d. https://network.pivotal.io 에서 계정 API 토큰 확인 


Pivotal의 제품 다운로드 페이지인 network.pivotal.io 에 가입후 로그인을 하면, 우측 상단에 내 ID가 보인다. 클릭하면 드랍다운 메뉴가 나오는데, 여기서 "Edit Profile" 을 클릭하면 계정 정보 페이지로 이동한다. 페이지의 제일 하단으로 이동하면 API TOKEN 이 보이는데, 여기 나오는 토큰 정보를 준비해 두면 되겠다. 




e. Marketplace 검색, 그리고 해당 정보 입력 


https://portal.azure.com 으로 돌아와 로그인을 하면, 기본 화면 좌측에 +새로 만들기 버튼이 있다. 클릭하면 제일 상단에 검색이 가능한데, 여기에 Pivotal Cloud Foundry 를 입력하면 우측에 탭이 확장되며 관련 정보가 나타난다. 



마켓 플레이스에서 Pivotal Cloud Foundry 검색 




만들기 버튼까지 오면 된다. 설명을 살펴보면, Pivotal Cloud Foundry 와 MySQL, Redis, RabbitMQ, Spring Cloud Services, Apps Manager 가 설치될 것이라고 안내 된다. 다른건 아마 익숙할 테니 Spring Cloud 와 Apps Manager 만 설명하면, Spring Cloud Services 는 Netflix OSS 중 Circuit Breaker, Eureka, Config Server 의 세가지를 별도의 설치 없이 바로 애플리케이션에 사용할 수 있도록 준비한 것이라고 보면 되겠다. 이 세가지에 대해 처음 들어 보았다면, 각각의 이름으로 검색해 보자. 마이크로 서비스 아키텍처 라던가 클라우드에 맞는 확장성 및 고가용성을 구현하고자 할때 반드시 필요한 도구의 형태로 볼 수 있으며, 현재는 Spring Cloud 에 녹아있다. Pivotal 의 동료 중 한명이 Tip Toe 인가 하는 이름으로 닷넷에서도 사용할 수 있도록 하는 프로젝트를 하고 있단다. (Pivotal 공식 프로젝트는 아님) 



어쨌든 만들기 버튼을 클릭하면 위의 리소스가 다 뾰로롱 생긴다. 물론 이전의 필요한 내용을 다 이상 없이 준비한 경우에 말이다. 무언가 문제가 생겼다면 로그를 확인할 수 있으므로 반드시 참조하여 원인을 파악하도록 한다. 경험상 할당량이 충분하지 않다던가, CLI 에서 Oauth 를 통한 로그인 뒤 한참 있다가 (수시간 후) 만들기 버튼을 통해 배포를 수행한다던가 하면 세션 만료등과 같은 이유로 배포가 실패하는 것 같다. 그 이외에는 별다른 문제는 없었다. 



f. 필요 정보 입력 



위의 화면에 나타나는 정보 기입만 문제가 없다면 이후 배포는 알아서 자동으로 스뭇쓰 하게 된다. 각각의 항목에 대해 설명하면 다음과 같다. 


- Storage Account Name Prefix : Blob Storage, 이를테면 아마존의 S3와 같은 형태의 저장소를 준비한다. 아마존의 S3를 사용해 보신 분들은 알겠지만, 버켓의 이름 자체가 FQDN 이 되거나 또는 그렇지 않더라도 오브젝트 스토리지는 보통 global 하게 유일한 이름을 요구하는 경우가 일반적이다. 따라서 본 배포에 사용할 스토리지 이름의 prefix 를 주어야 하는데, 이것을 유일하게 지정하지 않으면 배포 중 에러를 보게 될 것이다. 즉, pcf, pivotal, superman 과 같은 아주 흔한 이름을 사용하면 실패할 확률이 높다는 뜻이다. 유일할 가능성이 높은 본인의 이름과 같은 것을 사용하면 된다. 즉, 어디 사이트 가입할때 아이디 만드는 느낌적인 느낌으로 기입하면 된다. 


- SSH public key : 모두 그런것은 아니겠지만, 배포 후 생성되는 자원에 접근하기 위한 SSH 인증 정보를 넣으면 된다. 보통 ssh-keygen 커맨드로 사용해서 생성되는 ~/.ssh/id_rsa.pub 정보를 넣어 주면 된다. 맥이나 리눅스 사용자라면 매우 쉽겠지만, 윈도우 사용자라면 아래의 Azure 링크를 살펴보도록 하자. https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-linux-ssh-from-windows/


- TenantID : 스크립트 수행으로 나오는 STDOUT 에서 tenantID 내용을 붙여 넣는다. 

- ClientID : 스크립트 수행으로 나오는 STDOUT 에서 clientID 내용을 붙여 넣는다. 

- Client Secret: 스크립트 수행으로 나오는 STDOUT 에서 CLIENTSECRET 내용을 붙여 넣는다. 

- Pivotal Network Token: network.pivotal.io 의 계정 페이지에서 얻은 API TOKEN 을 넣는다. 

- 새로 만들기 후 리소스에 이름을 지정한다. 이를테면, Younjin-PCF-Azure 와 같은 느낌으로. 



모든 정보가 올바르게 기입 되었다면, 확인 버튼을 누른다. 이후 템플릿이 자동으로 생성되는데, 이 템플릿의 유효성을 검사하는 페이지가 나타난다. 1분 내외의 시간에 검사가 종료 되면, 배포 버튼으로 PCF 를 배포 한다. 그리고 아무 문제가 없다면, 이 시점으로 약 2-3시간 정도 후에 PCF 를 사용할 준비가 된다. 이 과정 동안 배포 정보를 확인하면 현재 어떻게 배포가 되고 있는지를 확인할 수 있는 인터페이스를 제공하는데, 해당 링크는 아래 g 섹션의 스크린샷의 '마지막 배포' 아래의 하늘색 링크를 클릭하면 나오는 페이지에서 확인할 수 있다. 





왜 3시간이냐면, PCF 는 배포될 때마다 각 배포 버전에 맞는 리소스들을 컴파일 한다. PCF 자체가 마이크로 서비스 아키텍처로 이루어져있기 때문에, 여기에 사용되는 다양한 도구들이 모두 컴파일 되고, 필요한 VM을 생성한 이후 컴파일 된 패키지가 설치된다. 따라서 컴파일 + 리소스 준비 + 업데이트 시간이 소요되는 것이라고 이해하면 된다. 그럼 업데이트 할때마다 이렇게 오래걸리겠네? 라고 하면 맞다. 좀 걸린다. 다만, PCF 는 다운타임이 없이 업데이트 되므로, 서비스에 지장 없이 사용하면 되겠다. 물론, 배포 준비는 확실하게. 



g. 배포 완료 후 확인 사항 


배포가 완료되면, 아래와 같은 화면을 볼 수 있다. 대시보드에 새로 로그인을 했다면, 새로운 배포의 단축 타일을 확인할 수 있을 것이다. 



무언가 무지하게 많이 배포가 되었다. 이 리소스들이 PCF 를 동작시키는 각각의 서비스 컴포넌트이며, 추가적으로 MySQL 과 같이 설치전에 명시된 서비스들도 함께 동작하고 있다. 만약 할당량이 부족하다면 배포에 에러가 발생하며 중지 될 것이다. 만약 배포가 중지 되었다면, 원인을 알아낸 후 리소스 페이지의 상단에서 '삭제' 버튼을 눌러 반드시 쓸데없는 과금이 발생하지 않도록 주의 하자. 


'마지막 배포' 아래의 하늘색 날짜 링크를 클릭하면 배포의 STDOUT 페이지로 이동하는데, 여기에는 JUMPBOX 의 주소, 현재 어떻게 배포가 진행 되고 있는지에 대한 tail log 를 볼 수 있는 링크가 주어진다. JUMPBOX 로 로그인 하고 싶다면 ssh-keygen 을 수행한 머신 또는 해당 키를 가지고 있는 머신에서 pivotal 계정으로 ssh 접근하면 바로 붙는다. 


한가지 더 확인해야 할 것은, 바로 Pivotal Cloud Foundry 의 IP 다. 위의 리소스 페이지에서 배포된 머신들을 살펴보다 보면, 끝에 -cf 라는 이름이 할당된 머신이 있을 것이다. 이를 클릭하면, 우측에 세부 정보가 표시 되는데 여기에 IP 를 확인 할 수 있다. PCF의 배포는 반드시 도메인이 필요하기 때문에, 이 경우에는 https://apps.system.[IP_ADDRESS].xio.ip 의 도메인으로 접근이 가능하다. 이 주소는 APPS Manager 라 불리는 PCF 의 웹 관리 도구라고 보면 된다. 



새로 배포된 여러분의 CF IP 주소를 사용해 접근하면, HTTPS 경고가 나타난다. 이는 임시 도메인에 대한 임시 인증서를 사용한 것이기 때문에 그러하며, 향후 프로덕션의 사용을 위해서는 회사의 멀티 도메인 인증서를 사용하면 사라지는 문제 되겠다. 로그인을 하면, Pivotal Web Services 에서 보던것과 동일한 환경을 확인할 수 있다. 


앗차. 로그인 정보는, 반드시 JUMPBOX 에 SSH 로 로그인을 해서 확인해야 한다. 방법은, 

ssh pivotal@[YOUR_JUMPBOX_DOMAIN]
cat manifests/elastic-runtime.yml | grep admin
admin_user: admin
admin_password: "0a0d2a13b6521ee2bf8b"

따라서 로그인 할때 계정은 admin, 패스워드는 위의 grep 결과로 나온 패스워드를 사용한다. 


로그인을 하고 Marketplace 항목을 살펴 보면, 바로 애플리케이션을 배포해서 연결할 수 있는 서비스의 목록이 나타난다. 




이후에는 PCF / PWS 사용 방법과 완전히 동일한데, 다만 한가지 주의 할 것은 기본 계정은 관리자인 admin 밖에 만들어져 있지 않다. 따라서 Cloud Foundry CLI 로 로그인 한 후, create org / create space / create user 등과 같은 기본 사용자 계정 생성 및 조직 생성 작업은 처리해 주어야 할 것이다. 이는 어드민 작업이며, 처음 설치 후 한번만 해 주면 되므로 너무 부담갖지 않도록 한다. Cloud Foundry 의 어드민 작업에 대해서는 아래의 링크를 참조 한다. 


https://docs.pivotal.io/pivotalcf/adminguide/index.html



h. 이후 할 일. 


- cf client 를 설치하고 애플리케이션을 배포 해 본다. 샘플 애플리케이션이 없다면 아래의 링크를 참조해 본다. 

https://github.com/cloudfoundry-samples  이들 중, MSA에 관심이 많다면 아래의 링크를 수행해 보자. https://github.com/spring-cloud-samples/fortune-teller


- 서비스 바인딩 및 구성. : 간단한 MySQL 애플리케이션을 작성하고, 플랫폼 환경 변수로 부터 endpoint 를 참조하여 코드를 작성 및 배포 하는 방법을 살펴 보자. 정보는 요기 참조  https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html


- Spring Cloud Services 도 사용해 봅시다. 

http://docs.pivotal.io/spring-cloud-services/ 



i. Docker 이미지 배포. 


Pivotal Cloud Foundry 1.6 버전 이후 부터는 Diego 라는 새로운 런타임을 사용하여 닷넷과 다커를 지원한다. 이들 중 docker 이미지의 배포는 무지하게 쉽게 처리할 수 있다. 어떻게? cf 도구에 -o 커맨드 로 이미지를 지정해 주면. 


아래는 Docker Hub에 있는 Jenkins 를 Azure 에서 동작하는 Pivotal Cloud Foundry 에 올리는 모습이다. 

cf enable-feature-flag diego_docker # Admin 계정에서 수행해 주어야 한다. cf push jenkins-test -o jenkins ...

별 문제가 없다면 Docker 이미지가 Pivotal Cloud Foundry 로 그대로 배포되어 동작 할 것이다. cf apps 와 같은 커맨드로 엔드 포인트를 알아내고 접근하면, jenkins 동작을 확인 할 수 있다. 




Docker 버전의 jenkins 를 사용해 보신 분들은 알겠지만, 처음 접근 후에 Admin key 를 넣어 주어야 한다. 이를 위해서는 컨테이너에 ssh 로 접근할 필요가 있는데, Cloud Foundry 에서는 이를 매우 쉽게 처리할 수 있다. 바로, cf ssh 커맨드를 사용해서. 


$ cf ssh [APP_NAME]


컨테이너 내부에 접근해서 /var/jenkins_home 디렉토리에 가면 원하는 Key 를 찾을 수 있을 것이다. 사실 이와 같은 도구는 매우 유용한데, 왜냐 하면 개발 중 (프로덕션 아님에 주의) 개발 환경에 배포된 애플리케이션이 동작하는 컨테이너에 ssh 터널을 구성하고 각종 원격 디버깅 툴을 연결할 수도 있기 때문이다. 이에 대해서는 아래의 링크를 참조해 본다. 


https://blog.pivotal.io/kr/pivotal-cloud-foundry/products/%EC%83%88%EB%A1%9C%EC%9A%B4-cloud-foundry-java-%EB%B9%8C%EB%93%9C%ED%8C%A9-%EA%B0%9C%EB%B0%9C-%EC%A7%84%EB%8B%A8%EB%8F%84%EA%B5%AC



적절한 정보를 넣고 나면 다음과 같이 jenkins 가 동작하는 모습을 확인 할 수 있다. 




당연한 말이지만, 이대로 Jenkins 를 사용하라고 소개하는 것은 아니다. 중요한 것은 바로, Docker image 가 있다면 바로 PCF에 배포해서 사용할 수 있다는 것이다. 즉, 코드를 그대로 전달해도 컨테이너화 해서 동작하며, Docker 이미지가 있다고 해도 PCF 에서 사용이 가능한 것이다. 물론 편의를 위해서 전자를 선택하라고 하고 싶지만, 워낙 docker 사랑꾼들이 많으니까... 




5. 결론. 


Azure 에서의 PCF 는 매우 쉽게 배포할 수 있고, 잘 동작한다. 현재로서는 PoC 를 위한 정도이며, 프로덕션의 사용을 위해서는 지원이 필요하다. 그리고 PCF 는 현재 AWS 에서 매우 잘 동작하며, VMware 의 vCenter, vCloud Air, 그리고 최근 버전의 마이크로바이저인 Photon 역시 지원하고 있다. 향후 로드맵에는 이미 GCE 가 포함되어 있다. OpenStack 역시 지원한다. 이 의미는 무엇인가. 


"애플리케이션을 클라우드에서 동작하고 싶다면, 개발 부터 배포까지 Pivotal Cloud Foundry 를 통해 내일 당장 동작하는 컨테이너 오케스트레이션 / 계정, 조직별 권한 관리 / 레거시 저장소 연동 - 이를테면 유닉스 기반 오라클 /  각종 클라우드 서비스 연동 / docker 오케스트레이션 / 컨테이너 ssh 접근 / 로그 애그리게이션 / 애플리케이션 별 로그 스트림 / 빅 데이터 서비스 연동 / APM 구성 이 가능하다는 것이다." 



짧게 쓰고 싶었는데 뭐가 많이 써지고야 말았.. 



어쨌든 모두 즐거운 Azure, 그리고 멀티 클라우드, 아울러 Pivotal Cloud Foundry! 

물론 시간이 더 되시면 Concourse 를 보셔도 됩니다요.  https://concourse.ci 




(younjin.jeong@gmail.com, 정윤진) 


Docker 꿀잼 비디오.

Techs


(younjin.jeong@gmail.com, 정윤진)


Docker 관련하여 재미있는 비디오가 있어서 발번역 한번 해 보았다. 사실 Docker 만능 주의가 적지 않은 편인데, 내용이 맘에 안드는 분들이 많을지도 모르겠지만, 일단은 재미지니까 보는 것으로. Youtube 에서 제공하는 Caption 도구를 사용했는데 일부 언어에서는 보이지 않는것 같기도. 자막이 안보인다면 아래 Cc 버튼을 클릭하면 되시겠다. 


영어로 볼때는 배꼽을 잡았는데 한글로 보니 감흥이 별로 없는것이 번역 유머가 별로 없는 듯...;; 


아무튼 데이터베이스를 포함 현존하는 서비스의 모든것들 Docker 로 구현 하려는 분들이 간혹 있는데, 부적절한 도구의 사용에 대한 유머 정도로 보고 웃어 넘기면 어떨까 싶다. 





영어 자막 원본 비디오는 여기: https://www.youtube.com/watch?v=PivpCKEiQOQ


서비스 보아 가면서 Docker 사용 합시다. 

클라우드 위의 코드 배포는 Cloud Foundry 로.  :) 


간단한 기승전피 


(younjin.jeong@gmail.com, 정윤진) 




Github, Hugo, Concourse, CF를 사용한 블로그의 CI/CD

Techs


(younjin.jeong@gmail.com, 정윤진) 


최근 많이 사용하는 블로그 도구 중 하나가 바로 Hugo (http://gohugo.io) 이다. 이전에 "블로그" 라고 하면 기본적으로 호스팅 업체 또는 대형 포털에서 제공하는 블로깅 도구를 사용하거나, 또는 제로보드 기반의 게시판이 달린 간단한 웹의 형태로 구성하는 경우가 많았다고 한다면, 최근 몇년 전 부터는 Static Web Site 를 구성해서 사용하는 것이 일반적이다. Static 웹 사이트는 기본적인 개념으로는 JSP 로 구성된 웹 사이트의 첫 페이지를 html 로 구워서 사용하는 것과 유사한 개념이라고 보면 된다. 즉, 각 Static 웹 사이트 도구가 지원하는 언어를 사용하여 컨텐츠를 만들면 '파일' 기반으로 된 페이지를 슝슝 만들어 주고, 이렇게 만들어진 웹 서비스용 파일들은 Github 가 제공하는 무료 웹 페이지 도구나, 아마존의 S3 + CloudFront 를 사용하거나, 또는 웹 서버를 만들어서 서비스 할 수 있다. 당연하지, 이것들은 public 디렉토리의 html 과 css, js, 그런 파일들 이니까. 


블로그의 제작은 보통 마크다운이라는 도구를 사용한다. 간단한 YAML 비스무리한 문법에 맞추어 컨텐츠를 작성하면 페이지가 슝슝 생긴다. 구성 및 사용 방법에 대해서는 Hugo 의 홈페이지를 참조하면 되겠다. 



조금 살펴보다 보면, 각종 theme 를 지원하는 것을 확인할 수 있다. 사실 default 로 제공되는 것은 약간 그런 어떤 허전한 느낌적인 느낌이 있으므로, 보통은 테마를 적용하는 것을 권고한다. 테마는 다른 사람이 만들어 둔 것을 사용하거나, 아니면 내가 직접 만들어서 사용할 수 도 있다. 사실 말이 블로그지 원한다면 제품 관련 페이지를 만들거나, 내 홈페이지를 만들거나, 뭐 어쨌든 웹으로 만들 수 있는건 다 만들 수 있겠다. 이것은 여담이지만 Static 기반의 서비스라고 해도 AWS의 DynamoDB 나 Kinesis, SQS 와 같은 도구를 JavaScript 로 연동하여 데이터를 수집하거나 게시판을 구현하거나 덧글 시스템을 구현하거나 하는 것들이 가능하다. "에이, 그럼 JavaScript SDK에 Credential을 제공해야 하는데 그것이 어떻게 동작해요" 하시는 분들은 AWS가 제공하는 Playground 에서 한번 원리를 확인해 보시길. Web Identity Federation 이라 불리곤 한다. 링크는 여기. (어머 친절도 하지) http://blogs.aws.amazon.com/security/post/Tx1XTHT1VJ1SQLX/New-Playground-App-to-Explore-Web-Identity-Federation-with-Amazon-Facebook-and-G



어쨌든 오늘 소개할 내용을 간단히 리스트업 하면 아래와 같다. 


- Github 

- Concourse 

- Pivotal Web Services (Signup 하면 60일 무료, 카드 정보 따윈 필요 없음:  https://run.pivotal.io) 



다시 돌아가면, 블로그라는 것이 블로그 만으로 사용되기 보다는 일종의 뉴스 서비스와 같은 형태로 만들수도 있을 것이다. 예를 들어, 일종의 팀 블로그를 운영하려고 할때 보통은 워드프레스로 구성하고 여기에 포스팅을 할 수 있는 사람들을 선정하여 권한을 주고 뭐 그런 일반적인 3 tier 기반의 구성을 생각해 볼 수 있다. 무엇보다 풍부한 테마와 플러그인등을 사용해 S3나 CloudFront 도 연결할 수 있고 디자인도 맘대로 바꿀 수 있을 가능성이 많다. 즉 편리하다. 하지만 블로그의 사용성을 생각했을때, 데이터베이스가 꼭 필요한가, 그리고 그 데이터베이스가 항시 구동해야 하는가 게다가 그럼 그 데이터베이스가 죽으면 어떻게 되는가 등등등 생각만 해도 꼬리에 꼬리를 무는 영어 문제들이 계속 나타난다. 아 그러니까 결국 우리는 그런거 필요 없고, 웹 페이지를 통해 정보만 전달하면 되겠다 하는 목적이 발생할 수 있다. 즉, 협업해야하고, 그렇게 만들어진 컨텐츠가 이상이 없는지 테스트를 해야 하고, 그리고 문제가 없을때 스테이징에 배포를 해서 살펴보고, 그렇게 컨텐츠들이 적당한 시점에 누적 되었을때 프로덕션에 릴리즈를 한다. 


어디서 많이 들어본 과정 아닌가? 그렇다 바로 개발, 테스트, 그리고 배포에 대한 이야기다. 그리고 여기서는 그런 도구를 이를 테면 신문사와 같이 수많은 기자들이 작성한 기사들이 특정 시점, 그러니까 매일 아침 4시라던가 또는 특정 시점 없이 지속적으로 배포와 수정이 발생하는 경우 저렴하게 사용할 수 있는 도구가 되는 것이다. 게다가 매우 빠르지. 



간단하기는 하지만, 우리 Pivotal의 엔지니어링 블로그가 그런 형태의 협업 구조로 동작하고 있다. 

http://engineering.pivotal.io/


그리고 이 블로그는 아래의 Github 에 메인 좌표를 가진다. 

https://github.com/pivotal/blog


Github 에 대해서는 별도의 설명을 하지 않겠다. 중요한것은 이 블로그가 Hugo 기반의 이며, Github 기반에서 동작하고 있고, 스테이징과 프로덕션의 단계를 가진다는 것이다. 


두번째로, PWS 에 대해서 설명을 하자면, Cloud Foundry 의 가장 최신 기능이 적용 되어 있고, AWS의 us-east-1에서 동작중인 Pivotal Made CF 서비스다. 회사 계정으로 가입하면 바로 사용해 볼 수 있으며, 사용 방법 또한 간단하다. 계정 생성 이후 CLI 도구를 사용해 로그인을 마치고 나면 cf 라는 도구를 사용해서 다양한 커맨드를 사용할 수 있는데, 여기에서 cf buildpacks 라는 커맨드를 사용하면 사용가능한 다양한 빌드팩이 나온다. 빌드팩이 무언고 하는 설명따위 집어 치우고 output 을 보면 대충 이게 뭔지 아마 알 수 있을것이다. 


$ cf buildpacks

빌드팩 가져오는 중...


buildpack              위치   사용   잠김    파일 이름

staticfile_buildpack   1      true   false   staticfile_buildpack-cached-v1.3.6.zip

java_buildpack         2      true   false   java-buildpack-offline-v3.6.zip

ruby_buildpack         3      true   false   ruby_buildpack-cached-v1.6.15.zip

nodejs_buildpack       4      true   false   nodejs_buildpack-cached-v1.5.10.zip

go_buildpack           5      true   false   go_buildpack-cached-v1.7.3.zip

python_buildpack       6      true   false   python_buildpack-cached-v1.5.5.zip

php_buildpack          7      true   false   php_buildpack-cached-v4.3.9.zip

liberty_buildpack      8      true   false   liberty_buildpack.zip

binary_buildpack       9      true   false   binary_buildpack-cached-v1.0.1.zip



이들 중, staticfile_buildpack 을 사용하게 되면 이런 static 형태의 웹 사이트를 서비스 할 수 있다. 물론 CDN을 연결해서 사용할 수 도 있겠다. 당연한 이야기지만, 다른 다양한 언어로 개발하게 되면 위에 걸리는 것들 중 하나랑 합쳐져 executable 형태가 되고, 다시 이것은 컨테이너에 쏙 들어가서 다이나믹하게 라우팅 되고 밸런싱 된다. 즉, 헬스 체크 구성 그따위거 필요 없다는 말이고 그냥 cf push 하고 컨테이너가 10개든 1000개든 알아서 서비스에 등록하고 밸런싱 한다는 말. 


그리고 여기에 오늘의 핵심이라고 할 수 있는 Concourse 라는 도구를 사용한다. 사실 아직까지 무언가 엄청난 기능을 넣은 것은 아니지만, 이 도구는 CI/CD 도구로서 지정된 소스, 이를테면 Github 와 같은 소스로 부터 코드를 가져다가, 원하는 테스트를 마구마구 지지고 볶고 돌린 다음 그 다음 동작을 구성하거나 또는 스테이징에 배포하거나 또는 Pivotal Tracker 에 후킹 메세지를 보내거나 또는 다른 Github 레포에 빌드를 올린다거나 뭐 그런 원하는 동작을 Docker 기반으로 수행할 수 있다. 물론 대규모 개발 그룹에서는 이를 워커로 분리해서 사용할 수 도 있고, 개발자는 이런 회사가 가진 테스트 파이프라인에 본인의 코드가 문제없이 통과 할 지의 여부에 대해 로컬에 vagrant 로 구성해서 직접 돌려볼 수 도 있겠다. 



어쨌거나 오늘의 작업은 이런 느낌이다. 


1. Github 의 Pivotal 엔지니어링 블로그를 fork 해서 내 계정으로 당겨온다. 

2. 로컬 랩탑에 Hugo 를 구성한다. - brew 를 사용하면 매우 편리 

3. 로컬 랩탑에 vagrant 를 구성한다. - 로컬에 돌리려면 설치에 머리 싸매지 않아도 됨 

4. PWS 계정을 준비한다. 

5. Concourse 를 사용해 hugo 도구가 이상없이 페이지를 생성하는지 확인하고, 문제가 없다면 PWS 에 배포한다. (스테이징) 



백문이 불여일견, 백견이 불여일행이라. 이런 동작을 직접 구현하려면 아래의 도구에 대한 인식이 필요하겠다. 


1. vagrant 

2. docker 


Hugo 의 설치는 블로그에 매우 잘 설명이 되어 있으므로 넘어간다. git clone 따위 설명하지 않겠다. 

로컬에 Hugo 의 블로그를 구성하고 싶은 위치에 디렉토리를 만들고, github로 부터 가져온다. 직접 테마를 만들고 싶다면 그렇게 해도 된다. 


vagrant 환경 구성이 필요하다. 설치는 아래의 링크를 참조한다. 

https://www.vagrantup.com/docs/installation/ 


vagrant 설치가 완료되면, Concourse 를 사용할 디렉토리를 준비하고 아래의 링크에 소개된 대로 커맨드를 때리면 아주 쉽게 로컬에 준비된다. 만약 서비스의 용도로 설치를 원한다면 Bosh 를 사용할 필요가 있으므로, 이 부분이 궁금하다면 Pivotal 로 연락 주시길. 

https://concourse.ci/vagrant.html



준비 완료 메세지가 나오면, 이제 http://192.168.100.4:8080/ 주소를 사용하여 Concourse 에 접근이 가능하다. 처음 접근하면 뭐 아무것도 없고 썰렁하니 OS 이미지들만 나오는데, 바로 fly 라고 불리는 클라이언트 cli 도구를 다운 받아서 사용하라는 것이다. 이를 다운 받고, 압축을 해제한 후 원하는 디렉토리에 넣고 PATH 구성을 해 주면 되겠다. 여기에서 설명 되는 것 이상으로 Concourse 에 대한 사용법이 궁금하다면 아래 링크의 Tutorial 을 살펴보고 따라하다 보면 어느새 나도 전문가. 


https://github.com/starkandwayne/concourse-tutorial


주소로 접근하면 위와 같은 화면을 볼 수 있다. 현재로서는 아무런 파이프라인이 구성되지 않았기 때문이며, 본인이 사용하는 OS의 이미지를 클릭하여 클라이언트 도구를 다운로드 하면 되겠다. 


클라이언트 도구인 fly 의 PATH 구성을 완료 했다면, 아래의 커맨드를 참조하자. 


# 타겟 지정 

fly -t blog login -c 192.168.100.4:8080 


# 최초 파이프라인 구성 

# 파이프라인 파일에 대한 정보는 아래의 github 링크에서 pipeline 파일들을 참조 하면 되겠다. 

# https://github.com/younjinjeong/pipelines/tree/master/blog 


fly sp -t blog -c pipeline.yml -p yjeong-blog-test.yml -n -l ../../credentials.yml 


# 파이프라인 시작 

fly up -t blog -p yjeong-blog-test.yml 



그러고 나서 다시 192.168.100.4:8080 으로 접근하면 파이프라인이 생성된 것을 확인할 수 있다. 




github 링크의 파일 중 .sh 파일을 보면 git 를 구성하고 이후 hugo 를 설치한 다음 yjeong-blog-git 로 명명된 github 의 블로그 repository 에서 블로그를 가져다가 hugo 를 돌린다. 물론 여기에 Docker 를 직접 만들어 사용하면 각종 설치에 따른 불필요한 시간을 줄일 수 있을 것이다. 그리고 Pipeline repository 를 보면 알겠지만, 약 40여차례에 걸친 개인적 삽질 끝에 구성이 완료 되었음을 확인할 수 있을 것이다. 


추가적으로 위의 커맨드에 보면 credential.yml 파일이 있는데 이는 CloudFoundry 에 코드를 배포하기 위한 인증 정보가 담겨있다. 당연한 말이지만 이런 파일을 github 의 퍼블릭 레포에 올리면 문제가 될 것이므로 별도의 사설 repo 등에서 관리하는 것이 좋겠다. 


다른 파일은 제외하고, pipeline.yaml 파일을 살펴보자. 

https://github.com/younjinjeong/pipelines/blob/master/blog/pipeline.yml


---
resources:
- name: yjeong-blog-git
type: git
source:
uri: https://github.com/younjinjeong/yjeong.cfapps.io/
- name: yjeong-pipelines-git
type: git
source:
uri: https://github.com/younjinjeong/pipelines/
- name: yjeong-blog-staging
type: cf
source:
api: {{cf-api}}
username: {{cf-username}}
password: {{cf-password}}
organization: {{cf-organization}}
space: {{cf-space}}
skip_cert_check: false
jobs:
- name: yjeong-blog-test-app
public: true
serial: true
plan:
- get: yjeong-blog-git
trigger: true
- get: yjeong-pipelines-git
trigger: true
- task: yjeong-blog-test
file: yjeong-pipelines-git/blog/yjeong-blog-test.yml
- put: yjeong-blog-staging
params:
path: yjeong-blog-git/public/
manifest: yjeong-pipelines-git/blog/yjeong_blog_manifest.yml


보면 리소스를 정의하고, Jobs 에서 작업을 지정한다. 원하는 작업이 많을 수록 수많은 task 를 구성할 수 있으며, trigger 옵션은 git에 새로운 commit 이 발생한 경우 별도의 hook 이 없더라도 새롭게 업데이트된 코드를 가져온다. 그리고 중간에 yjeong-blog-staging 이라는 부분을 보면 소스를 별도의 방법으로 참조하고 있는데, 이는 fly 커맨드로 지정된 credential 파일에서 내용을 가져다 사용한다. 그리고 이 파일은 아래와 같이 생겨있다. 


cf-api: CF_ENDPOINT

cf-username: EMAIL

cf-password: PASSWD

cf-organization: ORG

cf-space: SPACE  


그리고 배포를 할때는 반드시 manifest 파일이 있어야 한다. 따라서 cf push 를 통해 이미 배포된 앱이라면 cf create-app-manifest 커맨드를 사용하여 다운로드 받을 수 있다. 


그리고 웹 UI를 통해 확인 할 수 있지만, 코드가 신규로 업데이트 되면 노란색으로 박스가 점멸된다. 테스트가 실패하면 빨강색으로 나오고, 해당 박스를 더블 클릭하면 어떤 작업이 수행 되었는지, 로그가 어떻게 나왔는지에 대해 작업 순서를 모두 확인이 가능하다. 




위의 경우는 "이전에 했던 테스트는 실패했고, 새로운 커밋이 들어와 새로운 테스트가 시작되었다" 라는 의미이다. 그리고 보면 yjeong-blog-staging 부분에 뻘건 한 줄이 가있는 것으로 보아, staging 배포에 실패한 것이다. 이런 경우 대부분은 credential 설정에 문제다. 




yjeong-blog-app-test 를 더블클릭하면 위와 같은 히스토리 화면이 나온다. 또는 현재 테스트가 진행되고 있는 경우라면 거의 실시간으로 테스트 아웃풋을 확인할 수 있다. 이는 Pipeline 에 지정된 Jobs 가 sequencial 하게 하나씩 수행 되었으며, 47번째 테스트는 모두 성공한 모습을 보여주고 있다. 여기에 각 작업 이름의 왼쪽 화살표를 클릭하면 작업의 디테일한 로그를 확인할 수 있다. 



위의 스크린샷은 간단한 테스트가 성공적으로 종료된 이후, PWS 에 성공적으로 블로그가 배포 되었음을 나타낸다. 그리고 이 블로그는 https://yjeong.cfapps.io 의 도메인으로 동작중이다. 



"에이~ 이게 뭐야 너무 간단한거 아니야" 라고 생각하실 수 있겠다. 그렇다. 이 데모를 위해 1일을 투자했다. 으헝 ㅠㅠ 

아래의 주소로 가시면 이것보다는 조금 더 현실세계에서 사용중인 복잡한 구성을 확인하실 수 있다. 


https://www.pivotaltracker.com/n/projects/956238

https://main.bosh-ci.cf-app.com/ 


위는 Bosh.io 프로젝트를 위해 Pivotal Tracker 에서 일을 정의하고, 이것들을 엔지니어들이 구현하여 bosh 용 concourse pipleline 을 구현한 모습니다. 




정리하면, 이런 구성은 만약 수많은 사람이 협업해야 하는 상태에서 Static 블로그, 또는 웹 페이지를 만들때 매우 효율적이다. 추가적으로 이것은 블로그만 하려고 구성한 것이 아니다. 이러한 파이프라인은 실제 개발에서 사용되는 것이며, 각각의 커밋 단위로 스테이징에 배포하는데 사용되는 기술이다. 따라서 각 팀별로 맡고있는 개발작업의 배포는 실제 이런 형태로 구성되고, 이렇게 모인 CI 들을 release 로 만들어 원하는 시점에 배포한다. 그리고 그 배포에 엄청나게 많은 코드가 사용되거나 사람이 무언가 손을 대는 작업은 없고, 자동으로 배포된다. 


한가지 더 언급하고 싶은것은, Docker file 을 원하는 대로 구성하여 Concourse 의 테스트에 사용할 수 있고, 자유도가 높은 스크립트를 사용하여 원하는 테스트 도구를 사용할 수도 있다. 이를테면 C나 Golang, python 등 다양한 언어로 개발된 애플리케이션 중 빌드가 필요한 것은 빌드의 단계를 구성하고, 이후 테스트를 수행하고, 그러고 문제가 없다면 스테이징에 안착시킬 수 있다는 의미다. 




Github 의 복사 붙여넣기 신공의 편의로 인해 무언가 좀 편리하게 포스팅한 느낌. 

다른거 없음. 백문이 불여일행. 


(younjin.jeong@gmail.com, 정윤진) 


Pivotal Labs 에서 일하기

Techs


(younjin.jeong@gmail.com, 정윤진) 


Pivotal 에 입사한지도 이제 두어달 뒤면 일년이 된다. 참 세월이 빠르다 싶기도 하고, 그동안 무엇을 내가 잘했나 잘못했나 하고 뒤돌아 보니 다양한 감상이 생긴다. 아마존 웹 서비스 같은 회사를 왜 그만 두셨어요 하는 분들부터, 피보탈로 옮겼다 하니 역시 라고 말해주는 분들까지 정말로 다양한 피드백이 있었다. 사실 이러한 외부 피드백 보다 스스로 돌이켜 보았을때, 그리고 다른 회사들에서 동일한 시간을 보냈을때 라고 가정했을때 지난 일년동안 했던일, 또는 배웠던 일이 가치가 있었는가 하고 묻는다면 "당연하다" 라고 하고 싶다. 뭐 여러가지 이유가 있겠지만, 그런 이야기는 나중에 소주를 사주는 분들께 따로 들려드리기로 하고... (응?) 


어쨌든 지난 일년간 배운걸 가지고 어디다가 정리를 좀 해보고 싶은데, 이게 기술적으로 너무 단편적인 것들이 많아서 하나씩 올리면 전체를 보기가 힘든것 같다는 생각이 들었다. 그래서 아, 이 전체 일에 대한 플로우를 써 보면 어떨까 하는 생각, 그리고 그것이 소프트웨어 개발자 분들이나 프로덕트 매니징을 하시는 분들께 도움이 되겠다 싶어 이런 서두부터 살짝 긴 장문의 블로그 포스팅을 시작한다. 주제는 제목과 같다. 자, 이제 그럼 본격 시작해 볼까나. 



1. 가장 자주 목격하는 문제. 


대부분의 사업장, 특히 개발이 필요한 사업장에서 다양한 역할을 가진 분들을 만나면, 생각보다 서로 굉장히 다른 의견을 어필하는 것을 목격하곤 한다. 사실 내가 기본적으로 이해하고 있는 "회사"라는 조직은 큰 틀에서 사업부나 경영진에서 어떤 사업을 기획하면, 그것을 개발한 후에 운영의 단계를 가진다고 본다. 그래서 이를테면 이런저런 앱을 만들고 싶어용 하는 요구사항을 개발팀이 받아서 아 그건 이렇게 저렇게 구현해야해 하고 코드를 만들면 운영팀에서 어머 업데이트가 생겼네 하고 개발된 코드를 서비스한다. 최근 여기에 한꼭지 더 들어가는 것이 이제 분석 정도인데, 서비스를 돌려보니 이렇더라 하고 다시 사업부에 이런 내용을 던지면 그 이후의 사이클은 반복된다. 



http://www.supplychain247.com/article/want_to_innovate_your_supply_chain_break_the_rules


당연한 말이겠지만, 이걸 누가 얼마나 더 저렴하게 많이 하는가에 따라 그 기업의 경쟁력이 달라진다고 생각한다. 그리고 기업의 규모가 더 클 수록, 조직에 사람이 더 많을 수록, 그리고 의사 결정 단계가 많을 수록 이 속도는 느려진다. 보통 회사들은 같은 일을 하는 사람들끼리 부서로 묶고, 일을 부서에서 부서로 넘긴다. 기획부서에서 개발부서로 넘기는데, 만약 기획안 중에 개발이 불가능하거나 현재로서는 없는 기술이라고 하는 극단적 상황이 있다고 하자. 그러면 개발팀은 그것을 다시 기획 부서로 돌려보내고, 기획 부서는 그것이 왜 잘못되었거나 개발이 불가능한지 팀간 미팅을 잡는다. 그렇게 미팅을 하고 나면 그 내용을 기획팀에서 공유하고 다시 유사한 기획이 발생하지 않도록 검토 수정한 후에 다시 개발팀으로 보낸다. 그럼에도 불구하고 무언가 지속적인 문제가 발생하거나 한다면 개발팀과 기획팀의 각 장들, 그리고 부서장들간의 추가적인 미팅이 필요하게 된다. 그리고 이런 동작은 비단 기획과 개발 사이의 문제가 아니라 개발과 운영, 운영과 기획, 개발과 분석 등 동일한 서비스를 위한 이해관계에 있는 팀들 모두가 서로 복잡하게 얽힌다. 


이것은 서비스가 시장에 준비되는 속도를 느리게하고 이미 런칭한 서비스라도 고객의 요구를 반영하는 시간이 오래걸리도록 하는 문제이다. 그리고 많은 조직들은 이렇게 말한다. "우리 여태까지 그렇게 하고 있었는데요."



http://customerthink.com/weve-always-done-it-this-way/


이런 문제는 비단 큰 회사의 문제만은 아니다. 시장에서 주목을 받는 스타트업 역시 투자를 받고, 성장하는 과정에서 동일한 문제를 겪게 된다. 보통 처음 사업을 기획하고 서비스를 만들때는 사람이 적다. 두명에서 다섯명, 그렇게 시작한 스타트업은 빠른 의사결정과 개발속도를 가지고 서비스를 시작한다. 주목을 받기 시작하면 서비스에 요구되는 기능이 많아지고 관리할 대상도 많아진다. 더 많은 개발자를 충원하게 되고, 더 많은 운영자를 충원하는 과정에서 처음과 같은 멤버 보다는 기존의 개발 시장에서 일하던 사람들이 조직에 수혈된다. 또는 수혈받은 자금력을 사용해 경쟁관계에 있는 유사 서비스 회사를 인수하거나 하는 과정에서 조직은 순식간에 성장한다. 하지만, 서비스 개선 속도는 오히려 서너명 있을때 보다도 느린것 같다는 말이 나온다. 



이러한 조직과 프로세스의 문제는 곳곳에서 발견된다. 그리고 곳곳에서 해결되지 않는다. 해결되지 않는 가장 궁극적인 이유는, 다양한 경험을 보유한 것으로 보이는 사람들이 결국 모아 두고 보면 다 유사한, 즉 "오래된" 개발 문화에 익숙해져 있고, "오래된" 조직 구성 방법에 의존하고 있으며, "오래된" 조직 및 서비스 노하우를 그대로 사용하기 때문인 경우가 많다. 그리고 이런 이야기를 꺼내면 그래서 너네는 얼마나 잘하는데 라거나 한국에 그런 조직 있으면 나와보라고 하거나 하는 등 거부의 성향을 보인다. 당연하다. 변화가 반가운 사람들은 변화를 많이 겪은 사람들 뿐이다. 그리고 이런 사람들은 많지 않다. 



2. 그럼 어떻게  



https://blog.pivotal.io/labs/labs/design-critique-pivotal-labs



옆사람이 기획을 할 줄 알고 내가 개발을 할 줄 알고 내 오른쪽의 친구는 운영을 한다. 그리고 내 뒤에는 디자이너가 앉아있고, 이렇게 구성된 우리 팀의 주된 일은 로그인 서비스 개발이다. 기본적으로 API 로 다른 서비스와 연동하며, 관리의 편의를 위해 별도의 어드민 페이지가 있다. 업무의 수행, 전달, 확인은 모두 이슈 트래킹 도구를 통해 진행되며 별도의 보고를 위해 파워포인트나 엑셀을 만들지는 않는다. 우리 팀장님은 매주 월요일에 팀장 미팅에 다녀오면 이번주에 해야 할 일들을 이슈 트래커에 차곡차곡 정리한다. 정리가 끝나면 최대 1시간 정도의 팀 미팅을 한다. 이때 우리 팀 끼리만 미팅을 하는 것이 아니라 다른 팀 팀장 또는 서비스 매니징을 담당하는 쪽에서 함께 미팅에 참석한다. 그리고 전체 서비스의 방향과 새로 이슈트래커에 정리된 일들이 어떤 고객의 어떤 요청에 의해 발생한 일들인지 설명한다. 각 일들 별로 어떤 형태가 되어야 제대로 되는 것인지 완료 되었을때의 동작이나 디자인을 명시한다. 그리고 그런 일들의 기술 난이도와 우선 순위에 따라 분류한다. 한시간 정도 이런 미팅을 하고 나면 이번주에 해야할 일들의 윤곽이 잡힌다. 



http://www.stthomas.edu/news/silicon-valley-close/


아침에 출근하면 우리팀 말고도 전체 팀이 모인다. 한층에 모여서, 15분 정도 되는 간편한 미팅을 한다. 보통 스텐드-업 이라고 불리는 이 미팅은, 글로벌에 있는 우리 회사의 모든 팀들이 함께 들어온다. 그리고 누가 오늘 새로 입사했는지, 어제 무슨 큰일이 있었는지, 서비스에 크리티컬하거나 무지하게 궁금한 질문이 있는지 정도의 이야기를 나눈다. 마이크는 한번에 한사람에게 돌아가며, 10분에서 15분을 절대 넘지 않는다. 그렇게 아침 미팅을 하고 나면 다시 10-20분 정도의 팀 미팅을 한다. 이 미팅에서는 1. 팀과 관련된 주요 사건  2. 어제 해결이 안된일  3. 해결이 안된 일이 있다면 왜인지  4. 오늘 해결해야 할 일과 그래서 누구랑 같이 앉아서 일하면 좋은지  를 결정한다. 이 아침에 일어나는 두개의 미팅은 절대 앉아서 하지 않는다. 하나는 넓고 탁 트인 공간에서, 다른 하나는 팀 자리에 와서 작은 화이트 보드 앞에서 한다. 



https://www.glassdoor.com/Photos/Pivotal-Office-Photos-IMG455504.htm


둘이 함께 자리에 앉으면, 어떤 일을 해결 할지 이슈 트래킹 도구에서 선택한다. 선택의 요령은 일단 리스트상 윗쪽에 위치한 일이 프로덕트 매니저가 지정한 우선순위가 높은 일이다. 그리고 일을 해결하기 위한 조건을 살펴보고, 필요한 기술 스택에 대해 옆사람과 이야기 한 후 구현을 시작한다. 오늘 우리 로그인 서비스에 요구된 추가 기능은 트위터와의 Oauth2 연동이다. 기존의 인증 매커니즘에 추가적인 인증 소스를 더하는 것이다. 이 일의 해결을 위해 나는 오늘 로그인에 관련된 데이터 소스에 대한 정보를 다 알고 있는 친구와 짝을 지어 앉았다. 우리는 함께 앉아, Spring Boot 를 사용하여 만들어진 기존의 Facebook 연동과 Google, Amazon 인증 연동 방법을 간단히 살펴보고 Twitter 구현을 시작한다. 기본적으로는 내가 코딩을 하고, 옆에 앉은 친구는 내가 작성하는 코드를 보며 내가 중간에 틀리거나, 내가 구현하는 로직보다 더 좋은 알고리즘이 있다면 조언을 해 준다. 사용할 데이터베이스의 스키마 지정이나 테스트 코드의 추가에도 도움을 준다. 그렇게 새로운 기능을 하는 코드가 작성이 완료되면, 개발 환경에서 간단히 테스트 한다. 테스트에 별 문제가 없어 보이면, 코드 저장소에 업로드 한다. 업로드 된 commit 에는 나와 내 오늘 짝의 이니셜이 기입된다. 업로드 된 코드는 자동으로 회사에서 사용하는 테스트 도구로 전달된다. 그리고 이 테스트 도구는 보안성 검사, 취약성 검사, 서비스에 추가되어도 문제가 없는지 등의 의존성 검사등을 모두 자동으로 수행한다. 그리고 이 테스트 결과가 모두 녹색이라면, 테스트 시스템은 우리가 작성한 코드를 '스테이징'이라고 부르는 환경에 자동으로 배포한다. 



https://github.com/cloudfoundry-community/bosh-init-concourse


이렇게 스테이징 환경에 배포된 코드는 트위터와 로그인 연동이 적용된 상태로 동작한다. 그리고 이슈 트래커에는 특정 기능이 어떤 커밋 로그로 배포 되었는지 나타나며, 프로덕트 매니저는 이렇게 배포된 기능이 정상 동작하는지 바로 스테이징 환경에 접근하여 확인한다. 확인 뒤에 기능이 제대로 동작하며 문제가 없다면 Accept 를, 문제가 있거나 원래 의도와 다르다면 Decline 을 누른다. Accept 를 누르면, 이 커밋된 코드는 다음번 릴리즈에 배포되기 위해 추가 된다. 나와 내 동료는 Accept 가 된 것을 확인하고 잠깐 쉬기 위해 회사에 마련된 탁구대에서 3세트로 한게임 치거나, 비치된 스낵바나 냉장고에서 음료와 스낵을 가져다가 먹으며 이야기를 나눈다. 무엇을 하건간 약 5분에서 15분 정도의 휴식이 끝나고 나면, 다시 자리에 앉아 다른 일을 꺼내어 함께 시작한다.



http://www.wired.com/2013/11/pivotal-one/


코드 리뷰와 같은 과정은 없다. QA팀이 별도로 존재하지 않는다. 구현이 어려운 기능을 놓고 혼자 끙끙 앓고 있지 않는다. 애초에 대부분의 일을 30분 ~ 수시간 단위의 일로 쪼개는 것이 관건이고, 이것이 각각의 스토리로 관리가 된다. 그리고 일이 어렵건 쉽건 항상 함께 코드를 작성한다. 옆사람이 앉아서 세미콜론이 빠졌는지, 콤마가 빠졌는지, 더 좋은 라이브러리가 있는지 함께 앉아 조언해 준다. 그리고 이런 진행할, 진행중, 진행된 일들은 다른 팀의 누가 와서 보더라도 30분 정도만 투자하면 무슨 일이 어떻게 벌어지고 있는지, 이 팀의 개발 속도가 지금 어떤 상황인지 매우 손쉽게 알 수 있다. 즉, 투명하다. 


이런 팀들이 글로벌하게 존재한다. 나와 같은 로그인을 담당하는 팀이 저기 프라하랑 베이징에 두개가 더 있다. 우리는 같은 이슈 트래커를 공유하고, 그래서 우리 회사의 로그인 서비스는 쉬지 않고 개선된다. 퇴근할때 끄는 서버는 없다. 퇴근할때는 데스크탑만 꺼질 뿐이다. 여기서 일하면 보수도 좋다. 그리고 입사할때 인터뷰 자체가 그날 하루의 일정을 다른 엔지니어와 함께 하는 것이다. 내가 이력서에 기입한 내용에 대해 전화로 간단한 확인이 끝나면, 사무실로 면접을 보러 아침에 온다. 그러면 같이 스탠드업을 하고, 팀 미팅을 하고, 그리고 다른 피보탈 직원과 함께 이슈 트래커의 스토리를 해결한다. 그렇게 하루를 보내고 나면, 피보탈의 직원은 해당 면접자에 대한 피드백과 그가 작성한 코드를 기반으로 채용 여부를 결정한다. 당연히 입사한 사람들은 거의 즉시 일에 투입이 될 수 있고, 또 그런 직원들이 만약 다른 회사의 비전 또는 다른 스타트업에서 일을 하려고 할때 그는 이 회사의 경력이 매우 도움이 된다. 다른 회사들은 이 회사에서 일했던 기술자가 자신들의 회사에서도 일을 잘 할 수 있을것이라고 생각한다. 마치 아마존이나 넷플릭스에서 개발을 했던 사람이 그 회사에서 겪은 경험을 살려 새로운 비지니스를 도움 받았던 경험이 많기 때문에, 바로 그렇기 때문에 시장이 안다. 그래서 좋은 사람이 몰린다. 



3. 그래서 어쩌라고 


우리는 종종 불만 섞인 이야기를 많이 하거나, 듣고는 한다. 이래서 우리나라 소프트웨어 기술이 발전이 없다거나, 또 저거 삽질하고 있다거나, 뭔가 잘못된 일에 돈이 사용되고 있다거나 하는 주변의 수많은 이야기들. 그리고 그런 이야기들은 모두 각자 나름대로의 "한국 사람이라면" 이해할 만한 사연이 있다. 그런데, 만약 조직이 변화한다면 어떨까. 내가 하던 일의 방법이 바뀌고, 내가 어제까지는 그냥 내 자리에 앉아 혼자 일해도 되었는데 내일 부터는 다른 사람과 함께 앉아서 일해야 한다면 어떨까. 나의 능력이 과연 이런식으로 일을 하기에 적합할까. 그렇다, 바로 변화에 대한 공포가 조직을 지배하는 경우가 매우 많다. 


사업의 의사 결정권을 가진 사람들이 만약, 어떤 식으로든 조직의 개발 속도가 아마존 닷컴이 11초에 한번 업데이트 되는 속도를 당신네의 회사에서도 사용할 수 있다면 어떻게 하겠는가 라는 질문에 부정적으로 답변하는 사람은 없을 것이다. 이 로직이 가지는 장점이 전달 되면, 나머지는 비용과 시간의 문제일 뿐이다. 그리고 그래서 그렇게 했던 회사들이 어디가 있냐고 묻게 된다. 구글이 그랬고, 페이스북이 그랬고, 트위터가 그랬고, 이베이가 그랬고, 페이팔이 그랬고, 벤츠가 그렇고, 아우디가 그러며, 비엠더블유가 그렇고, 지이가 그런데, 폭스바겐과 포드도 그러고 있고, 컴캐스트도 그렇고, 비자, 제이피모건체이스, 휴매나, 올스테이트 기타 등등 산업도 다양하다. 왜냐! 소프트웨어가 필요하지 않은 산업은 없기 때문이다. 그리고, 그래서, 그렇기 때문에 이 관련 직군에 있다면 다가올 미래의 다양한 기회를 위해 준비를 해야 할 것이다. 사업가들은 이미 알고 있다. 규제와 제제, 자국 산업 보호, 이런것들도 사실 FTA의 영향에 따라 다양한 임팩트가 있을 것이다. 미국 물건 한국에 못파는게 규제때문이라고 하면 그 미국 기업도 미국도 가만히 있지는 않겠지. 


즉, 때는 온다. 따라서 두려워 피하지 말고 준비해야 한다. 그래야 그때 가면 경쟁력을 가질 수 있고, 이것은 준비된 사람과 아닌 사람을 가를 것이다. 

2012년에 아마존 웹 서비스 한번 살펴보라고 권고를 많이 하고 다녔더랬다. 2014년까지도 흥 관심 없어 하셨던 분들이 많다. 2015년에 회사가 전사적으로 아마존 웹 서비스를 사용하기로 했다. 그리고 그 분은... 


소개된 모든것이, 그리고 일하는 방식이, 문화가 정답은 아닐것이다. 다만, 현재 가지고 있는 많은 문제 중 하나는 개발 관련된 조직과 문화에 대한 to-be 가 좋은 모델이 별로 없다는 것이다. 구글이? 페이스북이? 그리고 그들이 자신들의 서비스를 잘 만들도록 구축한 문화를 다른 회사에 전달해 줄리가 없잖은가. 



http://enterpriseitadoption.com/



4. 위에서 설명한 내용들은 아래의 도구들에 기반하고 있다. 


http://pivotal.io/labs - 당연히도 피보탈 랩의 이야기니까. 

http://www.pivotaltracker.com  -  오픈소스 프로젝트는 무료로 사용할 수 있다. 

http://www.cloudfoundry.org   - 오픈소스는 그냥 가져다가 사용할 수 있으나, 운용 및 관리가 쉽지 않을 것이다. - 상용으로 Pivotal Cloud Foundry 가 있다. 호스팅 회사라면 한번 노려봄직 하다.  

http://www.concourse.ci - Docker 기반의 CI/CD 도구. 랩탑에 간단하게 vagrant 로 구성해서 사용할 수 있다. 

https://network.pivotal.io/products/pcfdev  -  랩탑이 맥북 프로에 메모리 만땅 정도 되면, Cloud Foundry 를 로컬에 설치해서 가지고 놀아볼 수 있다. CF의 구조 이해나 동작 방식, 또는 개발에 기여하고 싶다면 사용을 강추한다. vagrant 로 동작한다. 

http://github.com  -  오픈소스 프로젝트에는 이제 거의 당연하다고 해야. 사용법 정도는 기억하고, pull request 를 통해 기여를 하는것도 해 보자. 모든 프로젝트에 코드만 기여하는 것은 아니다. 번역이나 문서등을 한글화 하는 방법도 있으므로 시간이 되면 참여하는 경험을 쌓는 것도 보람진 경험이다. 

http://aws.amazon.com  -  위에 설명된 거의 대부분의 내용과 서비스, 그리고 개발은 이 위에서 돌아간다. 즉, 모르면 안되는 거다. 

http://azure.microsoft.com - AWS와 함께 알아두면 도움이 될 것이라고 생각한다. 

http://12factor.net   -  애플리케이션 개발 방법에 대한 일종의 가이드라인이다. 

http://spring.io   -   Spring 하시는 분들이라면 Spring Cloud 



엔지니어링 블로그들 

http://engineering.netflix.com 

http://engineering.pivotal.io 

http://nerds.airbnb.com 

http://engineering.instagram.com 

http://engineering.facebook.com 




http://www.wired.com/2013/11/pivotal-one/


소프트웨어 공장장


(younjin.jeong@gmail.com, 정윤진) 


애플리케이션 테스트를 AWS Lambda 로

Techs


(younjin.jeong@gmail.com, 정윤진) 


이 내용은 아래의 아마존 웹 서비스 한국 사용자 그룹에 전달 된 내용이므로 아래의 링크를 통해 읽어보실 수 있겠습니다. 

https://blog.awskr.org/running-tests-in-aws-lambda.html 


원문은 Pivotal Engineering 블로그에서 번역했습니당.  (http://engineering.pivotal.io

http://engineering.pivotal.io/post/running-tests-in-aws-lambda/ 


다음에는 더 재미진 글로!