네이버 클라우드 플랫폼에서 Packer를 통한 서버 이미지 구성하기

송창안
NAVER CLOUD PLATFORM
5 min readSep 30, 2019

--

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

손쉽게 서버 이미지를 구성할 수 있는 툴인 Packer에 대해 익혀보고자 몇 가지 실습을 시도했고 오늘은 이를 통해 획득한 정보를 공유하고자 합니다.

필요한 준비물은 아래와 같으며 네이버 클라우드 플랫폼 환경에서 구성하였습니다.

아래는 네이버 클라우드 플랫폼에서 API 인증키를 생성하는 절차를 설명한 그림입니다.

Naver Cloud Platform에서 인증키 생성 절차 (마이페이지에서 인증키 관리)
Naver Cloud Platform에서 인증키 생성 절차 (신규 API인증키 생성)
Naver Cloud Platform에서 인증키 생성 절차 (신규 API인증키 생성후 판업창)
Naver Cloud Platform에서 인증키 생성 절차 (신규 API인증키 생성 후 확인)

저는 클라우드 환경에서 별도의 서버 노드에 packer 설치한 후에 진행하였으며, 아래 내용은 별도의 서버 구성 후 진행되는 내용부터 시작입니다.

1. packer를 설치할 노드에 설치

(이 방법은 packer 공식 홈페이지에서 다운로드하셔도 무방합니다.)

# export VER=”1.4.2" # wget https://releases.hashicorp.com/packer/${VER}/packer_${VER}_linux_amd64.zip

2. 노드에 unzip 패키지 설치하여, packer 압축/해제

# yum install unzip -y # unzip packer_${VER}_linux_amd64.zip Archive: packer_1.4.2_linux_amd64.zip inflating: packer root@packer:~# ls packer packer_1.4.2_linux_amd64.zip

3. packer 바이너리를 이동하여, bin 파일에 복사

# mv packer /usr/local/bin/.

4. 구성을 원하는 이미지 형태를 template.json 라는 파일을 생성/구성

제가 테스트를 진행하기 위해 생성한 json 파일입니다.

https://github.com/Planet15/ncloud_infra_example/blob/master/packer/t

{ “variables”: { “ncloud_access_key”: “”, “ncloud_secret_key”: “” }, “builders”: [ { “type”: “ncloud”, “access_key”: “{{user `ncloud_access_key`}}”, “secret_key”: “{{user `ncloud_secret_key`}}”, “ssh_username” : “root”, “block_storage_size” : “10”, “server_image_product_code”: “SPSW0LINUX000046”, “server_product_code”: “SPSVRSTAND000003”, “server_image_name”: “packertest”, “server_image_description”: “server image description”, “region”: “Korea” } ], “Provisioners” : [ { “type”: “shell”, “inline”: [ “yum install httpd -y”, “systemctl enable httpd”, “systemctl start httpd” ] } ] }

naver cloud platform에서의 packer를 사용하는 것에 있어서 항목이 있으며, builder 각 항목 별 설명을 하도록 하겠습니다.

->

  • type(필수): “ncloud”
  • ncloud_access_key(필수): 사용자의 Access Key.

ncloud console 페이지에서 마이페이지 > 인증키 관리 페이지에서 인증키 생성 및 조회 가능합니다.

(처음 생성한 경우, 반드시 신규 API 인증키를 클릭해야 합니다.)

  • ncloud_secret_key (필수): 사용자 인증키와 대응하는 Secret Key.

ncloud console 페이지에서 마이페이지 > 인증키 관리 페이지에서 인증키 생성 및 조회 가능합니다.

  • server_image_product_code(필수): 생성할 이미지 상품 코드

(명시하지 않을 경우 member_server_image_no 값이 필요하며, member_server_image_no는 이전에 서버 이미지 작업이 저장되어, server image 저장소에 저장되어 있는 것을 뜻합니다.)

오른쪽 링크에 정리해두었습니다. http://bit.ly/2ZimVtS

  • ssh_username(필수) : SSH에 연결할 사용자 이름을 뜻합니다. SSH를 사용하는 경우 필요합니다.
  • server_product_code(필수): 생성할 상품(스펙) 코드 필요하며, 아래의 링크에 정리해두었습니다. http://bit.ly/2ZimVtS
  • member_server_image_no(옵션): 기존 생성한 사용자 이미지 코드. 기존 생성한 사용자의 이미지가 있을 경우, 이를 사용하여 이미지를 생성할 수 있음 (명시하지 않을 경우, server_image_product_code 값이 필요).
  • server_image_name(옵션): 생성할 이미지 이름
  • server_image_description(옵션): 생성할 이미지 설명
  • block_storage_size(옵션): 블록 스토리지를 추가할 경우 10(GB)~2000(GB)까지 10(GB) 단위로 추가 가능합니다.
  • region(옵션): 이미지를 생성할 region 이름(기본값: Korea)

(입력 가능한 값: Korea/US-West/HongKong/Singapore/Japan/Germany)

  • Provisioners : 셸 프로비저닝은 이미지를 생성할 시스템에 소프트웨어를 설치하고 구성하는 가장 쉬운 방법입니다.
  • type : 여러 가지 타입이 있으며, 현재의 문서에서는 shell를 사용합니다. 각각 원하는 타입에 대해서는 아래의 링크를 참조 바라며, ansible 과의 연동도 가능합니다.
  • inline : 실행할 명령의 배열 뜻하며, 명령은 개행 문자로 연결되어 단일 파일로 바뀌므로 동일한 문맥에서 모두 실행됩니다. 이렇게 하면 한 명령으로 디렉터리를 변경하고 다음 디렉터리의 다음작업을 위한 활용이 가능합니다. 인라인 스크립트는 시스템 내에서 간단한 작업을 수행하는 가장 쉬운 방법입니다.

5. 구성한 내용에 대해서 구문에 대한 검증 진행

여기서는 명령어 실행은 외부 클라우드에 접근하지 않습니다.

# packer validate template.json Template validated successfully.

6. Naver cloud platform에서 이미지 생성을 진행

실제로 이과정에서는 NCP에서 시스템을 대여받아, 이미지를 생성하는 과정을 진행합니다.

앞서 언급한 내용과 같이, 기존에 구성된 이미지에서 추가 구성이 필요한 경우, member_server_image_no 파라미터를 통해 이미지 생성이 가능합니다.

# packer build template.json ncloud output will be in this color. ncloud: Creating Naver Cloud Platform Connection … ==> ncloud: Validating deployment template … ==> ncloud: Create Login Key ==> ncloud: Login Key[packer-********] is created ==> ncloud: Create Server Instance ==> ncloud: Server Instance is creating. Server InstanceNo is ******** ==> ncloud: Server Instance is created. Server InstanceNo is ******** ==> ncloud: Create extra block storage instance ==> ncloud: Get Root Password ==> ncloud: Root password is ******** ==> ncloud: Create Public IP Instance ==> ncloud: Public IP Instance [********:***.***.***.***] is created ==> ncloud: Waiting for SSH to become available… ==> ncloud: Connected to SSH! ==> ncloud: Provisioning with shell script: /tmp/packer-shell445841710 ncloud: Loaded plugins: fastestmirror, langpacks ncloud: Determining fastest mirrors ncloud: * base: ftp.kaist.ac.kr ncloud: * extras: ftp.kaist.ac.kr ncloud: * updates: ftp.kaist.ac.kr ncloud: Resolving Dependencies ncloud: → Running transaction check ncloud: — -> Package httpd.x86_64 0:2.4.6–89.el7.centos will be installed ncloud: → Processing Dependency: httpd-tools = 2.4.6–89.el7.centos for package: httpd-2.4.6–89.el7.centos.x86_64 ncloud: → Processing Dependency: /etc/mime.types for package: httpd-2.4.6–89.el7.centos.x86_64 ncloud: → Running transaction check ncloud: — -> Package httpd-tools.x86_64 0:2.4.6–89.el7.centos will be installed ncloud: — -> Package mailcap.noarch 0:2.1.41–2.el7 will be installed ncloud: → Finished Dependency Resolution ncloud: ncloud: Dependencies Resolved ncloud: ncloud: ================================================================================ ncloud: Package Arch Version Repository Size ncloud: ================================================================================ ncloud: Installing: ncloud: httpd x86_64 2.4.6–89.el7.centos updates 2.7 M ncloud: Installing for dependencies: ncloud: httpd-tools x86_64 2.4.6–89.el7.centos updates 90 k ncloud: mailcap noarch 2.1.41–2.el7 base 31 k ncloud: ncloud: Transaction Summary ncloud: ================================================================================ ncloud: Install 1 Package (+2 Dependent packages) ncloud: ncloud: Total download size: 2.8 M ncloud: Installed size: 9.6 M ncloud: Downloading packages: ncloud: — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ncloud: Total 12 MB/s | 2.8 MB 00:00 ncloud: Running transaction check ncloud: Running transaction test ncloud: Transaction test succeeded ncloud: Running transaction ncloud: Installing : mailcap-2.1.41–2.el7.noarch 1/3 ncloud: Installing : httpd-tools-2.4.6–89.el7.centos.x86_64 2/3 ncloud: Installing : httpd-2.4.6–89.el7.centos.x86_64 3/3 ncloud: Verifying : httpd-tools-2.4.6–89.el7.centos.x86_64 1/3 ncloud: Verifying : mailcap-2.1.41–2.el7.noarch 2/3 ncloud: Verifying : httpd-2.4.6–89.el7.centos.x86_64 3/3 ncloud: ncloud: Installed: ncloud: httpd.x86_64 0:2.4.6–89.el7.centos ncloud: ncloud: Dependency Installed: ncloud: httpd-tools.x86_64 0:2.4.6–89.el7.centos mailcap.noarch 0:2.1.41–2.el7 ncloud: ncloud: Complete! ==> ncloud: Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. ==> ncloud: Stop Server Instance ==> ncloud: Server Instance is stopping. Server InstanceNo is 2053382 ==> ncloud: Server Instance stopped. Server InstanceNo is 2053382 ==> ncloud: Create Server Image ==> ncloud: Server Image[packertest:*****] is creating… ==> ncloud: Server Image[packertest:*****] is created ==> ncloud: Delete Block Storage Instance ==> ncloud: Block Storage Instance is deleted. Block Storage InstanceNo is [******] ==> ncloud: Terminate Server Instance ==> ncloud: Clean up Public IP Instance ==> ncloud: Clean up login key Build ‘ncloud’ finished. ==> Builds finished. The artifacts of successful builds are: → ncloud: ncloud.server.image: Member Server Image Name: packertest Member Server Image No: *****

추가적으로 도움이 될만한 링크 입니다.

이상입니다.
오늘은 Packer 실습을 통해 얻은 경험을 여러분과 공유해보는 시간을 가졌습니다.
다음에 더 좋은 콘텐츠로 찾아뵙겠습니다.

--

--

송창안
NAVER CLOUD PLATFORM

안녕하세요? Naver Cloud Platform Evangelist 송창안입니다. 복잡한 클라우드 기술을 여러분과 함께 확인 하며, 쉽게 풀어가보고 싶습니다.