microsoft - porta azure
¿Instancia de producción o producción? (6)
¿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.
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
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();
}
}
Aquí hay 4 puntos para considerar
- El intercambio VIP solo tiene sentido cuando su servicio se enfrenta al mundo exterior. AKA, cuando expone una API y reacciona a las solicitudes.
- 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.
- Si su servicio es reactivo y proactivo, es posible que desee reconsiderar su diseño. Quizás dividir el servicio en 2 servicios diferentes.
- 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).
Dado que las bibliotecas de administración de Windows Azure y gracias a @GuaravMantri answer 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 = "<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;
}
}
}
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.
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 compilación. Tengo un pequeño comando xcopy que ocurre durante cada compilació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 objetivos de compilació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-NET-solution
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");