web-dev-qa-db-ja.com

ステージングまたは本番インスタンス?

現在「ステージング」または「プロダクション」で実行しているかどうかを教えてくれるサービスランタイムのどこかにありますか?本番との間で手動で設定を変更するのは少し面倒です。

46
Kenji

製品またはステージングのどちらを使用しているかに基づいている場合は、実際に構成を変更しないでください。ステージング領域は「QA」環境にな​​るように設計されていませんが、実動がデプロイされる前の保持領域のみです。

新しいデプロイメントをアップロードすると、パッケージをアップロードする現在のデプロイメントスロットが破棄され、VMのアップロードと開始が行われている間、10〜15分間ダウンします。本番環境に直接アップロードすると、本番のダウンタイムは15分になります。したがって、ステージング領域が発明されました。ステージングにアップロードし、スタッフをテストし、「スワップ」ボタンをクリックすると、ステージング環境が魔法のようにプロダクション(仮想IPスワップ)になります。したがって、ステージングは​​実際にプロダクションと100%同じでなければなりません。

あなたが探しているのはQA /テスト環境ですか?独自の製品/ステージングを使用して、テスト環境用の新しいサービスを開く必要があります。この場合、デプロイメント環境ごとに1セット(プロダクション、テストなど)の複数の構成ファイルセットを維持する必要があります。

特に.configファイルに加えて独自の* .cscfgファイルを持つAzureで発生する、構成の問題を管理する方法はたくさんあります。私がAzureプロジェクトでそれを行うのを好む方法は次のとおりです。小さなConfigプロジェクトをセットアップし、デプロイメントタイプに一致するフォルダーをそこに作成します。各フォルダー内では、特定のデプロイメント環境に一致する* .configおよび* .cscfgファイルのセットアップセット:デバッグ、テスト、リリース...これらは、ビルドターゲットタイプとしてVisual Studioでもセットアップされます。 ConfigプロジェクトのビルドターゲットフォルダーからConfigプロジェクトのルートフォルダーにすべてのファイルをコピーする、Configプロジェクトのすべてのコンパイル中に発生する小さなxcopyコマンドがあります。

次に、ソリューション内の他のすべてのプロジェクト、Configプロジェクトのルートフォルダーから.configまたは.cscfgファイルにリンクします。

ほら、私の設定はすべてのビルド設定に自動的に魔法のように適応します。また、.config変換を使用して、リリースビルドターゲットと非リリースビルドターゲットのデバッグ情報を管理します。

これをすべて読んでも、実行時にProduction vs.Stagingステータスを取得したい場合は、次のようにします。GetdeploymentId from RoleEnvironment.DeploymentId次に、適切なX509 certificateで取得するにはAzure structure of your ServiceGetDeploymentsメソッドを呼び出します(残りのAPIですが、抽象化ライブラリがあります)。

お役に立てれば

編集:構成文字列のセットアップと環境間の切り替えについてリクエストに応じてブログ投稿@ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other -cloud-based-NET-solution

77
Igorek

時々私は人々が質問に答えるだけでいいと思います。倫理やベストプラクティスを説明しないでください...

Microsoftはこれを正確に行うコードサンプルをここに投稿しました: https://code.msdn.Microsoft.com/windowsazure/CSAzureDeploymentSlot-1ce0e3b5

image showing Staging instance

image showing Production instance

protected void Page_Load(object sender, EventArgs e) 
{ 
    // You basic information of the Deployment of Azure application. 
    string deploymentId = RoleEnvironment.DeploymentId; 
    string subscriptionID = "<Your subscription ID>"; 
    string thrumbnail = "<Your certificate thumbnail print>"; 
    string hostedServiceName = "<Your hosted service name>"; 
    string productionString = string.Format(
        "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
        subscriptionID, hostedServiceName, "Production"); 
    Uri requestUri = new Uri(productionString); 

    // Add client certificate. 
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.OpenExistingOnly); 
    X509Certificate2Collection collection = store.Certificates.Find(
        X509FindType.FindByThumbprint, thrumbnail, false); 
    store.Close(); 

    if (collection.Count != 0) 
    { 
        X509Certificate2 certificate = collection[0]; 
        HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
        httpRequest.ClientCertificates.Add(certificate); 
        httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
        httpRequest.KeepAlive = false; 
        HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse;

        // Get response stream from Management API. 
        Stream stream = httpResponse.GetResponseStream(); 
        string result = string.Empty; 
        using (StreamReader reader = new StreamReader(stream)) 
        { 
            result = reader.ReadToEnd();
        } 
        if (result == null || result.Trim() == string.Empty) 
        {
            return;
        }
        XDocument document = XDocument.Parse(result); 
        string serverID = string.Empty; 
        var list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.Microsoft.com/windowsazure")) 
                   select item; 

        serverID = list.First().Value; 
        Response.Write("Check Production: "); 
        Response.Write("DeploymentID : " + deploymentId
            + " ServerID :" + serverID); 
        if (deploymentId.Equals(serverID)) 
            lbStatus.Text = "Production"; 
        else 
        { 
            // If the application not in Production slot, try to check Staging slot. 
            string stagingString = string.Format(
                "https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}",
                subscriptionID, hostedServiceName, "Staging"); 
            Uri stagingUri = new Uri(stagingString); 
            httpRequest = (HttpWebRequest)HttpWebRequest.Create(stagingUri); 
            httpRequest.ClientCertificates.Add(certificate); 
            httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 
            httpRequest.KeepAlive = false; 
            httpResponse = httpRequest.GetResponse() as HttpWebResponse; 
            stream = httpResponse.GetResponseStream(); 
            result = string.Empty; 
            using (StreamReader reader = new StreamReader(stream)) 
            { 
                result = reader.ReadToEnd();
            } 
            if (result == null || result.Trim() == string.Empty) 
            {
                return;
            }
            document = XDocument.Parse(result); 
            serverID = string.Empty; 
            list = from item
                   in document.Descendants(XName.Get("PrivateID",
                       "http://schemas.Microsoft.com/windowsazure")) 
                   select item; 

            serverID = list.First().Value; 
            Response.Write(" Check Staging:"); 
            Response.Write(" DeploymentID : " + deploymentId
                + " ServerID :" + serverID); 
            if (deploymentId.Equals(serverID)) 
            {
                lbStatus.Text = "Staging";
            }
            else 
            {
                lbStatus.Text = "Do not find this id";
            }
        } 
        httpResponse.Close(); 
        stream.Close(); 
    } 
}
51
artfulhacker

ステージングは​​、主にダウンタイムなしのアップグレードとアップグレードをロールバックする機能に使用される一時的な展開スロットです。

システム(コードまたは構成のいずれか)をこのようなAzure固有のものと組み合わせないことをお勧めします。

8
Rinat Abdullin

Windows Azure管理ライブラリ と@GuaravMantri answer のおかげで、別の質問にこれを行うことができます。

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Management.Compute;
using Microsoft.WindowsAzure.Management.Compute.Models;

namespace Configuration
{
    public class DeploymentSlotTypeHelper
    {
        static string subscriptionId = "<subscription-id>";
        static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";// copy-paste it
        static string cloudServiceName = "<your cloud service name>"; // lowercase
        static string ns = "http://schemas.Microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";

        public DeploymentSlot GetSlotType()
        {
            var managementCertificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
            var credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);

            var computeManagementClient = new ComputeManagementClient(credentials);
            var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
            return response.Deployments.FirstOrDefault(d => d.DeploymentSlot == DeploymentSlot.Production) == null ? DeploymentSlot.Staging : DeploymentSlot.Production;
        }
    }
}
5
Ognyan Dimitrov

この問題を解決する簡単な方法は、インスタンスで、実行中の環境を識別するキーを設定することです。

1)本番スロットで設定:設定>>アプリケーション設定>>アプリ設定そして、SLOT_NAMEという名前のキーと値「production」を作成します。重要:スロット設定を確認してください。

2)ステージングスロットで設定:設定>>アプリケーション設定>>アプリ設定そして、SLOT_NAMEという名前のキーと値「staging」を作成します。重要:スロット設定を確認してください。

アプリケーションから変数にアクセスし、アプリケーションが実行されている環境を特定します。 Javaでアクセスできます:

String slotName = System.getenv("APPSETTING_SLOT_NAME");
4

ここで考慮すべき4つのポイントがあります

  1. VIPスワップは、サービスが外部に面している場合にのみ意味があります。別名、APIを公開し、リクエストに反応するとき。
  2. サービスがすべてキューからメッセージをプルして処理するだけの場合、サービスはプロアクティブであり、VIP swapは適切なソリューションではありません。
  3. サービスが事後対応型と予防型の両方である場合は、設計を再検討する必要があります。おそらく、サービスを2つの異なるサービスに分割します。
  4. サービスのプロアクティブな部分に短いダウンタイムがかかる可能性がある場合、Ericによるcscfgファイルの変更前と変更後の変更VIP swapは適切です(最初にステージングとプロダクションの両方を設定してプルしないようにしているため)メッセージ、次にVIPスワップを実行し、メッセージのプルを開始するようにプロダクションの構成を更新します)。
1
Ash Saf