Staging o Istanza di produzione?

Esiste da qualche parte nel runtime del servizio che mi dirà se sono attualmente in esecuzione su “Staging” o “Produzione”? La modifica manuale della configurazione da e verso la produzione sembra un po ‘macchinosa.

Non dovresti davvero cambiare le tue configurazioni quando sei basato su Prod o Staging. L’area di staging non è progettata per essere un ambiente di “QA” ma solo un’area di attesa prima della produzione.

Quando si carica una nuova distribuzione, lo slot di distribuzione corrente in cui si carica il pacchetto viene distrutto ed è inattivo per 10-15 minuti mentre è in corso il caricamento e l’avvio delle VM. Se carichi direttamente in produzione, sono 15 minuti di fermo produzione. Quindi, l’area di staging è stata inventata: si carica in staging, si prova il materiale e si fa clic sul pulsante “Swap” e l’ambiente di staging diventa magicamente Production (virtual IP swap). Pertanto, la tua messa in scena dovrebbe essere al 100% uguale alla tua produzione.

Quello che penso tu stia cercando è QA / ambiente di test? Dovresti aprire un nuovo servizio per l’ambiente di test con il proprio Prod / Staging. In questo caso, si desidera mantenere più set di file di configurazione, un set per ambiente di distribuzione (Produzione, Test, ecc.)

Esistono molti modi per gestire la configurazione, ovvero l’inferno che si verifica, specialmente con Azure che ha in cima file .config, i propri file * .cscfg. Il modo in cui preferisco farlo con il progetto di Azure è il seguente: Configura un piccolo progetto di configurazione, crea cartelle che corrispondono ai tipi di distribuzione. All’interno di ogni cartella, set di set di file * .config e * .cscfg che corrispondono a particolari ambienti di distribuzione: Debug, Test, Release … anche questi sono installati in Visual Studio, come tipi di destinazione di build. Ho un piccolo comando xcopy che si verifica durante ogni compilazione del progetto Config che copia tutti i file dalla cartella Build Target del progetto Config nella cartella principale del progetto Config.

Quindi ogni altro progetto nella soluzione, si collega al file .config o .cscfg dalla cartella principale del progetto Config.

Voilà, le mie configurazioni si adattano magicamente a ogni configurazione di costruzione automaticamente. Uso anche le trasformazioni .config per gestire le informazioni di debug per obiettivi di build Release e non-Release.

Se hai letto tutto questo e vuoi ancora ottenere lo stato Produzione vs. Staging in fase di runtime , allora: Ottieni deploymentId da RoleEnvironment.DeploymentId Quindi usa Management API con un X509 certificate appropriato per accedere alla Azure structure of your Service e chiamare il metodo GetDeployments (è resto api ma c’è una libreria di astrazione).

Spero che questo ti aiuti

Modifica: post del blog come richiesto sull’impostazione delle stringhe di configurazione e il passaggio tra gli ambienti @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other-cloud-based -NET-solution

A volte vorrei che le persone rispondessero semplicemente alla domanda .. non spiegano l’etica o le migliori pratiche …

Microsoft ha pubblicato un esempio di codice facendo esattamente questo qui: https://code.msdn.microsoft.com/windowsazure/CSAzureDeploymentSlot-1ce0e3b5

immagine che mostra l'istanza di Staging

immagine che mostra istanza di produzione

 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 gestione temporanea è uno slot di distribuzione temporaneo utilizzato principalmente per gli aggiornamenti senza downtime e la possibilità di eseguire il rollback di un aggiornamento.

Si consiglia di non associare il sistema (nel codice o nella configurazione) con tali specifiche di Azure.

Poiché Windows Azure Management Libraries e grazie a @GuaravMantri rispondono a un’altra domanda, puoi farlo in questo modo:

 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; } } } 

Un modo semplice per risolvere questo problema è impostare nelle tue istanze una chiave per identificare l’ambiente in cui è in esecuzione.

1) Impostare nello slot di produzione: impostarlo Impostazioni >> Impostazioni applicazione >> Impostazioni app E creare una chiave denominata SLOT_NAME e il valore “produzione”. IMPORTANTE: verificare l’impostazione dello slot.

2) Imposta nello slot di gestione temporanea: Impostalo Impostazioni >> Impostazioni applicazione >> Impostazioni app E crea una chiave denominata SLOT_NAME e il valore “staging”. IMPORTANTE: verificare l’impostazione dello slot.

Accedi dalla tua applicazione alla variabile e identifica l’ambiente in cui l’applicazione è in esecuzione. In Java è ansible accedere a:

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

Qui ci sono 4 punti da considerare

  1. Lo scambio VIP ha senso solo quando il tuo servizio è rivolto verso il mondo esterno. AKA, quando espone un’API e reagisce alle richieste.
  2. Se tutto il tuo servizio esegue i messaggi da una coda e li elabora, allora i tuoi servizi sono proattivi e lo scambio VIP non è una buona soluzione per te.
  3. Se il tuo servizio è sia reattivo che proattivo, potresti voler riconsiderare il tuo design. Forse dividi il servizio in 2 diversi servizi.
  4. Il suggerimento di Eric di modificare i file cscfg pre e post-VIP swap è buono se la parte protriggers del tuo servizio può richiedere un breve periodo di inattività (perché prima devi configurare Staging e Production per non estrarre i messaggi, quindi eseguire lo scambio VIP, quindi aggiorna la configurazione di produzione per iniziare a tirare i messaggi).