Azure Directory Lucene en Azure


La librería de indexación de Lucene.NET; esta también disponible para Azure. En el siguiente link: http://code.msdn.microsoft.com/Azure-Library-for-83562538
Este paquete ofrece la clase AzureDirectory que implementa un LuceneDirectory. Esta clase permite persistir los datos del índice generados en el blog storage de Azure. Para usarlo de la manera más simple indicamos nuestra cuenta de Blog Storage y Contenedor donde almacenaremos el índice. El contenedor se crea si no existe.

Uso

Para usarla, están fácil como indicar el cloudstorage y el contenedor:

AzureDirectory azureDirectory = new AzureDirectory(cloudStorageAccount, nameContainer);
IndexSearcher searcher = new IndexSearcher(azureDirectory);

Internamente el AzureDirectory trabaja con un directorio de la maquina y este se sincroniza con el Blog Storage. La ruta por defecto es “D:\Windows\Temp\AzureDirectory\{nameContainer}”.

Esquema Azure Directory Lucene

Es decir por defecto utiliza el directorio temporal; aunque podemos forzar otro directorio.

AzureDirectory azureDirectory = new AzureDirectory(cloudStorageAccount, nameContainer, FSDirectory.GetDirectory(@"e:\Lucene"));

IndexSearcher searcher = new IndexSearcher(azureDirectory);

A partir de aquí el uso es el normal de la api de Lucene.

Problemas de Deploy en Azure

En Azure el proyecto de Web Role se configura en IIS con el Identity Network Service. Este no tiene privilegios para acceder al directorio local donde se apoya el AzureDirectory; con lo que al acceder al sistema de ficheros causará una Excepción.
Las posibles vías de solución son:

  • Escalando privilegios; de esta manera podremos acceder al sistema de archivos. De varias formas:
    • Habilitando la impersonación de la aplicación en el web.config con un usuario que tenga derechos.
    • Configurando el IIS con un modo con más privilegios, como Local System.

    Pero es una práctica desaconsejada ya que elevamos los privilegios de la aplicación; y hace nuestra aplicación más vulnerable a ataques.

  • Trabajar en memoria con RAMDirectory. No factible para indices de gran tamaño.
  • Habilitar privilegios al directorio.

Habilitando privilegios al directorio local de AzureDirectory Lucene

Podemos dar los privilegios al directorio especifico para nuestra aplicación. La unica manera en la que tenemos derechos para asignar derechos es al arrancar el WebRole; ya sea mediante un comando o WebRole Start.
En nuestro caso optamos por la segunda opción

public class WebRole: RoleEntryPoint
{
  public override bool OnStart()
  {
            var lucenePath = System.IO.Path.Combine(Path.GetTempPath(), "AzureDirectory");
            var dirInfo = new DirectoryInfo(lucenePath);
            if (!dirInfo.Exists)
                 dirInfo.Create();
            var dirSecurity = dirInfo.GetAccessControl();
            var fileSystemAccessRule = new FileSystemAccessRule("NETWORK SERVICE", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow);
            dirSecurity.AddAccessRule(fileSystemAccessRule);
            dirInfo.SetAccessControl(dirSecurity);
				return base.OnStart();
  }
}

Nota:Es importante recordar, hay que ejecutar en contexto elevado para poder tener derechos para asignar los permisos.

  <WebRole name="WebApplication2" vmsize="ExtraSmall">
     <Runtime executionContext="elevated" />
  </WebRole>
Anuncios
Esta entrada fue publicada en Azure, Lucene y etiquetada , , . Guarda el enlace permanente.

Una respuesta a Azure Directory Lucene en Azure

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s