영업: 1-800-867-1380

배포 만들기

업데이트 날짜: 2014년 7월

Create Deployment 비동기 작업은 새 서비스 패키지를 업로드하고 스테이징 또는 프로덕션 환경에서 새 배포를 만듭니다.

이 작업을 실행하려면 먼저 다음 작업을 완료해야 합니다.

다음과 같이 Create Deployment 요청을 지정합니다. <subscription-id>를 구독 ID로 바꾸고, <cloudservice-name>을 클라우드 서비스의 이름으로 바꾸고, <deployment-slot>staging 또는 production으로 바꾸십시오.

 

메서드 요청 URI

POST

https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>

관리 서비스에 대한 요청이 안전한지 확인해야 합니다. 자세한 내용은 서비스 관리 요청 인증을 참조하십시오.

다음 표에서는 요청 헤더에 대해 설명합니다.

 

요청 헤더 설명

Content-Type

필수 사항입니다. 이 헤더를 application/xml로 설정합니다.

x-ms-version

필수 사항입니다. 이 요청에 사용할 작업의 버전을 지정합니다. 이 헤더는 2009-10-01 이후로 설정되어야 합니다. 버전 관리 헤더에 대한 자세한 내용은 서비스 관리 버전 관리를 참조하십시오.

요청 본문의 형식은 다음과 같습니다.


<?xml version="1.0" encoding="utf-8"?>
<CreateDeployment xmlns="http://schemas.microsoft.com/windowsazure">
  <Name>deployment-name</Name>
  <PackageUrl>package-url-in-blob-storage</PackageUrl>
  <Label>base64-encoded-deployment-label</Label>
  <Configuration>base64-encoded-configuration-file</Configuration>
  <StartDeployment>start-deployment</StartDeployment>
  <TreatWarningsAsError>prioritize-warnings</TreatWarningsAsError>
  <ExtendedProperties>
    <ExtendedProperty>
      <Name>property-name</Name>
      <Value>property-value</Value>
    </ExtendedProperty>
  </ExtendedProperties>
  <ExtensionConfiguration>
    <AllRoles>
      <Extension>
        <Id>identifier-of-extension</Id>
      </Extension>
    </AllRoles>
    <NamedRoles>
      <Role>
        <RoleName>role_name1</RoleName>
        <Extensions>
          <Extension>
            <Id>identifier-of-extension</Id>
          </Extension>
        </Extensions>
      </Role>
    </NamedRoles>
  </ExtensionConfiguration>
</CreateDeployment>

다음 표에서는 요청 본문의 요소에 대해 설명합니다.

 

요소 이름 설명

Name

필수 사항입니다. 배포의 이름을 지정합니다.

PackageUrl

필수 사항입니다. Blob 서비스에서 서비스 패키지의 위치를 참조하는 URL을 지정합니다. 서비스 패키지는 동일한 구독 아래의 저장소 계정 또는 저장소 계정의 SAS(공유 액세스 서명) URI에 위치할 수 있습니다. 공유 액세스 서명에 대한 자세한 내용은 공유 액세스 서명으로 액세스 위임을 참조하십시오.

구성

필수 사항입니다. 배포에 대해 Base-64로 인코딩된 서비스 구성 파일을 지정합니다.

Label

필수 사항입니다. Base-64로 인코딩된 배포의 식별자를 지정합니다. 식별자의 길이는 최대 100자입니다. 구독 내에서 고유 레이블을 지정하는 것이 좋습니다. 레이블은 추적용으로 사용할 수 있습니다.

StartDeployment

선택 사항입니다. 배포를 만든 후 즉시 시작할지 여부를 나타냅니다. 기본값은 false입니다.

false인 경우 서비스 모델이 계속 배포되지만 코드가 즉시 실행되지 않습니다. 대신 배포 상태 업데이트를 호출하고 상태를 Suspended으로 설정(이때 서비스가 시작됨)할 때까지 서비스는 Running입니다. 배포된 서비스는 일시 중단된 경우에도 계속 요금이 청구됩니다.

StartDeployment 요소는 버전 2010-04-01 이후인 경우에만 사용할 수 있습니다.

TreatWarningsAsError

선택 사항입니다. 패키지 유효성 검사 경고를 오류로 처리할지 여부를 나타냅니다. 기본값은 false입니다. true로 설정되면 서비스 패키지에 대한 유효성 검사 경고가 있는 경우 Created Deployment 작업이 실패합니다.

TreatWarningsAsError 요소는 버전 2011-04-01 이후인 경우에만 사용할 수 있습니다.

Name

선택 사항입니다. 확장 배포 속성의 이름을 지정합니다. 각 확장 속성에는 정의된 이름과 값이 모두 있어야 합니다. 확장 속성 이름 및 값 쌍은 25개까지 지정할 수 있습니다.

Name 요소의 최대 길이는 64자이고, 영숫자와 밑줄만 포함할 수 있으며, 문자로 시작해야 합니다.

Name 요소는 버전 2012-03-01 이후인 경우에만 사용할 수 있습니다.

선택 사항입니다. 확장 클라우드 서비스 속성의 값을 지정합니다. 각 확장 속성에는 정의된 이름과 값이 모두 있어야 합니다. 확장 속성 이름 및 값 쌍은 25개까지 지정할 수 있으며 각 확장 속성 값의 최대 길이는 255자입니다.

Value 요소는 버전 2012-03-01 이후인 경우에만 사용할 수 있습니다.

ExtensionConfiguration

선택 사항입니다. 클라우드 서비스에 추가된 확장을 지정합니다. Windows Azure에서는 프로세스가 클라우드 서비스의 확장으로 실행될 수 있습니다. 배포에 추가하기 전에 확장 추가를 사용하여 클라우드 서비스에 확장을 추가해야 합니다.

ExtensionConfiguration 요소는 버전 2013-03-01 이후인 경우에만 사용할 수 있습니다.

클라우드 서비스에 추가된 확장을 지정합니다.

 

요소 이름 설명

AllRoles

선택 사항입니다. 배포의 모든 역할에 적용되는 확장 목록을 지정합니다.

Extension

필수 사항입니다. 클라우드 서비스의 역할에 배포될 확장을 지정합니다.

NamedRoles

선택 사항입니다. 배포의 특정 역할에 적용될 확장 목록을 지정합니다.

클라우드 서비스의 역할에 배포될 확장을 지정합니다.

 

요소 이름 설명

Id

필수 사항입니다. 확장의 식별자를 지정합니다. 클라우드 서비스에 확장을 추가할 때 ID가 생성됩니다. 확장 나열을 사용하여 클라우드 서비스에 추가된 확장의 식별자를 찾을 수 있습니다.

배포의 특정 역할에 적용될 확장 목록을 지정합니다.

 

요소 이름 설명

역할

필수 사항입니다. 확장이 추가되는 특정 역할을 지정합니다.

RoleName

필수 사항입니다. 역할 이름을 지정합니다.

Extension

필수 사항입니다. 클라우드 서비스의 역할에 배포될 확장을 지정합니다.

응답에는 HTTP 상태 코드 및 응답 헤더 집합이 포함되어 있습니다.

작업에 성공하면 상태 코드 200(정상)이 반환됩니다. 상태 코드에 대한 자세한 내용은 서비스 관리 상태 및 오류 코드를 참조하십시오.

이 작업의 응답에는 다음과 같은 헤더가 포함됩니다. 응답에는 추가 표준 HTTP 헤더가 포함될 수도 있습니다. 모든 표준 헤더는 HTTP/1.1 프로토콜 사양을 따릅니다.

 

응답 헤더 설명

x-ms-request-id

관리 서비스에 대해 수행된 요청을 고유하게 식별하는 값입니다. 비동기 작업의 경우 헤더 값과 함께 작업 상태 가져오기를 호출하여 작업이 완료되었는지, 실패했는지, 계속 진행 중인지 여부를 확인할 수 있습니다.

없음.

다음 콘솔 응용 프로그램 예제에서는 응용 프로그램을 배포하는 방법을 보여줍니다. 다음 변수 값을 바꿉니다.

  • Thumbprint – 구독의 관리 인증서 지문으로 바꿉니다.

  • SubscriptionId – 관리 포털에서 가져온 구독 식별자로 바꿉니다.

  • ServiceName – 사용자가 만든 클라우드 서비스 이름으로 바꿉니다.

  • DeploymentName – 배포에 사용하려는 이름으로 바꿉니다.



    note참고
    use 목록 위치를 사용해서 적합한 위치를 얻을 수 있습니다.

  • PackageName – 패키지 파일에 대한 Blob 저장소의 경로로 바꿉니다.

  • ConfigFile – 서비스 구성 파일의 이름으로 바꿉니다.


using System;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.IO;
using System.Xml;

namespace CreateDeployment
{
  class Program
  {
    private static XNamespace wa = "http://schemas.microsoft.com/windowsazure";
    private const string Thumbprint = "certificate-thumbprint";
    private const string SubscriptionId = "identifier-of-subscription";
    private const string ServiceName = "name-of-cloud-service";
    private const string DeploymentName = "name-of-deployment-name";
    private const string PackageName = "location-of-package";
    private const string ConfigFile = "name-of-configuration-file";
    private const string Version = "2013-08-01";

    static void Main(string[] args)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" +
        "services/hostedservices/{1}/deploymentslots/production";
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, ServiceName));
      
      // Base-64 encode the label of the deployment   
      byte[] bytes = System.Text.Encoding.UTF8.GetBytes(ServiceName);
      string base64Label = Convert.ToBase64String(bytes);

       // Create the request body
      XDocument requestBody = new XDocument(
      new XDeclaration("1.0", "UTF-8", "no"),
        new XElement(wa + "CreateDeployment",
          new XElement(wa + "Name", DeploymentName),
          new XElement(wa + "PackageUrl", PackageName),
          new XElement(wa + "Label", base64Label),
          new XElement(wa + "Configuration", ConvertFile(ConfigFile)),
          new XElement(wa + "StartDeployment", true)));

       // Submit the request and get the response
      XDocument responseBody;
      HttpWebResponse response = InvokeRequest(uri, "POST", certificate, requestBody, out responseBody);
      string requestId = String.Empty;
      if (response.Headers != null)
      {
        requestId = response.Headers["x-ms-request-id"];
      }

      if (responseBody != null)
      {
        Console.WriteLine(responseBody.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      
      XDocument statusResponse = GetStatus(requestId);
      if (statusResponse != null)
      {
        Console.WriteLine(statusResponse.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      Console.Write("Press any key to continue:");
      Console.ReadKey();
    }

    //Get the status of the request    
    private static XDocument GetStatus(string requestId)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" + "operations/" + requestId;
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId));
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = "GET";
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

       // Submit the request and get the response
      XDocument responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
        {
          responseBody = XDocument.Load(reader);
        }
      }
      response.Close();
      return responseBody;
    }
        
    // Add the request headers and get the response from the request
    private static HttpWebResponse InvokeRequest(
      Uri uri,
      string method,
      X509Certificate2 certificate,
      XDocument requestBody,
      out XDocument responseBody)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = method;
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

      if (requestBody != null)
      {
        using (Stream requestStream = request.GetRequestStream())
        {
          using (StreamWriter streamWriter = new StreamWriter(
            requestStream, System.Text.UTF8Encoding.UTF8))
          {
            requestBody.Save(streamWriter, SaveOptions.DisableFormatting);
          }
        }
      }

      responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      XmlReaderSettings settings = new XmlReaderSettings();
      settings.DtdProcessing = DtdProcessing.Ignore;
      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream(), settings))
        {
          try
          {
            responseBody = XDocument.Load(reader);
          }
          catch
          {
            responseBody = null;
          }
        }
      }
      response.Close();
      return response;
    }
    
    // Base-64 encode the contents of the service configuration file.
    private static string ConvertFile(string configFileName)
    {
      string fileContents;
      string base64String = "";
      try
      {
        using (StreamReader reader = new StreamReader(
          File.Open(configFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)))
        {
          fileContents = reader.ReadToEnd();
        }
      }
      catch (System.Exception exp)
      {
        Console.WriteLine(exp.Message);
        return base64String;
      }

      // Convert the binary input into base-64 encoded output. 
      try
      {
        base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(fileContents));
        return base64String;
      }
      catch (System.ArgumentNullException)
      {
        Console.WriteLine("Binary data array is null.");
        return base64String;
      }
    }

    // Gets the certificate matching the thumbprint from the local store.
    // Throws an ArgumentException if a matching certificate is not found.
    private static X509Certificate2 GetStoreCertificate(string thumbprint)
    {
      List<StoreLocation> locations = new List<StoreLocation>
      { 
        StoreLocation.CurrentUser, 
        StoreLocation.LocalMachine
      };

      foreach (var location in locations)
      {
        X509Store store = new X509Store("My", location);
        try
        {
          store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
          X509Certificate2Collection certificates = store.Certificates.Find(
            X509FindType.FindByThumbprint, thumbprint, false);
          if (certificates.Count == 1)
          {
            return certificates[0];
          }
        }
        finally
        {
          store.Close();
        }
      }
      throw new ArgumentException(string.Format(
        "A Certificate with Thumbprint '{0}' could not be located.",
        thumbprint));
    }
  }
}

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
표시:
© 2014 Microsoft