ucloud packaging 예제템플릿 V1.0 (2013.07) KT 문서생성일 : 2013-07-25 ver1.0
이문서는 ucloud packaging( 이하 UPAC 으로칭함 ) 템플릿을작성하기위한일종의가이드라인으로작용할수있도록몇가지템플릿예제를제시합니다. 여기서예를든템플릿들은 UPAC 의주요기능들을보여줄수있고, 또한예제들을통하여사용자가직접자신의템플릿을작성하는데시작지점으로작용할수있도록구성하였습니다. 따라서템플릿전체영역에대한자세한설명은원할경우에는 ucloud packaging 템플릿매뉴얼을참조하라. 또한여기예제에서제시한개별리소스들의설정값들은예시를목적으로하기때문에각리소스들의설정값의의미에대해서는자세히다루지않고있습니다. 개별리소스들의설정값의의미에대한자세한설명은그리소스에해당하는 ucloud 서비스메뉴얼을참조하기바랍니다. 문서개정일 : 2013.07.25 페이지 2 / 19
1. 포트포워딩규칙이설정된한개의서버 용도 이템플릿은사용자가하나의 ucloud server 를생성하고서버에 ssh 에접속하기위해공용 ip 를 할당하고포트포워딩규칙을설정한다. 이템플릿을이용하여패키지를배포하면새로생성된 서버에 ssh 접속이가능하다. 구성 Virtual Router 포트포워딩규칙 : Public 22 private 22 ucloud Server 템플릿 "Description":"Create a server, ip address, portforwarding rule for ssh connection", "Parameters": "ZoneId": "Description":"zone id, kr-3 is default", "Type":"String", "Default":"dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" "ServiceOfferingId": "Description":"service offering id for VM, premium 1vCore 1GB RAM is default ", "Type":"String", "Default":"c504e367-20d6-47c6-a82c-183b12d357f2" 문서개정일 : 2013.07.25 페이지 3 / 19
"TemplateId": "Description":"VM Image, Centos 5.4 32bit is default", "Type":"String", "Default":"b1c8383a-de6e-425f-ba18-12cadad827d3" "DiskOfferingId": "Description":"Disk Volume for VM, 100GB is default", "Type":"String", "Default":"87c0a6f6-c684-4fbe-a393-d8412bcf788d" "Resources": "MyServer": "Type":"UPAC::VirtualMachine", "Properties": "ServiceOfferingId": "Ref":"ServiceOfferingId" "TemplateId": "Ref":"TemplateId" "ZoneId": "Ref":"ZoneId" "DiskOfferingId": "Ref":"DiskOfferingId" "MyIpAddress": "Type":"UPAC::IpAddress", "Properties": "ZoneId":"dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" "MyPortForwardingRule": "Type":"UPAC::PortForwardingRule", "Properties": 문서개정일 : 2013.07.25 페이지 4 / 19
"PrivatePort":"22", "PublicPort":"22", "Protocol":"TCP", "VirtualMachineId": "Ref":"MyServer" "IpAddressId": "Ref":"MyIpAddress" 설명 위예제템플릿은총 3 개의리소스로구성된다. 여기서사용된항목들에대한 ID 정보는 ucloud 콘솔의 ucloud packaging 화면을참조하라. MyServer 라는 UPAC::VirtualMachine 리소스는클라우드서버를생성하기위한다음의항목들을 설정한다. ServiceOfferingId 는클라우드서버의스팩을지정한다. 예제에서사용한스팩은 premium 1vCore cpu, 1G RAM 을장착한서버이다. TemplateId 는클라우드서버를생성하는데필요한운영체제이미지를지정한다. 예제에서사용한이미지는 ucloud 에서기본으로제공하는것들중하나인 Centos 5.4 32bit 운영체제가설치된이미지이다. 여기에자신이만든이미지 ID 를설정하면해당이미지를이용한서버가생성된다. ZoneId 는클라우드서버가생성될 availability zone 을지정한다. 예제에서사용한 zone 은 KOR- Central Zone B 이다. DiskOfferingId 는클라우드서버가사용할디스크용량을지정한다. 예제에서사용한디스크는 100G 의용량을가진디스크이다. MyIpAddress 라는 UPAC::IpAddress 리소스는새로운 IP 주소를생성하기위한다음의항목들을 설정한다. ZoneId 는위에서설명한개념과동일하다. 문서개정일 : 2013.07.25 페이지 5 / 19
MyPortForwardingRule 이라는 UPAC::PortForwardingRule 은클라우드서버와 IP 주소에대한 포트포워딩규칙을생성하기위한다음의항목들을설정한다. PrivatePort 와 PublicPort 는각각포트포워딩을위한외부접속포트와클라우드서버의내부포트번호이다. ssh 접속을위해 22 번으로설정하였다. VirtualMachineId 는포트포워딩을할클라우드서버의 ID 이다. 이예제에서는앞에서설정한 MyServer 에대한포트포워딩규칙을설정하고자하므로 MyServer 의 ID 는사용자가알수없는상황이다. 따라서 Ref 라는템플릿내장함수가사용되었다. 예제와같이설정하면 ucloud packaging 서비스가패키지생성시에 MyServer 의 ID 값을 VirtualMachineID 값으로치환하여설정하게된다. 만약 MyServer 가아니라자신이기존에이미생성해놓은클라우드서버에대한포트포워딩규칙을설정하고자한다면이값을 "VirtualMachineId": " 그클라우드서버의 ID" 와같이설정하면된다. 템플릿내장함수에대한보다자세한정보는 ucloud packaging 템플릿매뉴얼을참조하라. IpAddressId 는포트포워딩을할공개 IP 주소다. 역시 MyIpAddress 가아직생성되지않았으므로 Ref 내장함수가사용되었다. 문서개정일 : 2013.07.25 페이지 6 / 19
2. LAMP 스택을설치한서버 용도 특정소프트웨어가설치된서버를운영하고자할때사용자가미리해당소프트웨어를클라우드서버에설치한뒤자신의이미지를생성하여이용할수있을것이다. 하지만이미지를이용하여서버를생성할경우항상고정적인서버가생성되므로서버생성시마다다른설정을하고자한다면서버생성후에수작업으로처리해야하는단점이있다. ucloud packaging 의 ucloud-init 기능을이용하면서버생성시점에필요한작업을자동화할수있다. ucloud-init 이설치된이미지를이용하여서버를생성하고서버생성시에필요한작업내용을 user data 로전달하면템플릿을이용하여소프트웨어설치및초기설정작업을수행할수있다. 이예제에서는 LAMP 스택을설치하고초기설정하는예제를통해사용자가서버생성시필요한다양한작업을스크립트를통해자동화할수있음을보여준다. ucloud-init 에대한자세한설명은해당매뉴얼을참고하라. 이템플릿을이용하여 LAMP 스택이설치되고 MySQL 접속정보가웹페이지에설정된상태의클라우드서버를생성할수있다. 구성 ucloud Server Linux Apache MySQL PHP 템플릿 "UPAC Template Version": "2012-06-01", "Description": "Create a LAMP installed server", "Parameters": "ZoneId": "Description":"zone id, kr-3 is default", "Type":"String", "Default":"dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" "ServiceOfferingId": "Description":"service offering id for VM, premium 1vCore 1GB RAM is default", 문서개정일 : 2013.07.25 페이지 7 / 19
"Type":"String", "Default":"c504e367-20d6-47c6-a82c-183b12d357f2" "DiskOfferingId": "Description":"Disk Volume for VM, 100GB is default", "Type":"String", "Default":"87c0a6f6-c684-4fbe-a393-d8412bcf788d" "sshportnumber": "Description": "ssh port for vm", "Type": "Number", "Default": "22" "webportnumber": "Description": "web port for lamp", "Type": "Number", "Default": "80" "DBName": "Default": "MyDatabase", "Description": "MySQL database name", "Type": "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern": "[a-za-z][a-za-z0-9]*", "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters." "DBUsername": "NoEcho": "true", "Description": "Username for MySQL database access", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern": "[a-za-z][a-za-z0-9]*", "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters." "DBPassword": 문서개정일 : 2013.07.25 페이지 8 / 19
"NoEcho": "true", "Description": "Password for MySQL database access", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern": "[a-za-z0-9]*", "ConstraintDescription": "must contain only alphanumeric characters." "DBRootPassword": "NoEcho": "true", "Description": "Root password for MySQL", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern": "[a-za-z0-9]*", "ConstraintDescription": "must contain only alphanumeric characters.", "Default": "mysqladmin" "Resources": "sislampip": "Type": "UPAC::IpAddress", "Properties": "ZoneId": "dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" "sislampvm": "Type": "UPAC::VirtualMachine", "Properties": "ServiceOfferingId": "Ref":"ServiceOfferingId" "TemplateId": "89be7654-880d-441b-af1b-0b6488597435", "ZoneId": "Ref":"ZoneId" "DiskOfferingId": "Ref":"DiskOfferingId" 문서개정일 : 2013.07.25 페이지 9 / 19
"UserData": "Base64": "Join": [ "", [ "shell_commands:\n", " - echo ", "\"CREATE DATABASE ", "Ref": "DBName" ";\\n", "GRANT ALL ON ", "Ref": "DBName" ".* TO '", "Ref": "DBUsername" "'@localhost IDENTIFIED BY '", "Ref": "DBPassword" "';\\n\" > /tmp/setup.mysql\n", " - apt-get -y install unzip\n", " - apt-get -y install apache2\n", " - apt-get -y install php5\n", " - apt-get -y install libapache2-mod-php5\n", " - bash -c \"DEBIAN_FRONTEND=noninteractive aptitude install -q -y mysql-server\"\n", " - apt-get -y install libapache2-mod-auth-mysql\n", " - apt-get -y install php5-mysql\n", " - /etc/init.d/apache2 restart\n", " - sleep 3 \n", " - mysqladmin -u root password '", "Ref": "DBRootPassword" 문서개정일 : 2013.07.25 페이지 10 / 19
"'\n", " - mysql -u root --password='", "Ref": "DBRootPassword" "' < /tmp/setup.mysql\n" ] ] "sshport": "Type": "UPAC::PortForwardingRule", "Properties": "PrivatePort": "22", "PublicPort": "Ref": "sshportnumber" "Protocol": "TCP", "VirtualMachineId": "Ref": "sislampvm" "IpAddressId": "Ref": "sislampip" "webport": "Type": "UPAC::PortForwardingRule", "Properties": "PrivatePort": "80", "PublicPort": "Ref": "webportnumber" "Protocol": "TCP", "VirtualMachineId": "Ref": "sislampvm" 문서개정일 : 2013.07.25 페이지 11 / 19
"IpAddressId": "Ref": "sislampip" "Outputs": "generatedpw": "Value": "GetAtt": [ "sislampvm", "password" ] "Description": "generated vm password" "publicipaddress": "Value": "GetAtt": [ "sislampip", "ipaddress" ] "Description": "public ip for lamp" 설명 위예제템플릿은하나의템플릿파라미터와하나의리소스로구성되어있다. 템플릿파라미터는패키지생성시마다변경하고자하는값을처리하기위한기능으로템플릿내에 Parameters 항목에원하는이름의파라미터정보를정의하고템플릿내에원하는지점에서해당파라미터를 Ref 내장함수로참조할수있다. 템플릿에파라미터가정의되면사용자는패키지생성요청시해당파라미터의값을함께전달해야한다. 템플릿파라미터에대한더자세한설명은템플릿매뉴얼을참고하라. DBRootPassword 라는파라미터는클라우드서버에설치될 MySQL 의 root 계정패스워드를입력 받기위해정의된파라미터다. 패스워드라는특성상 NoEcho 속성을 True 로설정하여콘솔 문서개정일 : 2013.07.25 페이지 12 / 19
화면에서직접볼수없도록설정했다. 이템플릿을이용하여패키지를생성할때패스워드의 값을함께전달해서패키지생성요청을해야한다. MyLAMPServer 라는 UPAC::VirtualMachine 리소스는 LAMP 스택이설치된클라우드서버를 생성하기위하여첫예제의내용과대부분동일한설정을갖는다. 다른점은 ucloud-init 을 사용하여 LAMP 스택을설치하고초기설정을하기위한내용인데다음과같다. 클라우드서버생성후 LAMP 스택을설치하기위해 ucloud-init 의기능을이용해야한다. 따라서 TemplateId 의값이운영체제만설치되어있는이미지가아닌 ucloud-init 이설치되어있는이미지의 ID 값이다. 예제에서사용한이미지는 Ubuntu 11.04 32bit 운영체제에 ucloud-init 이설치되어있는이미지다. UserData 에 ucloud-init 이실행할스크립트내용을지정한다. UserData 는반드시 Base64 인코딩되어전달해야하기때문에템플릿내에서 Base64 내장함수를사용하면 ucloud packaging 서비스가패키지생성시해당값을 Base64 인코딩하여사용한다. Base64 내장함수에 ucloudinit 용스크립트문자열을지정하면 ucloud-init 이이내용을실행하게된다. 이스크립트는 ucloud-init 의문법에맞게작성되어야하므로자세한내용은해당매뉴얼을참조하라. 이예제에서는 MuSQL 의 root 패스워드를파라미터로전달받아그값을 ucloud-init 의스크립트에서사용하고자한다. 이를위해 Ref 내장함수를이용한다. 스크립트에서사용할값에 Ref 내장함수를적용하기위해 Joing 내장함수를이용하여스크립트문자열과파라미터참조부분을결합하였다. 본예제에서는그이외에가독성을목적으로스크립트문자열도적절히분리하여 Join 내장함수의결합기능을이용하였다. ucloud-init 의스크립트전체를하나의문자열로 Base64 인코딩내장함수로전달하면파라미터치환을할수없으므로 Join 내장함수를이용하여파라미터참조부분 UserData 의 "Ref": "DBRootPassword" 부분은패키시생성시에사용자가제공한패스워드값으로치환되어 ucloud-init 의스크립트가실행된다. 문서개정일 : 2013.07.25 페이지 13 / 19
3. ucloud watch 의알람이설정된 autoscaling 웹서버그룹 용도 ucloud watch 의알람조건에따라서버의개수를자동으로늘리고줄일수있는웹서버그룹을생성한다. 로드밸런서를생성하고이를오토스케일링그룹에설정함으로써로드밸런싱기능을수행한다. 이템플릿을이용하여패키지를생성하면알람조건에따라자동으로웹서버의개수가조절되고이서버들이로드밸런서를통해부하분산이이루어지는웹서버그룹을만들수있다. 구성 Loadbalnacer Virtual Router autoscaling trigger c Autoscaling Group 템플릿 "Description":"Autoscaling web server group with loadbalancer and alarm", "Resources": "MyIPAddress": "Type":"UPAC::IpAddress", "Properties": "ZoneId":"dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" 문서개정일 : 2013.07.25 페이지 14 / 19
"MyLoadBalancer": "Type":"UPAC::LoadBalancer", "Properties": "LoadBalancerOption":"roundrobin", "ServicePort":"80", "HealthcheckType":"tcp", "ServiceType":"http", "ZoneId":"dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" "MyLaunchConfiguration": "Type":"UPAC::LaunchConfiguration", "Properties": "TemplateId":"b1c8383a-de6e-425f-ba18-12cadad827d3", "ServiceOfferingId":"c504e367-20d6-47c6-a82c-183b12d357f2", "DiskOfferingId":"87c0a6f6-c684-4fbe-a393-d8412bcf788d" "MyAutoscalingGroup": "Type":"UPAC::AutoscalingGroup", "Properties": "AvailabilityZones":[ "dfd6f03d-dae5-458e-a2ea-cb6a55d0d994" ], "LaunchConfigurationName": "Ref":"MyLaunchConfiguration" "LoadBalancers":[ "LoadBalancerId": "Ref":"MyLoadBalancer" "LoadBalancerType":"VPX", "IpAddressId": "Ref":"MyIPAddress" "PublicPortRangeFrom":"8001", "PublicPortRangeTo":"8003", "PrivatePort":"80" 문서개정일 : 2013.07.25 페이지 15 / 19
], "MaxSize":"3", "MinSize":"1" "MyUpScalingPolicy": "Type":"UPAC::ScalingPolicy", "Properties": "AdjustmentType":"ChangeInCapacity", "AutoScalingGroupName": "Ref":"MyAutoscalingGroup" "ScalingAdjustment":"1" "MyDownScalingPolicy": "Type":"UPAC::ScalingPolicy", "Properties": "AdjustmentType":"ChangeInCapacity", "AutoScalingGroupName": "Ref":"MyAutoscalingGroup" "ScalingAdjustment":"-1" "MyCPUHighAlarm": "Type":"UPAC::Alarm", "Properties": "AlarmActions":[ "Ref":"MyUpScalingPolicy" ], "ComparisonOperator":"GreaterThanThreshold", "EvaluationPeriods":"2", "MetricName":"CPUUtilization", "Namespace":"ucloud/server", "Dimensions":[ 문서개정일 : 2013.07.25 페이지 16 / 19
"Name":"AutoscalingGroupName", "Value":"MyAutoscalingGroup" ], "Period":"5", "Statistic":"Average", "Threshold":"1", "Unit":"Percent" "MyCPULowAlarm": "Type":"UPAC::Alarm", "Properties": "AlarmActions":[ "Ref":"MyDownScalingPolicy" ], "ComparisonOperator":"LessThanThreshold", "EvaluationPeriods":"2", "MetricName":"CPUUtilization", "Namespace":"ucloud/server", "Dimensions":[ "Name":"AutoscalingGroupName", "Value":"MyAutoscalingGroup" ], "Period":"5", "Statistic":"Average", "Threshold":"1", "Unit":"Percent" "Outputs": "MyLoadBalancerIp": "Description":"The IP address of the website", 문서개정일 : 2013.07.25 페이지 17 / 19
"Value": "GetAtt":[ "MyLoadBalancer", "ServiceIp" ] 설명 위예제템플릿은총 8 개의리소스와하나의 Output 으로구성된다. 먼저외부에서웹서버에접근하기위한공용 IP 를생성하고 ucloud 부가서비스의로드밸런서를생성한다. 그리고오토스케일링설정을위해각각 LaunchConfigure, AutoscalingGroup, ScalingPolicy 를생성한다. ScalingPolicy 의경우서버의개수를늘리는것과줄이는것두개를생성하며, 마지막으로두개의정책을트리거링할두개의알람을생성한다. 마지막으로생성된로드밸런서의서비스 IP 주소를결과값으로저장한다. MyIpAddress 리소스는 RVM 이포트포워딩하기위한웹서버의공용 IP 를위해생성한다. 리소스를구성하는속성들의내용은첫예제와같다. MyLoadBalancer 라는 UPAC::LoadBalancer 리소스는 ucloud 부가서비스로드밸런서로서다음의항목들을설정한다. Bandwidth 는로드밸런서의대역폭을지정한다. LoadBalancerOption 은로드밸런싱방식을지정한다. MyLaunchConfiguration 이라는 UPAC::LaunchConfiguration 리소스는오토스케일링서비스가 새로운클라우드서버를생성할때사용하는정보로서예제에나온내용들은첫예제템플릿의 클라우드서버를생성하는내용과동일하다. MyAutoscalingGroup 이라는 UPAC::AutoscalingGroup 리소스는오토스케일링그룹을생성하기 위해다음의항목들을설정한다. AvailabilityZones 는클라우드서버를생성할존정보를지정하는항목으로여러존을지정할경우오토스케일링서비스가자동으로존을분산하여클라우드서버를생성한다. LaunchConfigurationName 은이오토스케일링그룹이새로클라우드서버를생성할때사용하는 LaunchConfiguration 정보를지정하는것으로예제에서는위에서생성한 MyLaunchConfiguration 을지정하였다. 문서개정일 : 2013.07.25 페이지 18 / 19
LoadBalancers 는클라우드서버를생성하거나삭제할때등록할로드밸런서의정보를설정한다. 여러개의로드밸런서를하나의오토스케일링그룹에지정할수도있다. 예제에서는앞서생성한부가서비스로드밸런서인 MyLoadBalancer 를지정하였다. MaxSize 와 MinSize 는운영할클라우드서버의최대 / 최소개수를지정한다. MyUpScalingPolicy 와 MyDownScalingPolicy 라는 UPAC::ScalingPolicy 리소스는스케일링조건이 만족되었을때수행할스케일링정책을지정하기위해다음의항목들을설정한다. AdjustmentType 은클라우드서버의조절유형을정하는것으로예제에서는개수로조절하라는 ChangeInCapacity 로지정되었다. ScalingAdjustment 는조절할클라우드서버의양을지정하는것으로 AdjustmentType 에따라값의유형이달라진다. 예제에서는 ChangInCapacity 가클라우드서버의개수를의미하므로 ScalingAdjustment 값을 1 과 -1 로하여정책이수행될때 1 개의서버를각각늘리거나줄이는것으로지정되었다. MyCPUHighAlarm 과 MyCPULowAlarm 이라는 UPAC::Alarm 리소스는 ucloud watch 의모니터링결과로발생시킬알람을의미한다. MyCPUHighAlarm 의경우 MyAutoscalingGroup 이라는오토스케일링그룹의클라우드서버들의 5 분동안의 ("Period":"5") 평균 CPU 사용량이 90%("Threshold:"1","Unit":"Percent") 을초과하는경우가 2 회 ("EvaluationPeriods":"2") 발생하면앞서생성한 MyUpScalingPolicy 정책에따라클라우드서버 1 개가생성된다. MyCPULowAlarm 은평균 CPU 사용량이 70% 미만일경우에클라우드서버 1 개가종료된다. AlarmActions 는이알람이발생할때수행할작업들의리스트로서예제에서는앞서생성한 클라우드서버를 1 개생성하는오토스케일링정책을지정하였다. MyLoadBalancerIp 라는결과값은로드밸런서생성결과로패키지생성시점에얻을수있는로드밸런서의서비스 IP 주소를얻기위해 GetAtt 내장함수를사용한다. Outputs 항목에서지정한정보들은패키지생성이후에 ucloud packaging 서버에저장되고콘솔화면이나 open api 호출을통해값을얻을수있다. 예제에서지정한결과값인 MyLoadBalancerIp 값을이용하여외부에서웹서버에접속할 IP 주소로사용할수있다. 문서개정일 : 2013.07.25 페이지 19 / 19