¿Instancia de producción o producción?

¿Hay algún lugar en el tiempo de ejecución del servicio que me diga si actualmente estoy ejecutando ‘Puesta en escena’ o ‘Producción’? La modificación manual de la configuración hacia y desde la producción parece un poco engorrosa.

Realmente no deberías cambiar tus configuraciones cuando estés basado en si estás en Prod o Staging. El área de preparación no está diseñada para ser un entorno de “QA”, sino solo un área de espera antes de desplegar la producción.

Cuando carga una nueva implementación, se destruye la ranura de implementación actual donde sube su paquete y está inactiva durante 10-15 minutos mientras se realiza la carga y el inicio de las VM. Si carga directamente en la producción, eso significa 15 minutos de inactividad de la producción. Por lo tanto, se inventó el área de ensayo: usted carga a la puesta en escena, prueba las cosas, y hace clic en el botón “Intercambiar” y su entorno de ensayo se convierte mágicamente en Producción (intercambio de IP virtual). Por lo tanto, su puesta en escena debería ser realmente el 100% igual a su producción.

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

Hay muchas maneras de administrar la configuración: infierno que ocurre, especialmente con Azure que tiene encima de los archivos .config, sus propios archivos * .cscfg. La forma en que prefiero hacerlo con el proyecto Azure es la siguiente: configure un proyecto de configuración pequeño, cree allí carpetas que coincidan con los tipos de implementación. Dentro de cada configuración de carpeta se crean conjuntos de archivos * .config y * .cscfg que coinciden con un entorno de despliegue particular: depuración, prueba, lanzamiento … estos se configuran también en Visual Studio, como tipos de destino de comstackción. Tengo un pequeño comando xcopy que ocurre durante cada comstackción del proyecto Config que copia todos los archivos de la carpeta Build Target del proyecto Config en la carpeta raíz del proyecto Config.

Luego, cualquier otro proyecto en la solución, ENLACES al archivo .config o .cscfg de la carpeta raíz del proyecto de configuración.

Voila, mis configuraciones se adaptan mágicamente a cada configuración de construcción automáticamente. También utilizo las transformaciones .config para administrar la información de depuración para los objectives de comstackción de versión frente a no liberación.

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

Espero que esto ayude

Editar: publicación de blog según lo solicitado sobre la configuración de las 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 Solución -NET

A veces desearía que la gente simplemente respondiera la pregunta … no explicara 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 = ""; string thrumbnail = ""; string hostedServiceName = ""; 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(); } } 

La estadificación es una ranura de implementación temporal utilizada principalmente para actualizaciones sin tiempo de inactividad y la capacidad de revertir una actualización.

Se recomienda no acoplar su sistema (ya sea en código o en configuración) con los detalles específicos de Azure.

Dado que las bibliotecas de administración de Windows Azure y gracias a @GuaravMantri responden a otra pregunta, puede 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 = ""; static string managementCertContents = "";// copy-paste it static string cloudServiceName = ""; // 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; } } } 

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

1) Establezca en su ranura de producción: Configúrelo >> Configuración de la aplicación >> Configuración de la aplicación Y cree una clave denominada SLOT_NAME y valore “producción”. IMPORTANTE: compruebe la configuración de la ranura.

2) Establezca en la ranura de configuración: Configúrelo >> Configuración de la aplicación >> Configuración de la aplicación Y cree una clave denominada SLOT_NAME y valore “puesta en escena”. IMPORTANTE: compruebe la configuración de la ranura.

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

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

Aquí hay 4 puntos para considerar

  1. El intercambio VIP solo tiene sentido cuando su servicio se enfrenta al mundo exterior. AKA, cuando expone una API y reactjs a las solicitudes.
  2. Si todo su servicio es extraer mensajes de una cola y procesarlos, entonces sus servicios son proactivos y el intercambio de VIP no es una buena solución para usted.
  3. Si su servicio es reactivo y proactivo, es posible que desee reconsiderar su diseño. Quizás dividir el servicio en 2 servicios diferentes.
  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 tiempo de inactividad (Porque primero configura tanto la Etapa como la Producción para no extraer mensajes, luego realiza un Intercambio VIP, y luego actualizar la configuración de producción para comenzar a extraer mensajes).