Python en Windows Azure

Windows Azure es una plataforma interoperable. Soporta múltiples protocolos de internet y permite a los desarrolladores utilizar diferentes lenguajes de programación convirtiéndose en una de las plataformas más abiertas del mercado. Además de .NET, PHP, Ruby o Java, entre estos lenguajes, se encuentra Python.

En este artículo veremos qué debemos hacer para poder ejecutar código en Python sobre Windows Azure.

Preparando la instalación de Python en Azure

El entorno de alojamiento y ejecución de Windows Azure no tiene Python instalado por defecto, de modo que tenemos que preparar un script que será lanzado automáticamente al iniciarse el WebRole y que instalará Python en el entorno.

Empezaremos por ir a la página de Python y descargar el instalador para Windows AMD64, en este caso Python 2.7.1 Windows X86-64 Installer. Obtendremos un archivo .msi llamado “python-2.7.1.amd64.msi” que será el que utilicemos para la instalación.

El siguiente paso es generar el script que lanzará el proceso de instalación, le llamaremos “installPython.cmd”. El script es el siguiente:

cd /d "%~dp0"

setlocal enableextensions enabledelayedexpansion

powershell -c "set-executionpolicy unrestricted"

set PYTHONPATH=%SYSTEMDRIVE%\python27

msiexec /i python-2.7.1.amd64.msi /qn TARGETDIR="!PYTHONPATH!" /log installPython.log

exit /b 0

El script nos sitúa en la carpeta donde tenemos los ficheros de nuestra solución y se encuentran los archivos de instalación. Después cambiamos la política de ejecución dando permisos sin restricciones y elegimos la ruta de instalación (%SYSTEMDRIVE%\python27).Por último, utilizando el comando msiexec, lanzaremos el instalador en modo silencioso con el parámetro /qn y guardaremos el resultado en un log (installPython.log).

Hola Python

Cuando acabemos el proceso, para comprobar que todo funcione correctamente, vamos a crear un archivo .py que será nuestro “Hola mundo” en Python y los subiremos y ejecutaremos en Azure.

print( 'Content-type: text/html' )

print('')

print( '<HTML><HEAD><TITLE>Ejemplo de Python CGI</TITLE></HEAD>' )

print( '<BODY>' )

print( '<H1>Hola Python</H1>' )

print( 'Python funcionando en Windows Azure' )

print( '<br>' )

print( '</BODY>' )

print( '</HTML>' )

A este fichero lo llamaremos “holaMundo.py”, es un script muy sencillo que se encargará de mostrar una página HTML para que sea visualizada accediendo a Windows Azure desde el navegador.

Creando un proyecto para Python

Ahora que tenemos python instalado en Windows Azure y un pequeño script para probar que funciona, vamos a crear un proyecto en Visual Studio para subir los ficheros, iniciar los scripts y configurar el IIS.

Abriremos Visual Studio 2010 y seleccionaremos un nuevo proyecto Windows Azure. En él añadiremos un nuevo ASP.NET Web Role y aceptaremos.

Una vez creado, debemos añadir una serie de nuevos elementos existentes al proyecto: el archivo de instalación “python-2.7.1.amd64.msi”, el script “installPython.cmd” y nuestro código en Python “holaMundo.py”. En las propiedades de estos ficheros hay que seleccionar que siempre se copie el fichero en el directorio de salida.

image

Configurando nuestro Web Role

Lo siguiente es hacer que nuestro Web Role se encargue de instalar Python y configure todo lo necesario para que cuando accedamos a éste se ejecute nuestro “holaMundo.py” y comprobemos que todo funciona correctamente.

Lo primero que vamos a hacer es editar el “Web.config” del Web Role para añadir a nuestro sitio web un documento por defecto que será “holaMundo.py”, de esta forma será nuestra página de inicio y cada vez que accedamos se nos redirigirá a este archivo.

A parte tendremos que crear un Handler. Este Handler creará una regla para que cada vez que se acceda a un archivo .py sea un determinado script el encargado de interpretar ese archivo. El script será "%SYSTEMDRIVE%\python27\python.exe %s %s" logrando de esta forma que los ficheros .py los ejecute “python.exe” devolviendo el resultado de salida.

<system.webServer>

<modules runAllManagedModulesForAllRequests="true" />

<defaultDocument enabled="true">

<files>

<clear />

<add value="holaMundo.py" />

</files>

</defaultDocument>

<handlers>

<add name="Python" path="*.py" verb="*" modules="CgiModule" scriptProcessor="%SYSTEMDRIVE%\python27\python.exe %s %s" resourceType="Unspecified" requireAccess="Script" />

</handlers>

</system.webServer>

Para que este Handler funcione correctamente debemos añadir la ruta del script a la lista de restricciones de ISAPI y CGI y permitir su ejecución. Esta lista se configura desde el “applicationHost.config” y para ello crearemos un script para editar ese fichero. Lo haremos mediante appcmd, que es el comando que se utiliza para editar los ficheros de configuración. Lo primero que hará ese script será borrarlo de la lista de restricciones, después lo añadirá y por ultimo le pondrá el atributo allowed a verdadero.

setlocal enableextensions enabledelayedexpansion

set appcmd="%windir%\system32\inetsrv\appcmd"

%appcmd% set config -section:isapiCgiRestriction /-[path='"%%SYSTEMDRIVE%%\python27\python.exe %%s %%s"'] /commit:apphost

%appcmd% set config -section:isapiCgiRestriction /+[path='"%%SYSTEMDRIVE%%\python27\python.exe %%s %%s"'] /commit:apphost

%appcmd% set config -section:isapiCgiRestriction /[path='"%%SYSTEMDRIVE%%\python27\python.exe %%s %%s"'].allowed:true /commit:apphost

exit /b 0

Lo llamaremos configSecurity.cmd y tendremos que hacer el mismo procedimiento que para el otro script (añadirlo al proyecto y hacer que se copie siempre en el directorio de salida).

Lanzando scripts con Startup Task

Para acabar con la configuración del Web Role debemos añadir dos Startup Task que se encargarán de lanzar los dos scripts que hemos realizado. Estas Startup Task son tareas que se ejecutan al iniciar el Web Role con lo que tenemos la opción de crear scripts para que sean lanzados al inicio desde éstas.

Tendremos 2 tareas, una por cada script. Estos scripts tienen que ser ejecutados con permisos elevados y el tipo de tarea será simple. Los Startup Task se configuran desde el archivo “ServiceDefinition.csdef”.

<Startup>

<Task commandLine="installPython.cmd" executionContext="elevated" taskType="simple" />

<Task commandLine="configSecurity.cmd" executionContext="elevated" taskType="simple" />

</Startup>

 

¡Python en Windows Azure!

Ya tenemos todo listo y preparado para publicar en Windows Azure y probar nuestro primer proyecto Python. Una vez publicado accederemos a la url de nuestro Web Role y veremos la página web que ha sido creada desde el archivo .py.

image

 

Referencias

Cómo obtener una cuenta para Windows Azure https://msdn.microsoft.com/es-es/windowsazure/ee834806

Descarga de Visual Studio 2010 Express https://www.microsoft.com/express/downloads/

Windows Azure SDK https://www.microsoft.com/windowsazure/sdk/

Más información en el Centro de desarrollo de la Plataforma Windows Azure https://msdn.microsoft.com/es-ES/windowsazure/default.aspx

Página de descargas de Python https://www.python.org/download/

 

Un saludo,

José Vicente Perona

Equipo MSDN España