¿Instancia de Puesta en Escena o Producción?


¿Hay algún lugar en el tiempo de ejecución del servicio que me diga si estoy ejecutando actualmente en 'Staging' o 'Production'? Modificar manualmente la configuración hacia y desde la producción parece un poco engorroso.

Author: abatishchev, 2010-12-01

6 answers

Realmente no deberías cambiar tus configuraciones cuando estás basado en si estás en Prod o en Staging. El área de almacenamiento no está diseñada para ser un entorno de "control de calidad", sino solo un área de espera antes de que se despliegue la producción.

Cuando carga una nueva implementación, la ranura de implementación actual en la que carga su paquete se destruye y está inactiva durante 10-15 minutos mientras se realiza la carga y el inicio de las máquinas virtuales. Si carga directamente en producción, son 15 minutos de tiempo de inactividad de la producción. Así, Se inventó el área de staging: se carga en staging, se prueba el material y se hace clic en el botón "Swap" y el entorno de Staging se convierte mágicamente en Producción (virtual IP swap). Por lo tanto, su puesta en escena realmente debe ser 100% igual que su producción.

Lo que creo que está buscando es el entorno de QA/testing? Debe abrir un nuevo servicio para el entorno de pruebas con su propio Prod / Staging. En este caso, querrá mantener varios conjuntos de archivos de configuración, un conjunto por implementación medio ambiente (Producción, Pruebas, etc.)

Hay muchas maneras de administrar la configuración-infierno que se produce, especialmente con Azure que tiene en la parte superior de .archivos de configuración, propios*.cscfg archivos. La forma en que prefiero hacerlo con Azure project es la siguiente: Configure un pequeño proyecto de configuración, cree carpetas allí que coincidan con los tipos de implementación. Dentro de cada carpeta setup establece *.config&*.archivos cscfg que coinciden con un entorno de implementación particular: Debug, Test, Release... estos están configurados en Visual Studio también, como construir tipos de destino. Tengo un pequeño comando xcopy que ocurre durante cada compilación del proyecto de configuración que copia todos los archivos de la carpeta de destino de Compilación del proyecto de configuración en la carpeta raíz del proyecto de configuración.

A continuación, todos los demás proyectos de la solución, ENLACES a la .config or .archivo cscfg de la carpeta raíz del proyecto de configuración.

Voila, mis configuraciones mágicamente se adaptan a cada configuración de compilación automáticamente. Yo también uso .transformaciones de configuración a administrar información de depuración para los objetivos de compilación de Release vs. non-Release.

Si ha leído todo esto y aún desea obtener el estado de producción vs. Staging en tiempo de ejecución , entonces: Obtener deploymentId de RoleEnvironment.DeploymentId Luego use la API de administración con un X509 certificate adecuado para obtener el Azure structure of your Service y llamar al método GetDeployments (es la api rest pero hay una biblioteca de abstracción).

Espero que esto ayude

Editar: entrada de blog solicitada sobre la configuración de cadenas de configuración y el cambio entre entornos @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other-cloud-based-NET-solution

 75
Author: Igorek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-16 15:19:48

A veces desearía que la gente simplemente respondiera la pregunta.. no explicar la ética o las mejores prácticas...

Microsoft ha publicado un ejemplo de código haciendo exactamente esto aquí: https://code.msdn.microsoft.com/windowsazure/CSAzureDeploymentSlot-1ce0e3b5

imagen que muestra la instancia de ensayo

imagen que muestra la instancia de producción

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(); 
    } 
}
 50
Author: artfulhacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 15:58:44

Staging es una ranura de implementación temporal que se utiliza principalmente para actualizaciones sin tiempo de inactividad y la capacidad de revertir una actualización.

Se recomienda no vincular el sistema (ya sea en código o en configuración) con tales especificaciones de Azure.

 8
Author: Rinat Abdullin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-02 06:53:47

Desde Windows Azure Management Libraries y gracias a @GuaravMantri respuesta a otra pregunta puedes hacerlo así:

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
Author: Ognyan Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:52

Una manera fácil de resolver este problema es establecer en sus instancias una clave para identificar qué entorno se está ejecutando.

1) Establecer en su ranura de producción: Set it Settings > > Configuración de la aplicación > > Configuración de la aplicación Y crear una clave llamada SLOT_NAME y valor "producción". IMPORTANTE: compruebe la configuración de la ranura.

2) Establecer en su ranura de puesta en escena: Set it Settings > > Configuración de la aplicación > > Configuración de la aplicación Y crear una clave llamada SLOT_NAME y valor "staging". IMPORTANTE: compruebe la configuración de la ranura.

Acceda desde su aplicación a la variable e identifique qué entorno está ejecutando la aplicación. En Java se puede acceder a:

String slotName = System.getenv("APPSETTING_SLOT_NAME");
 3
Author: Flavio H. Freitas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-03 14:55:03

Aquí hay 4 puntos a considerar

  1. El intercambio VIP solo tiene sentido cuando su servicio se enfrenta al mundo exterior. También conocido como, cuando expone una API y reacciona a las solicitudes.
  2. Si todo lo que hace su servicio es extraer mensajes de una cola y procesarlos, entonces sus servicios son proactivos y el intercambio VIP no es una buena solución para usted.
  3. Si su servicio es tanto reactivo como proactivo, es posible que desee reconsiderar su diseño. Tal vez dividir el servicio en 2 diferentes Servicio.
  4. La sugerencia de Eric de modificar los archivos cscfg antes y después del intercambio VIP es buena si la parte proactiva de su servicio puede tomar un corto tiempo de inactividad (Porque primero configura tanto la Etapa como la Producción para no extraer mensajes, luego realiza el intercambio VIP y luego actualiza la configuración de Producción para comenzar a extraer mensajes).
 1
Author: Ash Saf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 17:11:24