Crear Cloud Service desde Azure PowerShell automaticamente


En la entrega pasada se vio como crear y publicar un Cloud Service, pero muchas veces esto no es práctico ni funcional, lo que se necesita en el mundo real son sistemas automatizados que generen mil cosas por detrás para entregarnos un resultado, como es el caso de una compra por Internet con tarjeta de crédito, también el proceso de autenticación en un sitio web, en fin…

Así que sin más preámbulos esta entrada expondrá el típico caso de una empresa que permite hacer páginas web para clientes que pagan algún dinero, en este caso nos basaremos desde el ejemplo anterior pero esta vez será explicado en detalle y con imágenes.

Configurando y preparando el escenario

En Microsoft Azure o en algún entorno de virtualización preferido crear una máquina virtual con Windows Server 2012 R2 Datacenter

Configurar dicha máquina, para el caso de Microsoft Azure escoger la fecha de la versión de Windows, Nombre, Capa, Tamaño Nombre de usuario y una contraseña

Para seleccionar la ubicación de esta máquina virtual usar http://azureping.info/ para poder determinar según un promedio de ping’s cual es la ubicación más recomendada, en mi caso la mejor es Centro y norte de EE.UU. , seleccionar el servicio en la nube, determinar el DNS, junto con las demás opciones que salgan y por último lo más importante es habilitar el puerto de conexión para PowerShell que es el 5986

En el siguiente paso que nos proporciona Azure es seleccionar los agentes y/o extensiones que se necesitan, para este caso seleccionar el agente de Máquina Virtual y la extensión de seguridad Deep Security de Trend Micro

Esperar un momento, dependiendo de las configuraciones que se le dio puede tardar aproximadamente 10-15 minutos en crearse, esto lo podemos checkear en el apartado que dice “Estado”

Para conectarse a la máquina solo basta con hacer click en el botón que dice “Conectar” que está ubicado en la barra inferior, aparecerá un mensaje y se descargará un archivo para conectarnos.

 

Cuando abrimos este archivo aparecerá una ventana de login, aquí poner las credenciales con las que se hizo la máquina virtual.

Cuando se haga la conexión exitosa y termine de configurar todo por primera vez veremos una vista algo parecido a la siguiente imagen.

Windows Azure SDK for Node.js

En Internet Explorer ingresar a la URL http://go.microsoft.com/fwlink/?linkid=254279&clcid=0x409 y descargar el archivo que nos proporciona, al abrirlo veremos algo parecido a lo siguiente

Y simplemente darle click al botón de “Install” para que nos instale todos los paquetes requeridos.

Cuando termine de instalar todo podemos verificar en las apps instalas, para ello entraremos a Inicio, desplegaremos todas las aplicaciones con la flecha que aparece en el botón inferior izquierdo y filtraremos por “Date installed” y anclaremos este al inicio, posteriormente siempre ejecutarlo como administrador.

Cuando se ejecute debemos ver una imagen como la siguiente, posteriormente debemos volver a instalar Node.js desde http://nodejs.org/download/ para evitar errores inesperados, dado que la versión que instala el SDK por lo general causa conflictos.

 

Creación del proyecto Azure

Para quitarnos algunas restricciones que tienen las políticas de seguridad de Windows Server y todo funcione

PS C:\> npm config set strict-ssl false

Verificar que se está en la ruta “C:\” y crear un directorio llamado “node” (mkdir node), navegar al directorio creado que es donde se almacenarán los proyectos de Node.js y escribir

PS C:\node> New-AzureServiceProject expressapp

PS C:\Node\expressapp>Add-AzureNodeWebRole

PS C:\Node\expressapp>Set-AzureServiceProjectRole WebRole1 node 0.10.21

Lo que está haciendo es crear un servicio de azure llamado “expressapp” en este agregar un rol de ejecución de Node.js y finalmente ponerle el nombre del rol junto con la versión de Node.js

Express.js & Node.js

Instalar Express-Generator para crear una plantilla básica de manera global

PS C:\node\expressapp> npm install express-generator -g

Navegar al directorio del rol creado anteriormente y crear el proyecto

PS C:\node\expressapp\WebRole1> express

Instalar las dependencias necesarias

PS C:\node\expressapp\WebRole1> npm install

Para no depender de npm para la ejecución del recién creado proyecto se hace un pequeño hack copiando el archivo de ejecución y haciéndole unas modificaciones, lo primero

PS C:\node\expressapp\WebRole1> copy bin/www server.js

En algún editor de texto modificar el archivo “server.js” modificando la siguiente línea

var app =require('../app');

Para que quede

var app =require('./app');

Comprobamos que haya quedado bien la aplicación ejecuntando el emulador de Azure de la siguiente manera

PS C:\node\expressapp\WebRole1>Start-AzureEmulator-launch

Modificando la vista

Si todo ha salido bien como se esperaba modificar el index de la aplicación que está en el directorio “views/index.jade”, abrir este archivo en un editor de texto de nuestra preferencia

extends layout

block content

h1= title

p Welcome to #{title} in Microsoft Azure

Si no se ha cerrado el emulador de Azure solo basta con refrescar la página para ver los cambios.

Publicación

Lo primero que hay que hacer es obtener los permisos de publicación, si se está en Windows Server 2012 R2 se debe acceder al “Server Manager” donde se encontrará “Local Server”, aquí ubicar “IE Enhanced Security Improvement Program” y ponerlo en “Off”; lo que esto hace es que podamos ingresar a cualquier página web o descargar archivos sin restricciones a grandes rasgos.

Ahora si en PowerShell escribir para que se nos abra una ventana en el navegador en el que se podrá seleccionar la suscripción que deseemos para publicar.

PS C:\node\expressapp\WebRole1> Get-AzurePublishSettingsFile

Guardar este archivo que se descarga en la ruta que se desee y que sea segura.

PS C:\node\expressapp\WebRole1> Import-AzurePublishSettingsFile <ruta del archivo que descargo>

Preferible, en este paso eliminar el archivo.

Para ver el nombre de la suscripción  debemos escribir el siguiente código

PS C:\node\expressapp\WebRole1> Get-AzureSubscription

Seleccionar la suscripción con el siguiente código y escribirlo a continuación

PS C:\node\expressapp\WebRole1> Select-AzureSubscription

Por último publicarlo con las configuraciones que se desee, para este caso quedaría así

PS C:\node\expressapp\WebRole1> Publish-AzureServiceProject-ServiceName myexpressapp -Location"East US"-Launch

Cuando se haya terminado el proceso se puede verificar en los mensajes que puso el comando en la consola.

Ahora para finalizar abrir la suscripción de Microsoft Azure donde se publicó y corroborar.

Habilitar el acceso remoto

Para habilitar el acceso remoto escribir el siguiente código en el mismo directorio del proyecto

PS C:\node\expressapp\WebRole1> Enable-AzureServiceProjectRemoteDesktop

Y actualizar el servicio pero este por lo general dura un poco más de tiempo

PS C:\node\expressapp\WebRole1> Publish-AzureServiceProject

Automatizando el proceso

Ir a Documentos, crear una carpeta llamada “Scripts” y crear el esqueleto de nuestro primer acercamiento a la automatización, en este caso en algún editor de texto escribir el siguiente código, el cual hará automaticamente tooodo lo que se hizo anteriormente.

param([string]$name)
cd c:\node\
npm config set strict-ssl false
New-AzureServiceProject $name
Add-AzureNodeWebRole
Set-AzureServiceProjectRole WebRole1 node 0.10.21
npm install express-generator -g
cd WebRole1
express expr
cd expr
npm install
cd ../
copy expr/bin/www server.js
Set-Content -path c:\node\$name\WebRole1\server.js -value "#!/usr/bin/env node
//var debug = require('./expr/debug')('WebRole1');
var app = require('./expr/app.js');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  //debug('Express server listening on port ' + server.address().port);
});"
Start-AzureEmulator -launch

Sin embargo este código irá cambiando a lo largo de esta entrada y se podrá ejecutar de la siguiente manera.

cd C:\Users\thEpisode\Documents\Scripts
.\Create.ps1 –name something

Publicación automática

Para completar todas las operaciones faltantes se modificará el script recién creado a este código

param(
	[string]$Name,
	[Parameter(Mandatory=$false)]
	[switch]$Publish,
	[Parameter(Mandatory=$false)]
	[switch]$GetAzureCredentials,
	[Parameter(Mandatory=$false)]
	[switch]$PathCredentials
)
if($GetAzureCredentials){
	Get-AzurePublishSettingsFile
	echo "guarde ese archivo en una carpeta segura"
	Exit
}

cd c:\node\
npm config set strict-ssl false
New-AzureServiceProject $name
Add-AzureNodeWebRole
Set-AzureServiceProjectRole WebRole1 node 0.10.21
npm install express-generator -g
cd WebRole1
express expr
cd expr
npm install
cd ../
copy expr/bin/www server.js
Set-Content -path c:\node\$name\WebRole1\server.js -value "#!/usr/bin/env node
var debug = require('./expr/node_modules/debug')('../../WebRole1');
var app = require('./expr/app.js');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});"
if ( $publish  ) {
    Import-AzurePublishSettingsFile $PathCredentials
    Select-AzureSubscription BizSpark
    Publish-AzureServiceProject -ServiceName $name -Location "East US" -Launch
}
else{
    Start-AzureEmulator -launch
}

En base al script anterior podemos tener las siguientes funcionalidades

Obtener credenciales

Cd C:\Users\thEpisode\Documents\Scripts
.\Create.ps1 -GetAzureCredentials

Creación y publicación

cd C:\Users\thEpisode\Documents\Scripts
.\Create.ps1 –Name somethingName –publish –PathCredentials C:\Users\thEpisode\Documents\Scripts\Credentials\BizSpark-6-16-2014-credentials.publishsettings

Finalmente, ya solo nos queda tener imaginación y continuar con el proceso, por el momento queda  lista una parte del backend.