1.4 KT Cloud Packaging 레시피 제작

1.4.1 Packaging 레시피 소개

ㅁ 개요

레시피는 Packaging에서 패키지를 배포 할 때 어떻게 만들것인가를 기술한 하나의 문서입니다.
사전에 어떻게 만들것인지에 대해 프로그래밍 하듯이 미리 JSON 문서로 만들어두고, 패키지 생성이 필요할 때마다 사용하여 배포에 사용됩니다.

ㅁ 레시피 언어 포맷

KT Cloud Packaging 레시피는 JSON 텍스트 파일입니다. 포맷은 JSON 표준을 따릅니다.
본 매뉴얼에서는 JSON에 대한 설명을 따로 수록하지는 않습니다.

JSON에 대한 자세한 내용은 http://www.json.org 를 참고하시기 바랍니다.


1.4.2 Packaging 레시피 구성

[TIP] 레시피를 처음부터 작성하는 것은 어려운 일입니다.
미리 작성되어 제공되는 '공유용 레시피'를 복사하여, 필요에 따라 수정하여 사용하는 것이 더욱 수월합니다.

레시피는 크게 아래 다섯 파트로 구성됩니다.

 

ㅁ Version (옵션)

레시피가 작성된 버전을 의미합니다. 작성된 날짜 형태로 입력됩니다.

ㅁ Description (옵션)

레시피 설명을 입력합니다. 레시피 본문(Body)에서 보는 용도이며, UI에서 보이는 레시피 설명과는 별도입니다. 
길이 제한은 4000자 이내입니다.

ㅁ Parameters (옵션)

레시피 작성 과정에서 지정하지 않고, 이 레시피로 패키지를 배포할 때 입력 받을 값(파라미터)를 정합니다.
예를 들어 동일한 레시피(구조)로 다른 Zone에 여러 번 배포하고 싶으면 Zone ID를 파라미터로 기술해 두면, 배포할 때마다 Zone을 다르게 해서 배포가 가능합니다.

파라미터로 지정된 값은 Resources나 Outputs에서 참조하여 사용할 수 있습니다.

형식은 아래를 따릅니다.

"Parameters" : {
    "MyParam1" : {
        "Type" : "xxxx",
        "Default" : "yyyy",
        (기타 다른 내용들)
    },
    "Another" : {
        "Type" : "zzzz",
        (기타 다른 내용들)
    }
}


각 파라미터 안에 들어갈 수 있는 내용들은 아래와 같습니다.

항목 필수여부 설명
Type Yes Boolean, String, Number, CommaDelimitedList 중 한 가지 타입을 부여합니다.
String 타입은 문자열을 의미합니다.
Number 타입은 정수나 소수점 숫자를 표현합니다.
Number 타입에 대한 값은 integer 나 float 일 수 있지만, Number 의 값은 String 타입과 같이 ""로 묶여야 합니다.
CommaDelimitedList 타입은 쉼표(,)로 분리된 String 타입의 배열입니다.
배열에 포함되는 String 의 값에는 공백이나 쉼표가 들어가서는 안된다.
Default No package 생성 시 사용자가 parameter 값을 지정하지 않을 경우 사용되는 기본 값입니다.
만약 Default 항목이 없는 Parameter 에 대해 생성 시 값이 전달되지 않으면 패키지 생성이 실패합니다.
Default에 기입되는 값 역시 parameter 값의 제약(아래)을 지켜야 합니다.
NoEcho No 만약 "TRUE"일 경우에 별표(***)로 값이 치환되어 표시됩니다.
AllowedValues No parameter 값으로 허락된 값들의 배열입니다.
AllowedPattern No String 타입에 대한 제약사항입니다. parameter 의 string 타입 값에 허용되는 패턴을 정규 표현식으로 표현합니다.
MaxLength No String 타입에 대한 제약사항입니다. parameter 의 string 타입 값의 최대 길이를 정합니다.
MinLength No String 타입에 대한 제약사항입니다. parameter의 string 타입 값의 최소 길이를 정합니다.
MaxValue No Number 타입에 대한 제약사항입니다. parameter 의 number 타입 값의 최대 값을 정합니다.
MinValue No Number 타입에 대한 제약사항입니다. parameter 의 number 타입 값의 최소 값을 정합니다.
Description No parameter 에 대한 4000 자 이내의 설명입니다.
ㅁ Resources (필수)

패키지에 배포할 자원들을 정의합니다. 

자원은 일반적으로 생각할 수 있는 VM, Disk, WAF, DB, NAS 뿐 아니라 네트워크 연결 작업이나 서버 추가 작업 등 작업 자체도 자원으로 포함됩니다.
예를 들면, 포트포워딩 작업, 로드밸런서에 서버 추가, 오토스케일링 그룹 설정 등이 포함됩니다.

Resources 항목은 크게 Type, Properties, DependsOn 으로 구분 됩니다.
- Type : 자원의 유형을 의미합니다. VM은 VirtualMachine 이라는 타입이고, 포트포워딩 룰은 PortForwardingRule이라는 타입입니다.
- Properties : 각 타입의 자원을 만들기 위해 필요한 속성을 입력합니다. 예를 들면, VM 타입의 자원은 사양, OS, Zone, userdata 등의 속성들을 가집니다.
- DependsOn : 자원의 배포 순서를 지정하기 위해 사용하는 항목입니다.

대표적인 Resources 중 하나인 VM의 정의 예시 입니다.

"Resources" : {
    "MyVM" : {
        "Type" : "UPAC::VirtualMachine",
        "Properties" : {
            "ProductCode": "std_cent 7.0 64bit en_1x1_roortonly",
            "DisplayName": "MyServer",
            "ZoneId": "qqqq-wwwwwwww-rrrrrrrr"
        }
    }
}

Type으로 VirtualMachine을 지정하고 있고, 그에따라 필요한 Properties인 서비스오퍼링, VM 이름, VM 이미지, Zone 등을 정하고 있습니다.

Resources의 종류별 Type과 그에 따른 Properties는 내용이 많아 별도 페이지에서 설명합니다. 여기를 참고하세요.

ㅁ Outputs (옵션)

이 레시피를 사용하여 패키지 배포가 끝난 후, 사용자에게 반환해 줄 결과값을 지정합니다.
예를 들어, VM을 배포한 후 그 VM의 비밀번호를 전달할 수 있습니다.

 


1.4.3 레시피 내장 함수

레시피 내에서 사용할 수 있는 내장 함수를 소개합니다.

ㅁ Ref

특정 파라미터나 자원의 어떤 값을 참조할 때 사용합니다.

ㅇ 사용 방법

"Ref" : "논리적 이름"

논리적 이름에는 파라미터명 혹은 자원의 논리적 이름을 사용할 수 있습니다.

파라미터명을 명시하면, 패키지를 배포할 시점에 배포자가 해당 파라미터로 입력한 값을 그대로 사용합니다.

자원의 논리적 이름을 사용할 경우, 해당 자원에 정해진 값을 반환합니다.
정해진 값은 아래와 같습니다.

자원 유형 반환되는 항목
VirtualMachine id
Volume id
VolumeAttachment (반환값 없음)
FirewallRule id
IpAddress id
PortForwardingRule id
LoadBalancerRule id
LoadBalancerAssignment id
LoadBalancer Id(loadbalancerid)
LoadBalancerWebServerAddition id(serviceid)
WAF id
WAFWebServerAddition id(webserverid)
WAFWebSiteAddition id(websiteresourceid
DB id(instanceid)
DBParameterGroup id(parameter groupid)
DBAccessControlGroup id(accesscontrol groupid)
DBReplicationGroup id(replication groupid)
DBReplicationGroupMultiZone id(replication groupid)
DBHaGroupSingleZone id(ha groupid)
AutoScalingGroup (반환값 없음)
LaunchConfiguration (반환값 없음)
ScalingPolicy Id(scalingpolicyurn)
Topic Id(topicurn)
Alarm (반환값 없음)
WAIT_OBJECT UserSignal
WAIT_OBJECT_HANDLE id

ㅇ 사용 예시 1 (파라미터 반환)

"Parameters": {
    "zone1": {
        "Type": "String"
    }
},
"Resources: {
    "MyVM": {
        "Type": "UPAC::VirtualMachine",
        "Properties": {
            "ZoneID: {
                "Ref": "zone1"
            }
        }
    }
}

Parameters에서 zone1이라는 파라미터를 입력받아서, 실제로 Resources 내 MyVM이라는 VirtualMachine을 만들 때 ZoneID로 사용합니다.

ㅇ 사용 예시 2 (자원 반환)

"Resources": {
    "MyVM": {
        "Type": "UPAC::VirtualMachine"
    },
    "MyIP": {
        "Type": "UPAC::IpAddress"
    },
    "DoPortForwarding": {
        "Type": "UPAC::PortForwardingRule",
        "Properties": {
            "VirtualMachineId":{
                "Ref": "MyVM"
            },
            "IpAddressId": {
                "Ref": "MyIP"
            },
            "PubilcPort": "22",
            "PrivatePort": "22",
            "Protocol": "TCP"
         }
    }
}
ㅁ GetAtt

입력 문자를 Base64로 인코딩 합니다. VM 생성할 때 userdata 전송할 때 주로 사용됩니다.

ㅇ 사용 방법

"GetAtt": [
    "자원 이름",
    "속성 이름"
]

자원 별 속성은 아래와 같습니다.


자원 유형 속성 이름
VirtualMachine IpAddress, password
Volume  
VolumeAttachment  
FirewallRule  
IpAddress IpAddress
PortForwardingRule  
LoadBalancerRule  
LoadBalancerAssignment  
LoadBalancer LoadBalancerId, ServiceIp
LoadBalancerWebServerAddition  
WAF ServiceIp
WAFWebServerAddition  
WAFWebSiteAddition  
DB Port, Ip, PrivatPort, PrivateIp
DBParameterGroup  
DBAccessControlGroup  
DBReplicationGroup  
DBReplicationGroupMultiZone  
DBHaGroup havip
AutoScalingGroup  
LaunchConfiguration  
ScalingPolicy  
Topic  
Alarm  
WaitObject  
WaitObjecthandle  

ㅇ 사용 예시

"Outputs": {
    "MyPassword": {
        "Value": {
            "GetAtt": [
                "MyVM",
                "password"
            ]
        },
        "Description": "VM 비밀번호"
    }
}
ㅁ Base64

입력 문자를 Base64로 인코딩 합니다. VM 생성할 때 userdata 전송할 때 주로 사용됩니다.

ㅇ 사용 방법

"Base64" : {인코딩할문자열}

ㅇ 사용 예시

"MyVM": {
    "Type": "UPAC::VirtualMachine",
    "Properties": {
        "UserData": {
            "Base64": {
                "yum install -y httpd"
            }
        }
    }
}

 

ㅁ Join

원하는 값들을 구분자로 연결된 하나의 문자열로 만들 때 사용합니다. 구분자가 빈 문자열인 경우, 모든 값들이 구분자 없이 연결 됩니다.

ㅇ 사용 방법

"Join": [
    "구분자", [
        쉼표(,)로 구분된 값들의 목록
    ]
]

ㅇ 사용 예시 1

"Join": [
    ":", [
        "a",
        "b",
        "c"
    ]
]

이 함수의 실행 결과는 "a:b:c" 가 된다.

ㅇ 사용 예시 2 (VM 생성 시 user data로 여러 줄 전달)

"UserData": {
    "Base64": {
        "Join": [
            "", [
                "yum install -y httpd\n",
                "systemctl start httpd\n",
                "systemctl enable httpd\n"
            ]
        ]
    }
}

세 줄의 커맨드라인이 하나의 명령어가 되어 Base64 인코딩 후 user data로 전달 됩니다.