Java를 사용하여 Windows Azure Pack에서 VM 역할 사용
적용 대상: Windows Azure Pack
이 가이드에서는 테넌트 개발자가 VM 역할 인스턴스 만들기, 업데이트 및 크기 조정을 포함하여 VM 역할(가상 머신 역할)으로 수행할 수 있는 몇 가지 기본 작업을 보여 줍니다. 코드 예제는 Java로 작성되었으며 Eclipse IDE를 사용하여 만들어졌습니다. 이 가이드의 예제는 서비스 관리 API의 HTTP REST 기반 서비스를 사용하므로 HTTP 작업 요청을 보낼 수 있는 다른 언어로 작업하도록 이러한 예제를 수정할 수 있습니다. VM 역할에 사용할 수 있는 모든 URL에 대한 가이드는 VM 역할에 대한 URL 참고 자료 [SPFSDK][VMROLE]를 참조하세요.
VM 역할은 웹 서버 또는 웹 작업자와 같은 특정 작업에 전념하는 하나 이상의 가상 머신을 나타낼 수 있습니다. 서비스 공급자는 큐레이팅된 가상 머신 역할 갤러리를 통해 가상 머신을 프로비전하기 위한 셀프 서비스 환경을 테넌트에 제공할 수 있습니다. 테넌트는 테넌트 포털 UI 또는 HTTP REST 기반 서비스를 사용하여 갤러리에서 VM 역할을 프로비전할 수 있습니다. VM 역할은 가상 머신의 수와 버전을 쉽게 조정할 수 있는 크기 조정 작업을 제공하기 때문에 가상 머신을 프로비전하는 기존의 모델과 다릅니다. 기존 프로비저닝 모델에서 WAP 및 Java와 함께 가상 머신을 사용하는 방법에 대한 가이드는 Java를 사용한 Virtual Machine Management를 참조하세요. VM 역할과 함께 제공되는 기능은 가상 머신의 수와 버전을 조정해야 할 때 애플리케이션의 빠른 프로비전 및 프로비저닝 해제를 지원할 수 있습니다.
Service Provider Foundation 및 Windows azure Pack for Windows Server는 서비스 공급자가 다중 테넌트 포털을 빌드할 수 있도록 확장 가능한 서비스를 노출합니다. 테넌트는 서비스 공급자의 셀프 서비스 고객입니다. 서비스 공급자는 테넌트의 계정을 구독 ID와 연결하고 테넌트를 확인하는 데 사용되는 보안 인증서에 공개 키를 제공합니다. 이 가이드의 예제를 실행하려면 VM 역할 갤러리를 제공하는 서비스 공급자, VM 역할을 호스트하는 구독의 클라우드 서비스 및 가상 머신을 배치하기 위한 구독의 가상 네트워크가 있어야 합니다. 서비스 공급자가 사용자 이름과 암호를 제공한 경우 테넌트 포털 UI에 로그인하여 구독 ID를 찾을 수 있습니다. 포털에 로그인하는 동안 호스트에서 신뢰할 수 있는 사용자로 사용자를 확인할 수 있는 인증서를 업로드할 수 있으며 가상 머신을 배치하는 데 사용할 수 있는 가상 네트워크를 만들 수 있습니다.
이 가이드에서 샘플을 실행한 후에는 Java 코드로 다음 작업을 수행할 수 있습니다.
VM 역할을 호스트하는 클라우드 서비스 만들기
갤러리에서 VM 역할 목록 가져오기
VM 역할 갤러리 항목에 대한 참조 가져오기
새 VM 역할 인스턴스 만들기
VM 역할 크기 조정
가상 머신 시작, 중지, 다시 시작, 종료 또는 삭제
VM 역할 업데이트 또는 삭제
VM 역할을 호스트하는 클라우드 서비스 만들기
VM 역할을 호스트하려면 구독에 클라우드 서비스가 있어야 합니다. 모든 클라우드 서비스를 나열하려면 CloudServices에 대한 다음 URL로 HTTP GET 작업 요청을 보냅니다. VM 역할 갤러리 또는 클라우드 서비스에서 URL을 사용할 때마다 api-version=2013-03 쿼리 문자열도 추가해야 합니다. 쿼리 문자열은 항상 ? URL 뒤의 문자입니다.
https://server:port/subscription-id/CloudServices?api-version=2013-03
다음 Java 코드 예제인 Get_list 구독의 모든 클라우드 서비스를 반환할 수 있습니다. 이 가이드의 예제는 문자열로 구독 ID를 나타냅니다. 2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa. 일반적으로 x-ms-principal-id 헤더를 현재 구독과 연결된 테넌트 전자 메일로 설정할 수 있습니다.
public class Get_list
{
public static void main(String[] args) throws Exception
{
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null){System.out.println(decodedString);}
in.close();
}
}
HTTP 응답의 값 필드가 비어 있으면 구독에 클라우드 서비스가 없으며 VM 역할을 프로비전하기 전에 만들어야 합니다. 동일한 CloudServices URL에 HTTP POST 작업 요청을 전송하여 클라우드 서비스를 만들 수 있지만 요청 본문에서 새 클라우드 서비스에 대한 이름 및 레이블을 지정해야 합니다. 이 가이드의 예제에서는 HTTP 요청 본문에 추가된 OData를 odata.txt 컴퓨터의 텍스트 파일에 저장할 수 있습니다. 예를 들어 다음 odata.txt 전송하여 TestingCloudService799라는 클라우드 서비스를 만들 수 있습니다.
{
"Name": "TestingCloudService799",
"Label": "TestingCloudService799"
}
모든 Java 코드 예제는 다음 getpayload() 메서드를 사용하여 odata.txt 읽습니다.
public class Data
{
private String s;
public Data()
{
String fileName = ("C:"+File.separator+"test"+File.separator+"odata.txt");
File dataFile = new File(fileName);
byte[] content = new byte[0];
{
try {FileInputStream dataInputStream = new FileInputStream(dataFile);
int bytesAvailable = dataInputStream.available();
content = new byte[bytesAvailable];
dataInputStream.read(content);
dataInputStream.close();}
catch (FileNotFoundException fnfe) {System.out.println("Couldn't find a file called " + fileName);}
catch (IOException ioe) {System.out.println("Couldn't read from a file called " + fileName);}
this.s = new String(content);
}
}
public String getpayload(){return s;}
}
Java 코드 예제인 Create_cs TestingCloudService799라는 새 클라우드 서비스를 만듭니다. odata.txt 읽고, 이 정보를 HTTP 본문으로 스트리밍하고, 헤더를 설정한 다음, POST 작업 요청을 Cloudservices 엔드포인트로 보냅니다.
public class Create_cs
{
public static void main(String[] args) throws Exception
{
Data s = new Data();
String payload = s.getpayload();
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
c.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
out.write(payload);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null)
{System.out.println(decodedString);}
in.close();
}
}
갤러리에서 VM 역할 목록 가져오기
서비스 공급자는 테넌트에 가상 머신 역할의 셀프 서비스 갤러리를 제공할 수 있습니다. 그러면 테넌트는 VM 역할 갤러리 항목 중 하나에서 VM 역할을 만들 수 있습니다. VM 역할 갤러리에 대한 다음 URL로 HTTP GET 작업 요청을 전송하여 구독에 제공되는 모든 VM 역할을 쿼리할 수 있습니다. 예를 들어 다음 URL 및 Get_list 사용하여 구독에 제공되는 VM 역할을 가져올 수 있습니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems/$/MicrosoftCompute.VMRoleGalleryItem?api-version=2013-03
다음은 VM 역할 갤러리 항목의 컬렉션을 포함하는 HTTP 응답의 예입니다.
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 2148
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
Content-Language: en-US
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
DataServiceVersion: 3.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Wed, 05 Feb 2014 20:11:29 GMT
{"odata.metadata":"https://server:port/SC2012R2/VMM/GalleryService.svc/$metadata#GalleryItems/MicrosoftCompute.VMRoleGalleryItem","value":[{"odata.type":"MicrosoftCompute.VMRoleGalleryItem","Name":"CentOS6LAMP","Publisher":"Microsoft","Version":"1.0.0.0","ContentUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/Content","Description":"Deploy a CentOS 6 virtual machine role with Apache, MySQL and PHP installed.","IconUrl":null,"Label":"CentOS6 LAMP Role","PublishDate":"2014-01-21T19:09:11.163","PublisherLabel":"Microsoft","ResourceDefinition@odata.mediaContentType":"application/json","ResourceDefinitionUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/MicrosoftCompute.ResourceDefinitionGalleryItem/ResourceDefinition","ViewDefinitionUrl":"Gallery/ViewDefinitions(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/%24value"}]}
이 응답은 서비스 공급자가 제공하는 하나의 VM 역할, 즉 Apache, MySQL 및 PHP가 이미 설치된 CentOS 6 가상 머신 역할이 있음을 나타냅니다. 구독에 제공되는 VM 역할에 따라 갤러리에 다른 항목이 나타날 수 있습니다. 항목에 대한 ContentUrl 속성을 제공하는 응답의 문자열을 확인합니다. 이 값을 사용하여 특정 항목에 대한 참조를 가져와야 합니다.
"ContentUrl":"Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)"
VM 역할 갤러리 항목에 대한 참조 가져오기
갤러리에서 VM 역할 항목을 선택한 후 해당 항목에 대한 리소스 정의를 가져오고 제공해야 하는 리소스 매개 변수를 결정합니다. 리소스 정의는 가상 머신 하드웨어 및 인스턴스화 제한을 설명하는 JSON 파일입니다. 리소스 정의에 대한 자세한 내용은 ResourceDefinition [SPFSDK][VMROLE] 섹션을 참조하세요.
Get_list 사용하여 선택한 갤러리 항목의 URL에 GET 작업 요청을 보냅니다.
https://server:port/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/Gallery/GalleryItems(Name%3d%27CentOS6LAMP%27,Version%3d%271.0.0.0%27,Publisher%3d%27Microsoft%27)/MicrosoftCompute.ResourceDefinitionGalleryItem/ResourceDefinition?api-version=2013-03
이 예제의 경우 이 HTTP 응답에는 CentOS VM 역할에 대한 ResourceDefinition 개체가 포함됩니다.
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 2009
Content-Type: application/json
Content-Language: en-US
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Thu, 06 Feb 2014 17:03:10 GMT
{"IntrinsicSettings":{"HardwareProfile":{"VMSize":"[Param.VMRoleVMSize]"},"NetworkProfile":{"NetworkAdapters":[{"IPAddresses":[{"AllocationMethod":"Dynamic","ConfigurationName":"IPV4Configuration","Type":"IPV4"}],"Name":"NIC1","NetworkRef":"[Param.VMRoleNetworkRef]"}]},"OperatingSystemProfile":{"AdminCredential":"[Param.VMRoleAdminCredential]","ComputerNamePattern":"[Param.VMRoleComputerNamePattern]","LinuxOperatingSystemProfile":{"DNSDomainName":"[Param.VMRoleDNSDomainName]","SSHPublicKey":"[Param.VMRoleSSHPublicKey]"},"TimeZone":"[Param.VMRoleTimeZone]","WindowsOperatingSystemProfile":null},"ScaleOutSettings":{"InitialInstanceCount":"1","MaximumInstanceCount":"5","MinimumInstanceCount":"1","UpgradeDomainCount":"1"},"StorageProfile":{"OSVirtualHardDiskImage":"[Param.VMRoleOSVirtualHardDiskImage]"}},"Name":"CentOS6LAMP","Publisher":"Microsoft","ResourceExtensionReferences":[{"Name":"CentOS6LAMP","Publisher":"Microsoft","ReferenceName":"CentOS6LAMP","ResourceExtensionParameterValues":"{\"MySQLRootPassword\":\"[Param.CentOS6LAMPMySQLRootPassword]\"}","Version":"1.0.0.0"}],"ResourceParameters":[{"Description":"Computer size","Name":"VMRoleVMSize","Type":"String"},{"Description":"Operating system disk","Name":"VMRoleOSVirtualHardDiskImage","Type":"String"},{"Description":"Network reference","Name":"VMRoleNetworkRef","Type":"String"},{"Description":"Resource Extension CentOS6LAMP. Parameter MySQLRootPassword. Run once command parameter","Name":"CentOS6LAMPMySQLRootPassword","Type":"SecureString"},{"Description":"Compute name pattern","Name":"VMRoleComputerNamePattern","Type":"String"},{"Description":"Time zone","Name":"VMRoleTimeZone","Type":"String"},{"Description":"Administrator credential","Name":"VMRoleAdminCredential","Type":"Credential"},{"Description":"DNS domain name","Name":"VMRoleDNSDomainName","Type":"String"},{"Description":"SSH public key","Name":"VMRoleSSHPublicKey","Type":"String"}],"SchemaVersion":"1.0","Type":"Microsoft.Compute\/VMRole\/1.0","Version":"1.0.0.0"}
ResourceParameters 속성에는 매개 변수가 나열됩니다. 모든 VM 역할에 매개 변수가 필요한 것은 아니지만 ResourceDefinition 개체의 ResourceParameters 속성에 매개 변수가 나열된 경우 각 매개 변수에 대한 값을 제공해야 합니다. 다음 형식을 사용하여 JSON으로 인코딩된 문자열로 압축하여 매개 변수 및 해당 값을 제공할 수 있습니다.
{ "parameter1 name": "parameter1 value", "parameter2 name" : "parameter2 value", ... }
ParameterValues를 수집한 후 ParameterValues 및 매개 변수 값의 버전을 포함하는 ResourceConfiguration 개체를 빌드할 수 있습니다. 이 가이드에서 예제 ResourceConfiguration 개체는 다음 매개 변수 값을 사용합니다.
"ResourceConfiguration":
{
"ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork1\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
"Version": "1.0.0.0"
}
VMNetwork1이라는 가상 네트워크가 테넌트의 구독에 이미 있어야 합니다. 가상 머신을 배치하려면 가상 네트워크를 지정해야 합니다. 구독의 테넌트 UI 포털을 사용하여 가상 네트워크를 만들 수 있습니다.
새 VM 역할 인스턴스 만들기
VM 역할 갤러리에서 검색된 ResourceDefinition 개체와 이전 단계에서 빌드한 ResourceConfiguration 개체를 결합하여 새 VirtualMachineRole 개체를 빌드합니다. 그런 다음 전체 VirtualMachineRole 개체를 HTTP POST 작업 요청의 본문으로 VMRoles의 URL로 보냅니다.
https://server:port/subscription-id/CloudServices/cloudservice-name/Resources/MicrosoftCompute/VMRoles?api-version=2013-03
예를 들어 odata.txt 다음 VitualMachineRole 개체를 포함할 수 있습니다.
{
"InstanceView": null,
"Label": "My VM Role Instance",
"Name": "TestVMRole",
"ProvisioningState": null,
"ResourceConfiguration": {
"ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork1\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
"Version": "1.0.0.0"
},
"ResourceDefinition": {
"IntrinsicSettings": {
"HardwareProfile": { "VMSize": "[Param.VMRoleVMSize]" },
"NetworkProfile": {
"NetworkAdapters": [{
"IPAddresses": [{
"AllocationMethod": "Dynamic",
"ConfigurationName": "IPV4Configuration",
"LoadBalancerConfigurations": [],
"Type": "IPV4"
}],
"Name": "NIC1",
"NetworkRef": "[Param.VMRoleNetworkRef]"
}]
},
"OperatingSystemProfile": {
"AdminCredential": "[Param.VMRoleAdminCredential]",
"ComputerNamePattern": "[Param.VMRoleComputerNamePattern]",
"LinuxOperatingSystemProfile": {
"DNSDomainName": "[Param.VMRoleDNSDomainName]",
"SSHPublicKey": "[Param.VMRoleSSHPublicKey]"
},
"TimeZone": "[Param.VMRoleTimeZone]",
"WindowsOperatingSystemProfile": null
},
"ScaleOutSettings": {
"InitialInstanceCount": "1",
"MaximumInstanceCount": "5",
"MinimumInstanceCount": "1",
"UpgradeDomainCount": "1"
},
"StorageProfile": {
"DataVirtualHardDisks": [],
"OSVirtualHardDiskImage": "[Param.VMRoleOSVirtualHardDiskImage]"
}
},
"Name": "CentOS6LAMP",
"Publisher": "Microsoft",
"ResourceExtensionReferences": [{
"Name": "CentOS6LAMP",
"Publisher": "Microsoft",
"ReferenceName": "CentOS6LAMP",
"ResourceExtensionParameterValues": "{\"MySQLRootPassword\":\"[Param.CentOS6LAMPMySQLRootPassword]\"}",
"Version": "1.0.0.0"
}],
"ResourceParameters": [{
"Description": "Computer size",
"Name": "VMRoleVMSize",
"Type": "String"
},
{
"Description": "Operating system disk",
"Name": "VMRoleOSVirtualHardDiskImage",
"Type": "String"
},
{
"Description": "Network reference",
"Name": "VMRoleNetworkRef",
"Type": "String"
},
{
"Description": "Resource Extension CentOS6LAMP. Parameter MySQLRootPassword. Run conce command parameter",
"Name": "CentOS6LAMPMySQLRootPassword",
"Type": "SecureString"
},
{
"Description": "Compute name pattern",
"Name": "VMRoleComputerNamePattern",
"Type": "String"
},
{
"Description": "Time zone",
"Name": "VMRoleTimeZone",
"Type": "String"
},
{
"Description": "Administrator credential",
"Name": "VMRoleAdminCredential",
"Type": "Credential"
},
{
"Description": "DNS domain name",
"Name": "VMRoleDNSDomainName",
"Type": "String"
},
{
"Description": "SSH public key",
"Name": "VMRoleSSHPublicKey",
"Type": "String"
}
],
"SchemaVersion": "1.0",
"Type": "Microsoft.Compute/VMRole/1.0",
"Version": "1.0.0.0"
},
"Substate": null
}
다음 Java 코드, Create_vmr 및 예제 VirtualMachine 개체를 사용하여 TestVMRole이라는 새 VM 역할을 만들 수 있습니다.
public class Create_vmr
{
public static void main(String[] args) throws Exception
{
Data s = new Data();
String payload = s.getpayload();
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
c.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
out.write(payload);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
in.close();
}
}
InitialInstanceCount는 1이므로 LAMP0001이라는 하나의 TestVMRole 가상 머신이 VMNetwork1에 배치되고 시작됩니다. TestVMRole의 VM에 대한 URL로 HTTP GET 작업 요청을 전송하여 이 새 가상 머신의 ID를 가져올 수 있습니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03
vm의 고유 ID는 이 가이드에서 문자열 6e66ee6e-6e6e-6666-ee66-e666e6666e로 표시됩니다.
VM 역할 크기 조정
VM 역할 및 확장 엔드포인트에 대한 URL로 HTTP POST 작업 요청을 전송하여 VM 역할 인스턴스에서 실행 중인 가상 머신 수를 조정할 수 있습니다. 인스턴스 수는 최소값보다 작거나 VitualMachineRole 개체에 지정한 최대 인스턴스 수보다 많을 수 없습니다. 예를 들어 다음 URL을 사용하여 TestVMRole 역할의 크기를 조정합니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/Scale?api-version=2013-03
POST 작업 요청 본문은 VM 역할에 대해 인스턴스화할 가상 머신 수를 InstanceCount로 지정해야 합니다. 다음 odata.txt 보내면 TestVMRole에서 실행되는 가상 머신 수가 2개로 증가합니다.
{
"InstanceCount": 2
}
현재 TestVMRole 역할에 있는 모든 가상 머신의 목록을 얻으려면 VM의 URL에 HTTP GET 작업 요청을 보냅니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs?api-version=2013-03
예제 HTTP 응답은 다음과 같습니다.
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 496
Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
Server: Microsoft-IIS/8.5
X-Content-Type-Options: nosniff
request-id: d3350337-10af-0000-897f-39d3af10cf01
DataServiceVersion: 3.0;
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Powered-By: ASP.NET
Date: Thu, 06 Feb 2014 21:52:56 GMT
{"odata.metadata":"https://server:8090/SC2012R2/VMM/Microsoft.Management.Odata.svc/$metadata#VM","value":[{"Id":"6e66ee6e-6e6e-6666-ee66-e666e666666e","ComputerName":"LAMP001.mydns","RuntimeState":"Running","ConnectToAddresses":[{"IPAddress":"10.0.0.4","NetworkName":"VMNetwork1","Port":3389}]},{"Id":"77ff7777-7777-7777-ff7f-f7f7f77777f7","ComputerName":"LAMP002","RuntimeState":"Running","ConnectToAddresses":[{"IPAddress":"10.0.0.5","NetworkName":"VMNetwork1","Port":3389}]}]}
HTTP 응답은 LAMP0002라는 TestVMRole 역할의 두 번째 가상 머신이 현재 실행 중이며 77ff7777-7777-7777-ff7f-f7f7f77777f7로 표시됩니다.
VM 역할이 현재 가상 머신 수보다 작은 인스턴스 수로 확장되면 일부 VM이 실행 중인지 여부에 관계없이 삭제됩니다. VM 역할에서 특정 가상 머신을 삭제하려면 가상 머신 시작, 중지, 다시 시작, 종료 또는 삭제 섹션을 참조하세요.
가상 머신 시작, 중지, 다시 시작, 종료 또는 삭제
빈 본문이 있는 다음 URL로 HTTP POST 작업 요청을 전송하여 가상 머신을 중지할 수 있습니다. 예를 들어 다음 Java 코드 예제에서는 ID=77ff7777-7777-7777-ff7f-f7f7f77777f7이 있는 LAMP002를 중지합니다.
public class Start_vmr
{
public static void main(String[] args) throws Exception
{
String payload ="";
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Stop?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
c.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
out.write(payload);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
in.close();
}
}
이 예제 Java 코드를 사용하여 VM을 시작, 다시 시작 또는 종료하는 HTTP POST 작업 요청을 만들 수도 있습니다. 중지된 LAMP0002를 시작하려면 다음 URL을 사용합니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Start?api-version=2013-03
다음 URL을 사용하여 실행 중인 LAMP0002를 다시 시작합니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Restart?api-version=2013-03
다음 URL을 사용하여 실행 중인 LAMP0002를 종료합니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7/Shutdown?api-version=2013-03
빈 페이로드가 있는 VM의 엔드포인트에 HTTP DELETE 작업 요청을 전송하여 특정 가상 머신을 삭제할 수 있습니다. VM을 삭제하기 전에 중지해야 합니다. 이 예제에서는 X-HTTP-메서드 헤더를 사용하여 DELETE를 사용하여 POST 작업을 재정의합니다. 예를 들어 다음 Java 코드 Delete_vm ID=77ff7777-7777-7777-ff7f-f7f7f7777f7이 있는 VM을 삭제합니다.
public class Delete_vm
{
public static void main(String[] args) throws Exception
{
String payload ="";
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole/VMs/77ff7777-7777-7777-ff7f-f7f7f77777f7?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
TrustModifier.relaxHostChecking(c); // ignore host checking errors
c.setRequestMethod("POST");
c.setRequestProperty("X-HTTP-Method", "DELETE");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
c.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
out.write(payload);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null){System.out.println(decodedString);}
in.close();
}
}
이렇게 하면 가상 머신 LAMP0002가 특히 삭제됩니다. TestVMRole을 2개 인스턴스에서 1개 인스턴스로 축소하면 LAMP0002가 이전에 중지된 경우에도 가상 머신 LAMP0001이 삭제됩니다.
VM 역할 업데이트 또는 삭제
이전 버전의 가상 머신이 계속 실행되는 동안 VM 역할 인스턴스를 새 버전으로 업데이트할 수 있습니다. VM 역할을 확장하여 새 가상 머신을 추가하는 경우 새 가상 머신은 업데이트된 버전의 VM 역할을 받습니다. 두 버전을 기반으로 하는 가상 머신은 동시에 실행 될 수 있습니다. 이전 버전에 따라 특정 가상 머신을 중지하거나 삭제해야 할 수 있습니다.
VM 역할에 대한 URL로 HTTP MERGE 작업 요청을 전송하여 VM 역할을 업데이트할 수 있습니다. 본문에는 VirtualMachineRole에 병합할 업데이트된 정보가 포함되어 있습니다.
https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole?api-version=2013-03
예를 들어 다음 odata.txt TestVMRole 역할을 버전 1.0.0.0에서 버전 1.0.0.1로 업데이트합니다. 버전 1.0.0.0은 VMNetwork1에 가상 머신을 배치한 반면, 예제 버전 1.0.0.1은 VMNetwork2에 가상 머신을 배치합니다.
{
"ResourceConfiguration": {
"ParameterValues": "{\"VMRoleVMSize\" : \"ExtraSmall\",\"VMRoleOSVirtualHardDiskImage\" : \"CentOS Linux 6 (64-bit):1.0.0.0\",\"VMRoleNetworkRef\" : \"VMNetwork2\",\"CentOS6LAMPMySQLRootPassword\" : \"!!pass3abc12\",\"VMRoleComputerNamePattern\" : \"LAMP###\",\"VMRoleTimeZone\" : \"Pacific Standard Time\",\"VMRoleAdminCredential\" : \"root:!!pass3abc12\",\"VMRoleDNSDomainName\" : \"mydns\",\"VMRoleSSHPublicKey\" : \"key123\"}",
"Version": "1.0.0.1"
}
}
다음 Java 코드 예제에서는 TestVMRole 버전을 업데이트할 수 있습니다. 이 예제에서는 X-HTTP-메서드 헤더를 사용하여 MERGE를 사용하여 POST 작업을 재정의합니다.
public class Update_vmr
{
public static void main(String[] args) throws Exception
{
Data s = new Data();
String payload = s.getpayload();
String u = "https://server:30006/2222aa22-22a2-2a22-2a22-2aaaaa2aaaaa/CloudServices/TestingCloudService799/Resources/MicrosoftCompute/VMRoles/TestVMRole?api-version=2013-03";
URL url = new URL(u);
HttpURLConnection c = null;
c = (HttpsURLConnection)url.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("X-HTTP-Method", "MERGE");
c.setRequestProperty("Content-Type", "text/plain; charset=\"utf8\"");
c.setRequestProperty("DataServiceVersion", "3.0;NetFx");
c.setRequestProperty("MaxDataServiceVersion", "3.0;NetFx");
c.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
c.setRequestProperty("Accept-Charset", "UTF-8");
c.setRequestProperty("DataServiceUrlConventions", "KeyAsSegment");
c.setRequestProperty("User-Agent", "Microsoft ADO.NET Data Services");
c.setRequestProperty("x-ms-principal-id", "user@contoso.com");
c.setRequestProperty("Content-Type","application/json;odata=minimalmetadata");
c.setRequestProperty(“Host”, “user@contoso.com”);
c.setRequestProperty("Expect", "100-continue");
c.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(c.getOutputStream());
out.write(payload);
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {System.out.println(decodedString);}
in.close();
}
}
이 코드를 실행한 후 새 TestVMRole VM이 만들어지면 버전 1.0.0.1이 됩니다. 기존 버전 1.0.0.0 VM은 계속 실행됩니다. 예를 들어 TestVMRole의 배율을 1에서 2로 늘입니다. 새 가상 머신은 새 버전을 사용하고 VMNetwork2에서 실행됩니다. VMNetwork1에서 실행되는 가상 머신은 VMNetwork1에서 계속 실행됩니다. 인스턴스 수를 줄이거나 이전 가상 머신을 삭제하여 이전 VM 역할 버전의 모든 인스턴스를 업데이트할 수 있습니다.
VM 역할 및 역할의 모든 가상 머신을 삭제하려면 가상 머신을 중지하고 빈 본문이 있는 VM 역할의 URL에 HTTP DELETE 작업 요청을 보냅니다. X-HTTP-메서드 헤더를 사용하여 DELETE를 사용하여 POST 작업을 재정의합니다.
참고 항목
Java를 사용하여 Virtual Machine 관리
VM 역할 테넌트 서비스 [SPFSDK][VMROLE]
VM 역할 JSON 참조 [SPFSDK][VMROLE]