[NBP기술&경험]본격 개발자도구 4종 활용 실습

NAVER Cloud
NAVER Cloud
Published in
14 min readMar 23, 2020

안녕하세요, 네이버 클라우드 플랫폼입니다.

이번 포스팅을 포함해 [네이버 클라우드 플랫폼의 데브섹옵스] Series 에서는 “네이버 클라우드 플랫폼 DevSecOps를 통한 CI/CD 구현”을 주제로 소개편과 실습편으로 나누어 진행됩니다.

지난 포스팅에서는DevSecOps의 개념부터 네이버 클라우드 플랫폼에서 구현 가능한 DevSecOps 서비스를 알아보았는데요, 이번 포스팅에는 본격적으로 네이버 클라우드 플랫폼의 개발자도구 4종을 활용한‘실습’을 진행해보겠습니다.

[네이버 클라우드 플랫폼의 데브섹옵스] Series

1편 : DevSecOps란 무엇인가? 커밋부터 디플로이까지 안전하게!

2편 : 본격 개발자도구 4종 활용 실습

네이버 클라우드 플랫폼

데브섹옵스(DevSecOps) 실습

지금까지 소개한 서비스를 활용해 네이버 클라우드 플랫폼에서 데브섹옵스를 구현하기 위한 간단한 시나리오를 구성해보자!

<그림1> NCP 전체 메뉴 화면

NCP 콘솔에 로그인하자. ‘Products & Service’ 메뉴에 들어가면 ‘Dev tools’ 분류에서 ‘SourceCommit’, ‘SourceBuild’, ‘SourceDeploy’, ‘SourcePipeline’을 볼 수 있다. ‘Site Safer’와 ‘File Safer’는 ‘Security’ 분류에 있다. <그림11>은 이들 서비스를 연동한 간단한 시나리오다.

<그림2> 데브섹옵스를 위한 간단한 시나리오 구조

Ⅰ. 파일 세이퍼 활성화

‘File Safer’ 서비스는 ‘SourceCommit’ 서비스를 구성한 후에도 활성화할 수 있다. 나는 처음부터 ‘File Safer’ 서비스를 쓰도록 의도한 시나리오이므로, 작업 단계 편의를 위해 ‘File Safer’ 서비스를 미리 설정하기로 했다. ‘SourceCommit’ 서비스를 구성하기 앞서서, ‘File Safer’ 서비스를 활성화를 시키자.

‘Security’ 분류에서 ‘File Safer’ 를 선택하면, ‘File Safe’ 서비스 콘솔을 확인할 수 있다. 간단히 이용 신청 후, 소스커밋 단계로 넘어가자.

<그림3> 파일 세이퍼 서비스 콘솔

Ⅱ. 소스 커밋

‘Dev Tools’ 분류에서 ‘SourceCommit’을 선택하면, 콘솔을 볼 수 있다. 콘솔에서 ‘리파지토리 생성’으로 들어간다. ‘리파지토리 이름’에 ‘python-webserver-example’를 입력 후, 간단히 설명을 추가한다.

<그림4> 소스커밋 서비스 콘솔과 기본 설정

만약, 파일 세이퍼 서비스에 가입하지 않았다면, 이용신청을 진행해야 한다. 보안 서비스가 연계돼 있다면, 상품 연동하기 체크 버튼을 눌러서 연동하면 된다. 다음으로 사용자별 권한을 설정할 수 있다. (지금 실습에서는 권한 설정은 넘어가겠다.) 이후 생성한 저장소 정보를 최종 확인 후 ‘생성’을 클릭한다. 생성한 저장소는 저장소 리스트에서 이름, URL, 마지막 커밋 날짜, 생성자를 확인할 수 있다.

<그림5>보안 서비스 신청과 연동
<그림6> 사용자 공유와 권한 설정
<그림7> 소스커밋 서비스 생성 최종 확인 단계
<그림8> 소스커밋 서비스의 현재 저장소 리스트 및 상세 현황

Ⅲ. 예시 파일 생성

테스트를 위한 파이썬 저장소를 생성해보자. ‘코드로 이동’으로 들어가, ‘파일 생성’ 버튼을 누른다. 코드를 넣을 수 있는 에디터 박스가 열리면서, 파일의 내용을 입력할 수 있다.

<코드1>과 <코드2>를 각각 생성 후 커밋을 한다. <코드1> ‘py-webserver-example.py’는 간단히 8080 포트에서 웹서비스를 할 수 있도록 구성한 코드이며, <코드2> ‘compiler.py’는 ‘py-webserver-example.py’를 컴파일 하기 위한 코드다. 두 파일을 커밋하면 ‘python-webserver-example’ 저장소의 파일 리스트에서 확인할 수 있다.

<그림9> ‘python-webserver-example’ 저장소의 파일 리스트
<그림10> ‘py-webserver-example.py’와 ‘compiler.py’ 파일생성

<코드1> py-webserver-example.py

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
PORT_NUMBER = 8080 # myHnadler 클래스는 브라우저에서 들어오는 모든 요청을 처리
class myHandler(BaseHTTPRequestHandler):
# GET 요청 handler
def do_GET(self):
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
# Send the html message
self.wfile.write("Hello World !")
return
try:
# 웹 서버를 만들고 핸들러를 정의해 들어오는 요청을 관리
server = HTTPServer(('', PORT_NUMBER), myHandler)
print 'Started httpserver on port ' , PORT_NUMBER

# 들어오는 HTTP 요청을 계속 기다리도록 구성
server.serve_forever()
# 바깥쪽 try 문에서 KeyboardInterrupt 예외를 처리
except KeyboardInterrupt:
print '^C received, shutting down the web server'
server.socket.close()

<코드2> compiler.py

import py_compile 
# 파이썬을 컴파일 하기 위한 구성
py_compile.compile(‘py-webserver-example.py’)

Ⅳ. 오브젝트 스토리지 생성

소스빌드 서비스를 구성하기에 앞서, 빌드 결과물을 저장할 공간을 준비해야 한다. NCP의 오브젝트 스토리지 서비스와 연동해 저장하자. ‘Storage’ 분류에서 ‘Object Storage’를 선택하면, 오브젝트 스토리지 콘솔을 볼 수 있다. ‘버킷 생성’ 버튼을 누르자.

<그림11> 오브젝트 스토리지 서비스 콘솔과 기본 설정

​버킷 이름을 입력하고 다음으로 넘어간다. 생성한 버킷의 공개 여부를 선택할 수 있으며, 각 서브 계정을 만든 후에 선택적으로 소유자에 대한 권한 설정을 할 수 있다. 최종 공개 여부와 권한 관리에 대해서 확인을 완료하면, 버킷이 생성된다.

<그림12> 버킷 권한 관리

도커(Docker)처럼 사용자가 공유한 컨테이너 이미지를 가져와서도 구성할 수 있다. 현재 날짜의 스냅인으로 구성하기 때문에 이미지는 변동 없다. 이런 스냅인 구성을 위한 컨테이너 이미지 저장 용도로 버킷을 하나 더 생성하자. 버킷 이름은 ‘python-compiler-container’로 한다.

Ⅴ. 컨테이너 레지스트리

앞서 언급한 공개 컨테이너 이미지를 저장하기 위해, 컨테이너 레지스트리(Container Registry) 서비스와 오브젝트 스토리지(Object Storage) 서비스를 연동해야 한다. ‘Compute’ 분류에서 ‘Container Registry’를 선택하면, 컨테이너 레지스트리 콘솔을 확인할 수 있다.

<그림13> 컨테이너 레지스트리 서비스 콘솔과 오브젝트 스토리지 서비스 연동

Ⅵ. 소스빌드

이제 소스빌드를 설정할 차례다. ‘Dev Tools’ 분류에서 ‘SourceBuild’를 선택하면, 소스빌드 콘솔을 확인할 수 있다. 소스빌드 서비스를 이용하기 위해 빌드 프로젝트를 생성한다.

<그림14> 소스빌드 서비스 콘솔과 빌드 프로젝트 기본 설정

※ 빌드 프로젝트를 생성하기 위해 앞서 구성한 빌드 결과물을 저장하기 위한 오브젝트 스토리지가 필수다. 그래서 오브젝트 스토리지 서비스를 구성한 후에 빌드 프로젝트로 들어가면 다음 구성에서 시간을 절약할 수 있다.

빌드 프로젝트 이름을 ‘python-compile-example’이라고 명명하며, 빌드 프로젝트 설명을 선택한다. 빌드 대상은 예시 파이썬 코드를 커밋한 ‘python-webserver-example’를 선택하며, 현재 해당 저장소에는 분기 관련 저장소 정보가 없기 때문에 기본값인 ‘master’를 선택한다.

빌드 환경은 소스빌드 이미지, 컨테이너 레지스트리 이미지, 퍼블릭 레지스트리(Public Registry) 이미지 등 총 3가지를 지원한다. 나는 퍼블릭 레지스터(Public Register) 이미지를 가져와서 빌드를 구성하고자 한다.

도커 허브(hub.docker.com)의 파이썬 2.7.17 버전 컨테이너 이미지로 선택했다. 개인이 만든 컨테이너 이미지보다는 많은 사람이 사용하는 공개 버전을 쓰는 편이 코드 의존성 이슈 및 이미지 구성 실패에 대한 리스크를 줄일 수 있다. 빌드 명령어는 최종 결과물이 확장자가 ‘pyc’인 파일을 생성하기 위해, ‘python compiler.py’를 입력한다.

<그림15> 빌드 프로젝트 환경 및 명령어 설정

빌드 결과물은 앞서 생성한 오브젝트 스토리지에 저장되며, 사용했던 컨테이너 이미지는 컨테이너 레지스트리 서비스를 통해 오브젝트 스토리지 서비스에 저장된다. 현재 개발 환경에 변화가 없도록 NCP가 제공하는 컨테이너 레지스트리에 저장해, 항상 동일한 품질과 의존성을 가진 결과물이 생성되도록 한다. 이는 파이썬 컴파일뿐 아니라 GO언어(Golang), ‘gcc’ , 자바(Java)에서도 동일하게 사용할 수 있다.

<그림16> 빌드 프로젝트 업로드 설정

빌드 결과물은 보안 서비스와 연계할 수 있다. 빌드 과정에서 발생하는 결과 과정 로그를 통해 이력을 볼 수 있다. 또한 결과물을 생성하는 과정에서 오브젝트 스토리지에 저장하는 컴파일된 파일은 파일 세이퍼로 악성 여부를 검사할 수 있다.

빌드 프로젝트에 대한 권한 세부 설정까지 완료하면, 최종 확인을 거친다. 소스빌드 서비스를 구성한 전체 내용을 볼 수 있다.

<그림17> 빌드 프로젝트 최종 확인

Ⅶ. 소스 배포

‘Dev Tools’ 분류에서 ‘SourceDeploy’를 선택하면, 소스 배포 서비스 콘솔을 볼 수 있다. 빌드 과정에서 생성한 결과물을 해당 서버로 배포하는 배포 프로젝트를 생성하자. 프로젝트 이름은 ‘http-deploy-process’라고 입력한다. 배포 환경 설정으로 넘어가면 배포 스테이지를 ‘dev’, ‘test’, ‘real’ 중에서 정할 수 있다. 현재는 해당 서버에 에이전트가 설치돼 있지 않으면 배포 과정을 진행하지 않는다.

<그림18> 소스 배포 서비스 콘솔과 배포 프로젝트 기본 설정
<그림19> 배포 프로젝트 배포 환경 설정

배포 프로젝트 사용자 권한 설정에서 사용자 공유와 배포 실행 관리자를 설정할 수 있다. 만약 배포 실행 관리자가 승인 과정에서 승인하지 않는다면, 그 배포는 진행되지 않는다. 이후 설정 사항을 최종 확인하면 배포 프로젝트 생성이 끝난다.

<그림20> 배포 프로젝트 사용자 권한 설정

Ⅷ. 소스 배포 시나리오 생성

배포 프로젝트 생성 이후에는 배포 시나리오를 생성해야 한다. 예시 용도이므로 배포 스테이지를 ‘dev’만 선택했다. 배포 시나리오 이름은 ‘http-deploy-process’로 입력한다.

<그림21> 배포 시나리오 생성과 기본 설정

배포 시나리오에서 이미 빌드를 완료한 파일을 배포할 것이므로 ‘Object Storage’ 서비스를 선택한다. 이후 배포에 필요한 결과물 파일과 배포 시나리오 전체를 확인한 후 ‘적용’ 버튼을 누른다.

<그림22> 배포 파일과 배포 파일 위치 설정

배포 명령어는 배포 전과 배포 후에 실행할 명령어를 단계별로 설정할 수 있다. 현재 시나리오는 ‘test.zip’ 파일을 설치하는 서버에서 ‘/home/deploy’ 디렉터리 아래에 복사해 배포하는 순서로 진행된다. 이후 최종 확인을 거치며, 배포 시나리오 생성이 끝난다.

<그림23> 배포 명령어 설정

Ⅸ. 소스 파이프라인

마지막 단계로 파이프라인을 구성해보자. ‘Dev Tools’ 분류에서 ‘SourcePipeline’을 선택하면 소스 파이프라인 서비스 콘솔을 볼 수 있다. 지금까지 구성한 소스커밋 서비스, 소스빌드 서비스, 소스 배포 서비스를 연동해 저장소, 빌드, 배포를 통합하는 단계다. 파이프라인 역시 사용자마다 권한을 설정할 수 있다.

<그림24> 소스 파이프라인 서비스 콘솔과 파이프라인 생성

파이프라인을 정상적으로 구성하면 <그림25>와 같이 녹색 링크와 체크 표시를 볼 수 있다. 한 번 이상 파이프라인을 실행한다면, 해당 페이즈(Phase)에 대한 결과와 로그를 자세히 확인할 수 있다. 파이프라인 진행 과정 중 ‘Build Phase’에 발생하는 결과물은 파일 세이퍼를 통해 악성 파일 검증을 하므로, 별도 보안 검사를 따로 설정하지 않아도 간편하게 보안 점검을 할 수 있다.

파이프라인에서 문제없이 배포까지 끝나면, 배포 서버에 구성한 간단한 웹 서비스가 정상적으로 구동하는 것을 확인할 수 있다

<그림25> 파이프라인 정보와 파일 세이퍼 결과
<그림26> 배포 서버에서 서비스하는 ‘py-webserver-example.pyc’

지금까지 총 2편에 걸쳐 데브섹옵스(DevSecOps)의 개념과 데브섹옵스를 구현할 수 있는 네이버 클라우드 플랫폼 서비스를 알아보았습니다. 서비스 페이지 및 사용 신청은 하단 링크 페이지에서 가능합니다.

​더욱 유익한 컨텐츠로 찾아뵙겠습니다. 긴 글 읽어주셔서 감사합니다.

  • 본 포스팅은 국내 유일 소프트웨어 매거진 마이크로소프트웨어 399호 ‘자동화의 광시곡’에 기고한 글입니다.

--

--

NAVER Cloud
NAVER Cloud

We provide cloud-based information technology services for industry leaders from startups to enterprises.