Packer Plugin Builder 를 활용한 내 서버 이미지 생성 자동화
‘Hashicorp’에서 제공하는 ‘Packer’라는 툴을 사용하여 AWS, Azure, GCP 등의 클라우드 플랫폼에서 서버 이미지 생성을 자동화 할 수 있는 기능이 있습니다.
네이버 클라우드 플랫폼에서도 내 서버 이미지 생성을 자동화할 수 있는
‘Packer Plugin Builder’를 제공하고 있습니다.
이번 글에서는 Packer Plugin Builder를 활용해 네이버 클라우드 플랫폼에서
내 서버 이미지 생성을 손쉽게 자동화하는 방법에 대해 소개합니다.
들어가며..
기존에 네이버 클라우드 플랫폼 콘솔을 사용하여 내 서버 이미지를 생성하는 단계를 살펴보면 아래 그림과 같습니다.
각 단계마다 설정이 완료될 때까지 기다려야 하고, 서버 인스턴스가 생성된 후 해당 서버에 들어가서 필요한 작업을 별도로 진행해야 하는 등 수동으로 작업해야 하는 부분이 매우 많았습니다. 하지만, Packer를 이용하면 사용자는 아래와 같은 단 한 줄의 command 실행 후 커피 한잔 마시는 여유를 가질 수 있습니다.
$ packer build template.json
실행결과 아래와 같습니다.
네이버 클라우드 플랫폼 콘솔에서는 아래 화면과 같이 내 서버 이미지가 생성되었음을 알 수 있습니다.
인자로 전달되는 `template.json` 은 아래 샘플과 같이 구성할 수 있습니다.
{
“variables”: {
“ncloud_access_key”: “{{env `NCLOUD_ACCESS_KEY`}}”, “ncloud_secret_key”: “{{env `NCLOUD_SECRET_KEY`}}”
},
“builders”: [
{
“type”: “ncloud”,
“access_key”: “{{user `ncloud_access_key`}}”,
“secret_key”: “{{user `ncloud_secret_key`}}”,
“server_image_product_code”: “SPSW0LINUX000045”,
“server_product_code”: “SPSVRSSD00000003”,
“server_image_name”: “packer-test-{{timestamp}}”,
“server_image_description”: “server description”,
“communicator”: “ssh”,
“ssh_username”: “root”
}
],
“provisioners”: [
{
“type”: “shell”,
“inline”: [“yum -y install httpd”, “systemctl enable httpd.service”]
}
]
}
위 샘플은 OS 는 `Cent OS 7.2–64` , 서버 스펙은 `[Standard] 2vCPU, 4GB Mem, 50GB Disk]` , 그리고 apache 서버 까지 설치되어 생성된 내 서버 이미지입니다. apache 서버는 `init script(user_data)`를 사용할 수 도 있지만 `provisioning` 단계에서 설치하도록 `provisioners` 을 추가했습니다.
아래에서는 생성된 내 서버 이미지를 이용해서 서버 인스턴스를 생성해 보겠습니다.
생성된 내 서버 이미지를 이용해서 서버 인스턴스 생성하기
1. Packer를 사용해서 생성된 서버 이미지를 선택한 후 ‘서버 생성’ 버튼을 클릭합니다.
2. 생성될 서버 인스턴스에 대한 서버 설정을 합니다.
3. 인증키를 설정합니다.
4. http 연결을 위해 80 port가 열려 있는 ACG를 선택합니다. 없을 경우, 미리 생성해 두어야 합니다.
5. 생성될 서버 인스턴스 설정 정보를 확인한 후 ‘서버 생성’ 버튼을 클릭합니다.
6. 위 과정을 거치면 서버 인스턴스가 생성됩니다.
7. 서버 생성이 완료된 후, 설치된 apache가 정상 작동되는지를 확인하기 위해 공인 IP를 생성해서 방금 만든 서버 인스턴스에 할당합니다. 공인 IP는 ‘Public IP’에서 생성합니다.
8. 생성한 서버를 선택해서 공인 IP를 신청합니다.
9. 생성된 공인 IP 정보를 확인합니다.
10. 공인 IP로 접속해서 생성된 웹 서버에 접속해서 정상적으로 웹 서버가 설치되어 동작하는지 확인합니다.
파라미터 정보
내 서버 이미지 생성을 위해 필요한 파라미터들에 대한 설명입니다. 필수인것과 선택인 것들로 구분되어 집니다.
필수 파라미터 :
■ type : packer 에서 NAVER CLOUD PLATFORM builder 를 사용하기 위한 값이며 “ncloud” 을 사용해야만 합니다.
■ ncloud_access_key : 사용자의 Access Key입니다. ‘NAVER CLOUD PLATFORM 포털’ 로그인→ ‘마이페이지’ → ‘계정관리’ → ‘인증키 관리(https://www.ncloud.com/mypage/manage/authkey)' 에서 조회 가능합니다.
■ ncloud_secret_key : 사용자 인증키와 대응하는 Secret Key입니다.’NAVER CLOUD PLATFORM 포털’ 로그인→ ‘마이페이지’ → ‘계정관리’ → ‘인증키 관리(https://www.ncloud.com/mypage/manage/authkey)' 에서 조회 가능합니다.
■ server_image_product_code : 생성할 이미지 상품 코드입니다. ( 명시 하지 않을 경우 `member_server_image_no` 값이 필요함합니다. )
■ server_product_code : 생성할 상품(스펙) 코드입니다. 서버 이미지를 만들기 위해서는 서버 인스턴스를 먼저 생성해야 하는데, 생성될 서버 인스턴스의 스펙 코드입니다.
■ member_server_image_no : 기존 생성한 사용자 이미지를 사용해서도 서버 이미지 생성이 가능합니다. 이 경우 사용할 내 서버 이미지 넘버 입니다. ( 명시 하지 않을 경우 server_image_product_code 값이 필요합니다.)
선택 파라미터 :
■ server_image_name : 생성할 내 서버 이미지 이름입니다.
■ server_image_description : 생성할 내 서버 이미지의 설명을 추가할 수 있습니다.
■ block_storage_size : 블록 스토리지 추가할 경우 10(GB)~2000(GB) 까지 10(GB) 단위로 추가가 가능합니다.
■ access_control_group_configuration_no: Windows 서버 생성시 winrm 접속 허용을 위해서는 ACG 설정이 필요합니다. 접근소스 (“0.0.0.0/0”), 허용 포트 (5985) 가 명시된 ACG 를 미리 만들어 둔 후 해당 ACG NO 를 사용합니다.
■ user_data: 인스턴스 생성시 수행할 init script 를 작성해서 사용할 수 있습니다.
■ Linux 환경에서는 Python, Perl, Shell 등의 스크립트를 사용할 수 있습니다 . 첫 줄에 #!/usr/bin/env python, #!/bin/perl, #!/bin/bash 등과 같은 형태로 실행하고자 하는 스크립트 경로를 지정해야 합니다.
■ Windows 환경에서는 Visual Basic 스크립트만 사용할 수 있습니다.
■ 스크립트의 내용은 영문으로만 작성해야 합니다.
■ region: 이미지를 생성할 region 이름입니다. 기본 값은 한국(Korea) 입니다. 사용 가능한 값은 `Korea` / `US-West` / `HongKong` / `Singapore` / `Japan` / `Germany` 입니다.
Packer Plugin Builder 동작 Flow
Packer Plugin Builder는 내 서버 이미지 생성을 위해 내부적으로 네이버 클라우드 플랫폼 API 를 사용하며, 아래와 같은 흐름으로동작 합니다.
위 Flow 중 파란 박스 부분이 Packer Plugin Builder for NAVER CLOUD PLATFORM 에서 수행하는 부분입니다. 하얀 박스의 `Provisioning` / `Post-Processor` 는 Packer 에서 제공하는 기능을 사용합니다.
[Flow 설명]
■ Validate template : 인자로 받은 json 파일에 대한 내용을 validate 합니다.
■ Create Login Key : Provisioning 단계를 위해서는 서버 인스턴스 생성 이후 id / password 를 이용해서 서버에 접속 해야 합니다. 서버 인스턴스 생성후 패스워드를 알기 위해서 생성하는 로그인키(인증키) 입니다. 생성된 로그인키는 서버 인스턴스 반납 후 삭제 됩니다.
■ Create Server Instance : 내 서버 이미지 생성하기 위해 베이스가 될 서버 인스턴스를 생성합니다.
■ Create Block Storage Instance : 기본 스토리지 외에 추가 스토리지를 생성할 수 있습니다. 최소 10GB 부터 최대 2000GB 까지 생성 가능하며, 10GB 단위로 설정할 수 있습니다. 스토리지 사이즈에 따라 내 서버 이미지 생성 시간이 증가합니다.
■ Get Root password : 생성된 로그인키를 이용해서 서버 인스턴스 패스워드를 가져 옵니다.
■ Create Public IP : Provision 을 위해 서버에 접속할 공인 IP 를 생성합니다.
■ Provisioning : `Provisioners` 를 사용할 경우 이 단계에서 서버에 접속해서 정의해 놓은 task 를 수행합니다.
■ Stop Server Instance : 내 서버 이미지 생성을 위해서는 서버 인스턴스를 정지해야 합니다.
■ Create Server Image : 이 단계에서 내 서버 이미지가 생성됩니다.
■ Delete Block Storage Instance : 서버 인스턴스에 추가된 추가 스토리지를 생성합니다. 생성된 추가 스토리지 정보는 내 서버 이미지에 저장 되어 있어서, `Create Server Image` 단계에서 생성된 내 서버 이미지를 사용해서 서버 인스턴스 생성시 추가 스토리지도 다시 생성됩니다
■ Terminate Server instance : 서버 인스턴스를 반납합니다.
■ Delete Login Key : 로그인키(인증키)를 삭제 합니다.
■ Delete Public IP : 생성된 공인키를 삭제합니다.
■ Post-Processor : `Post-Processor` 를 사용할 경우, 이 단계에서 실행됩니다.
[Provisiong / Post-Processor]
`Provisioning` 와 `Post-Processor` 에 대한 내용은 아래 링크에서 확인 가능합니다.
■ Provisioners
■ Post-Processor
설치 방법
Packer Plugin Builder for NAVER CLOUD PLATFORM은 Packer(v1.2.0~)에 내장되어 배포되기 때문에 사용하기 위해서는 Packer를 다운 받아야 합니다. Packer는 다운로드 페이지에서 다운 받을 수 있습니다. 다운받은 바이너리를 사용하는 PC OS의 실행 PATH에 맞도록 저장합니다.
마무리하며..
사용자는 Packer 를 이용해서 Application Release / bug patch 등의 작업 이후 내 서버 이미지 생성을 자동화하여 배포 단계에 포함할 수 있으며, 이런 과정도 젠킨스 Packer Plugin을 사용하여 자동화 할 수 있습니다.
Packer Plugin Builder 지원으로 사용자는 콘솔이나 API 를 직접 사용해서 내 서버 이미지를 만드는 것보다 쉽게 자동화하여 내 서버 이미지를 만들 수 있게 되었습니다. 앞으로도 사용자를 위한 기능들을 계속 추가 하겠습니다. 감사합니다.
[ 이렇게 사용하세요!] 빌드 및 배포 결과 구독을 위한 Jenkins 설치형 상품과 Slack Message 연동하기